压缩链表如果列表键或者哈希键包含的元素比较少,那么会采用压缩列表作为底层实现 。
文章插图
文章插图
entryX的数据结构如下
文章插图
节点的previous_entry_length记录了压缩列表中前一个节 点的长度,节点的encoding属性记录了节点的content属性所保存数据的类型以及长度,节点的content属性负责保存节点的值 。
数据结构和对象Redis对象的结构体定义如下
文章插图
文章插图
而对象具体使用的数据结构可以用OBJECT ENCODING命令获取 。
文章插图
不同类型的对象的编码选择规则如下:
字符串对象
- 如果一个字符串对象保存的是整数值,并且这个整数值可以用 long 类型来表示,那么 字符串对象会将整数值保存在字符串对象结构的 ptr 属性里面
- 如果字符串对象保存的是一个字符串值,并且这个字符串值的长度大于 32 字节,那么 字符串对象将使用一个简单动态字符串 (SDS) 来保存这个字符串值
- 如果字符串对象保存的是一个字符串值,并且这个字符串值的长度小千等于 32 字节,那么字符串对象将使用 embstr 编码的方式来保存这个字符串值 。
文章插图
列表对象当列表对象可以同时满足以下两个条件时,列表对象使用ziplist编码:
- 列表对象保存的所有字符串元素的长度都小千 64 字节;
- 列表对象保存的元素数量小千 512 个;
恰希对象当哈希对象可以同时满足以下两个条件时,哈希对象使用 ziplist 编码:
- 哈希对象保存的所有键值对的键和值的字符串长度都小千 64 字节;
- 哈希对象保存的键值对数量小千 512 个;
集合对象当集合对象可以同时满足以下两个条件时,对象使用 intset 编码: 集合对象保存的所有元素都是整数值;
- 集合对象保存的元素数量不超过 512 个 。
有序集合对象当有序集合对象可以同时满足以下两个条件时,对象使用ziplist编码:
- 有序集合保存的元素数量小于 128 个;
- 有序集合保存的所有元素成员的长度都小于 64 字节;
有序集合对象在维护skiplist的同时,使用了dict,使得能够快速完成成员查询 。
推荐阅读
- 你经常忽略的Redis常见面试题,精选给你整理
- 智能马桶和智能马桶盖选哪个?我都买了,和大家聊聊我的感受
- 如何与不认识的女生聊天 怎样认识自己喜欢的女生
- 探索Redis持久化原理
- 明星|被史皇掌掴的克里斯洛克称:有人出钱才会聊此事
- 读完这篇文章,就基本搞定了Redis数据库
- 彻底理解Redis持久化
- 想尽量用一篇文章尽可能聊透黄山毛峰
- redis各类型数据结构和底层实现源码分析
- 利用openresty+lua+redis 实现封杀频繁恶意访问IP地址