string
int: 数值作为redisObject的指针地址。
raw: redisObject + sdshdr,指针指向sdshdr,redisObject里面保存指针。(Simple Dynamic String, SDS),字符串修改时,尽量使用set代替append、setrange,降低预分配带来的内存浪费和内存碎片。
embstr: redisObject + sdshdr一起申请一块连续的内存,适合于短字符串。
hash
ziplist:采用一块连续内存模拟的双向链表,为了均衡内存使用率和性能,不需要每次申请内存,也省去了next指针的空间的内存开销,pre指针的开销并没有省掉。一般要求节点数小于1000吧。
hashtable:和jdk的HashMap类似,但是会有两张hash表,为了防止性能突变,采取渐进式搬移,而不是一次全部切到新表;并且未引入红黑树。
list
ziplist
linkedlist:普通的双向链表。
quicklist:类似于跳表,但是又不完全一样。将ziplist作为双向链表的节点,融合了两者的优点。
set
intset:一块连续的内存,有序整数,并且要求整数的长度一致。
hashtable
zset
ziplist
skiplist:跳表(为什么不使用红黑树,跳表可以更好的范围查询,参考:redis——为什么选择了跳表而不是红黑树?_hebtu666-CSDN博客_跳表和红黑树区别)
redis字典本身也是采用hashtable来存储的,需要扩容、缩容、rehash。
参考:Redis的内部扩容机制 - 简书 (jianshu.com)