《REDIS》备忘录
本文用于记录 Redis 相关知识,以备查阅。
01 Redis 数据结构Redis 数据类型是其值的数据类型,这些数据类型会使用相应的数据结构来实现,对应关系如下:
Redis 本身使用了哈希表来保存所有的数据,哈希桶存放的是键值对的指针,指针的类型都通过对象结构来解码,里面包含了 type,encoding,ptr 等信息,整个映射过程如下:
SDS:保存为 (len, alloc, flags, buf[]) ,其有以下优点:常量时间复杂度内获取字符串长度,二进制安全,不会发生缓冲区溢出,节省内存空间,另外为了节省空间,使用了 __attribute__ ((packed))
双向链表:实现为具有头节点的双向链表,能够快速获取到头尾节点和链表长度等信息,但是存在无法很好利用 CPU 缓存和在数据较小时,内存开销较大的问题
压缩列表:内存紧凑型的数据结构,占用一块连续的内存空间,不仅可以利用 CPU 缓存,而且会针对不同长度的数据,进行相应编码,节省内存空间。但是其不能保存过多的元素,并且新增或者修改元素时,可能引发连锁更新的问题(通过 prevlen 长度改变造成)
...
Redis 设计与实现笔记
本文章是对《Redis 设计与实现》书籍的一个整理笔记,记录了其中个人认为比较重要的部分。
第二章 简单动态字符串
SDS 定义:
SDS 与 C 字符串的区别:
常数复杂度获取字符串的长度
杜绝缓冲区溢出
减少修改字符串时带来的内存分配的次数,包括空间预分配和惰性空间释放
二进制安全
兼容部分 C 字符串函数
第二章 链表
Redis 的链表实现的特性可以总结如下:
双端
无环
带表头指针和表尾指针
带链表长度计数器
多态:链表节点使用 void*指针来保存节点值,并且可以通过 list 结构的 dup,free,match 三个属性为节点值设置类型特定函数,所以链表可以用于保存各种不同类型的值
第三章 字典
Redis 普通状态下的字典:
哈希算法:首先计算哈希值,然后计算出索引值
Redis 使用的 MurmurHash 算法计算建的哈希值,该算法的优点在于即使输入的键时有规律的,算法仍然能给出一个很好的随机分布性。
解决键冲突:使用链地址法解决键冲突,使用头插法进行插入。
rehash:当负载因子过大的时候,就会开始进行相应的扩展或者收缩 ...