Redis基础数据结构
Redis所有的数据结构都是以唯一的字符串key作为名称,不同的数据结构是指value的类型。5中基本数据结构分别是:string、list、set、hash、zset
sting
使用最广泛的数据结构,通常将存储的数据进行序列化成字符塞到Redis中进行缓存。Redis的字符串是动态字符串,采用预分配冗余空间的方式来减少内存的频繁分配。
-
扩容策略:字符串长度小于1m时,扩容是加倍现有的空间。如果长度超过1m时,扩容一次只会过扩展1m的空间。字符串最大的长度为512m。
-
失效机制
-
位图
list
Redis的列表常用做异步队列使用。将需要延后的任务结构体序列化成字符创塞进Redis的列表,另一个进程从这个列表中轮询数据进行处理。
list的底层是链表,意味着插入和删除非常快时间复杂度为O(1)。索引定位较慢,时间复杂度为O(n)。当列表弹出最后一个元素之后,该数据结构被自动删除,内存被回收。
- list的底层存储:首先列表元素较少的情况下会使用一块连续的内存存储,这个结构叫
ziplist,压缩列表。当数据量比较多时才将底层存储改为quicklist。 - 压缩列表
- 快速列表
hash
相当于HashMap,是无序字典。内部实现与java HashMap也是一致,同样的数组+链表的二维结构。这里也有所区别,在java8中HashMap的hash冲突的链表长度超过8时会将将存储结果换成红黑树。此外Redis区别于HashMap:
- 字典的值只能是字符。
- 渐进式rehash策略:Redis在rehash的同时保留连个hash结构,元素查询会同时查询两个结构。然后在后续的hash操作或是定时任务中,循序渐进地将旧hash的内容一点点迁移到新hash结构中。当hash移除最后一个元素后,改结构会被自动删除,内存被回收。
- hash内部探索:
set
相当于HashSet,无序的集合。Set常用作去重功能。
zset
Redis特色的数据结构。一方面是一个set,保证内部value的唯一性。另一方面还可以给每个value赋予一个score,代表value的排序权重。它的实现叫跳跃链表的数据结构,链表按照value的score进行排序的数据结构。
- 跳跃链表:层级制。最底一层是跳表的所有元素。每隔几个元素挑选出一个代表来,再将这几个代表用另一级指针串起来。然后再在这几个代表种每隔几个元素挑选出二级代表串起来,最终形成金字塔结构。跳跃是指,内部的元素可以在不同的层级之间进行「跳跃」。定位插入点时先从顶层进行定位,然后下潜到下一级定位,一直下潜到最底层找到合适的位置。(示意图引用自《Redis 深度历险》小册)

参考: