Redis系列第1篇简介
简介
Redis是一款开源的key-value的存储系统,支持string、list、set、zset、hash等多种数据类型。支持push、pop、add、remove的方式来进行草欸,并且这些操作是原子性的。Redis支持各种不同方式的排序。未来保证效率,数据都是存储在内存中。Redis会周期性的将更新的数据写入到磁盘或把修改的数据追加到记录文件中,并且实现了主从同步
应用场景
1.配合关系型数据库做高速缓存
- 高频词、热门访问的数据、降低数据库的IO
- 分布式架构、做Session共享
2.多样的数据结构存储持久化数据
- 最新的N条数据,可以使用List按照自然时间排序的数据
- 排行榜,利用Zset的特性
- 时效性数据、例如验证码,使用Expire过期
- 计时器、秒杀,原子性、自增方法INCR、DECR
- 去除大量数据中的重复数据,利用Set集合
- 构建队列,利用List集合
- 发布订阅消息系统,利用pub/sub模式
相关技术
Redis使用的是单线程加多路IO复用技术。多路复用是指使用一个线程来检查多个文件描述符(Socker)的就绪状态,比如调用select和poll函数,传入多个文件描述符,如果有一个文件描述符就绪,则返回,否则阻塞队列直到超时。得到就绪状态之后进行的真正操作可以在同一进程里执行,也可以启动线程执行,例如使用线程池。与Memcache不同的是支持多种数据类型,支持持久化,单线程加多路IO复用
数据类型
字符串
1.String是Redis最基本的数据类型,对应的是一个key加一个value
2.String类型是二进制安全的,意味着Redis的string可以包含任何数据,比如jpg图片或者序列号的对象
3.一个Redis中字符串最多可以是512M
String数据结构为简单动态字符串,是可以修改字符串的,内部结构类似于ArrayList,采用预分配冗余空间的方式减少内存的频繁分配
列表
列表List是一种单键多值的字符串列表,按照插入的顺序排序。可以添加一个元素到列表的头部或者尾部。底层是双向链表,对两端的操作性能很高,通过索引下标操作中间的节点性能会较差
数据结构
1.List数据结构为快速链表quickList
2.首先在列元素较少的情况下会使用连续的内存存储,这个结构是ziplist(压缩列表)。它将所有元素紧挨着一起存储,分配的是一块连续的内存
3.当数据比较多的时候才会改成quickList。因为普通的链表需要附加的指针空间太大,会比较浪费空间
4.Redis将链表和ziplist结合起来组成了quickList,也就是将多个ziplist使用双向指针串起来使用。这样既满足了快速插入的性能,也不会出现太多的空间冗余
集合
1.Redis中的Set集合对外提供的功能与list类似,是一个列表的功能,特殊之处在于set是可以自动排序的,当需要存储一个列表数据,并且不希望出现重复数据的时候,可以选择Set。Set提供了判断某个成员是否在Set集合中的功能
2.Redis的Set是string类型的无需集合,底层是value为nul的hash表,添加、查找、删除的时间复杂的都是O(1)
3.优点是随着数据量的增加,查找的时间不会发生变化
数据结构
1.Set的数据结构是dict字典,字典是使用哈希表来实现的
2.内部是使用hash结构,所有的value都指向同一个值
哈希
1.Redis中的Hash是一个键值对集合
2.是一个string类型的field和value的映射表,特别时候存储对象
3.类似于Java中的Map<key,value>
3.如果采用key(用户ID)+field(属性标签)的业务中,可以操作对应的属性数据,既不需要重复存储数据,也不会带来序列化和并发修改控制的问题
数据结构
采用的数据结构是两种,一种是ziplist,一种是hashtable。当field-value长度较短且个数较少的时候,使用ziplist否则使用hashtable
有序集合
1.Redis中有序集合zset与普通set是非常相似的,是没有重复元素的字符串集合
2.不同之处是有序集合关联了一个评分(score),这个评分是被用来按照从最低分到最高分的方式排序集合中的元素,集合的成员是唯一的,但评分是可以重复的
3.元素是有序的,所以可以根据评分或者次序来获取一个范围的元素
4.访问有序集合的中间元素也是非常快的,因为可以使用有序集合作为一个没有重复的智能列表
数据结构
zset是Redis中提供的一种特别的数据结构,一方面等价于Map,另一方面类似于TreeSet,内部的元素会按照权重进行排序,可以得到每个元素的名词,还可以通过score的范围获取元素的列表。底层使用了两种数据结构。一种是使用了hash表,hash表的作用是关联value和权重score,保障元素value的唯一性,可以通过元素value来获取相应的score值。另一种是使用了跳跃表,跳跃表的目的在于给元素的value排序,根据score的范围获取元素列表
Bitmaps
Redis中提供的Bitmaps这种数据类型,目的是实现对位的操作
1.Bitmaps本身不是一种数据类型,实际上是字符串(key-value),但它可以实现对字符串的位进行操作
2.Bitmaps单独提供了一套命令,在Redis中使用Bitmaps和使用字符串的方式是不同的。可以将Bitmaps想象成一个以位为单位的数组,数组每单元只能存储0和1,数组下标叫在Bitmaps中叫做偏移量
优点
相较于其他的数据类型,Bitmaps在面对大量用户访问的时候、存储活跃用户之类的需求,可以极大的节省内存空间
HyperLogLog
面对统计方面的需求,例如统计网站PV可以使用Redis中的incr、incrby来实现。但统计UV、独立IP数、搜索记录这类需要去重的操作可以使用Redis提供的HyperLogLog
1.HyperLogLog是用来做基数统计的算法,优点是可以计算2^64个不同元素的基数。
2.HyperLogLog只会根据输入的数据来计算基数、而不会存储元素本身,所以HyperLogLog不能像集合那样返回输入的各个元素
Geospatial
Redis 3.2中提供了对GEO类型的支持。该类型是元素的二维坐标,在地图上对应的是经纬度。基于该类型,提供了经纬度设置、查询、范围查询、距离查询、经纬度Hash等常见操作