学习
分享
Learning: Redis DataStructure
输入“/”快速插入内容
Learning: Redis DataStructure
飞书用户409
6月12日修改
String
Sds, simple dynamic string, 柔性数组
Hash
桶数组+溢出链表(链地址法(数组+链表))
链表的一个item就是一个kv
负载因子:元素个数 / 桶数,>=5时扩容,<0.1时缩容
渐进式rehash:维护两个hash表,旧hash表负载因子过大过小时,对桶数组扩缩容,减少溢出元素的数量。渐进式是指一次只迁移一条溢出链表。rehash时,写操作写新表。
Set
元素数量小于512,且value是int时,是IntSet
a.
intset用数组存,元素有序,查找用二分查找,插入时,需要扩容数组
元素数量大于512时,是hashMap
Zset
元素数量小于128,且每个元素小于
64字节,
是ziplist
a.
也是用数组存的,由于元素的大小不定,所有每个元素会存当前元素的大小和前一个元素的大小,也便于进行正向和反向遍历。
b.
由于是数组,每次插入删除会触发re-alloc加拷贝,所以数据量不能太大。
元素数量大于128, 是dict + skiplist
a.
dict存value -> score
b.
skiplist存 value 顺序
i.
skiplist就是在普通链表的基础上,增加层次化的索引,比如每隔几个元素建一个索引
List
双向链表存
元素数量小于512,且每个元素小于
64字节,
是ziplist
否则是quicklist,也就是双端链表加ziplist,链表的每个节点是一个ziplist
HyperLogLog
用来进行基数计数,比如在线人数之类的。
BloomFilter
布隆过滤器,在的话不一定在,但是不在一定不在,去重用。