下面这张表是 3.0 的实现版本,基本都是正确的,除了list的实现现在统一都是quicklist了。
字符串类型
如下图,
- Long 类型存为 int
- 32个字节以下存为 embstr(是为短字符串优化的一种编码方式,只调用一次内存分配,且空间是连续的 )
否则 raw - embstr不可变 对字符串修改后也是 raw
如下图, embstr 是压缩编码,将所有的值都分配在一整块内存中,可以减少内存使用和减少内存碎片。
raw编码通过指针来使结构更加更加灵活,
列表类型
列表对象在老版本时是两种编码方式,压缩列表和双端链表
压缩列表也是将一个对象分配到一整块空间中来节省内存
双端链表
考虑到链表的附加空间相对太高,prev 和 next 指针就要占去 16 个字节 (64bit 系统的指针是 8 个字节),另外每个节点的内存都是单独分配,会加剧内存的碎片化,影响内存管理效率。
后续版本对列表数据结构进行了改造,使用 quicklist 代替了 ziplist 和 linkedlist.
哈希对象
比较大的对象采用hash表来实现,实现方式类似于java里的hashMap,感兴趣的可以详细了解下,主要也是拉链法,但没有用红黑树。对于并发的扩容采用的是写时复制。
集合对象
有序集合对象
压缩列表实现
跳跃表的实现,为了查询效率冗余存储了一个hash表
对于跳跃表感兴趣的可以看看这篇,讲的特别好
https://www.jianshu.com/p/dc252b5efca6
此篇文章主要总结自 redis的设计与实现这本书