聊一聊Redis之数据结构( 二 )


压缩链表如果列表键或者哈希键包含的元素比较少,那么会采用压缩列表作为底层实现 。
 

聊一聊Redis之数据结构

文章插图
 
 
聊一聊Redis之数据结构

文章插图
 
 
entryX的数据结构如下
 
聊一聊Redis之数据结构

文章插图
 
 
节点的previous_entry_length记录了压缩列表中前一个节 点的长度,节点的encoding属性记录了节点的content属性所保存数据的类型以及长度,节点的content属性负责保存节点的值 。
数据结构和对象Redis对象的结构体定义如下
 
聊一聊Redis之数据结构

文章插图
 
 
聊一聊Redis之数据结构

文章插图
 
 
而对象具体使用的数据结构可以用OBJECT ENCODING命令获取 。
 
聊一聊Redis之数据结构

文章插图
 
 
不同类型的对象的编码选择规则如下:
字符串对象
  • 如果一个字符串对象保存的是整数值,并且这个整数值可以用 long 类型来表示,那么 字符串对象会将整数值保存在字符串对象结构的 ptr 属性里面
  • 如果字符串对象保存的是一个字符串值,并且这个字符串值的长度大于 32 字节,那么 字符串对象将使用一个简单动态字符串 (SDS) 来保存这个字符串值
  • 如果字符串对象保存的是一个字符串值,并且这个字符串值的长度小千等于 32 字节,那么字符串对象将使用 embstr 编码的方式来保存这个字符串值 。
 
聊一聊Redis之数据结构

文章插图
 
 
列表对象当列表对象可以同时满足以下两个条件时,列表对象使用ziplist编码:
  • 列表对象保存的所有字符串元素的长度都小千 64 字节;
  • 列表对象保存的元素数量小千 512 个;
不能满足这两个条件的列表对象需要使用 linkedlist 编码 。
恰希对象当哈希对象可以同时满足以下两个条件时,哈希对象使用 ziplist 编码:
  • 哈希对象保存的所有键值对的键和值的字符串长度都小千 64 字节;
  • 哈希对象保存的键值对数量小千 512 个;
不能满足这两个条件的哈希对象需要使用 hash able 编码 。
集合对象当集合对象可以同时满足以下两个条件时,对象使用 intset 编码: 集合对象保存的所有元素都是整数值;
  • 集合对象保存的元素数量不超过 512 个 。
不能满足这两个条件的集合对象需要使用 hash table 编码 。
有序集合对象当有序集合对象可以同时满足以下两个条件时,对象使用ziplist编码:
  • 有序集合保存的元素数量小于 128 个;
  • 有序集合保存的所有元素成员的长度都小于 64 字节;
不能满足以上两个条件的有序集合对象将使用skiplist编码 。
有序集合对象在维护skiplist的同时,使用了dict,使得能够快速完成成员查询 。




推荐阅读