一文详尽解析Redis的设计原理( 四 )


length属性:存储跳跃表中节点的个数,不包括表头节点 。
level属性:跳跃表中节点level的最大值,不包括表头节点 。

  • 跳跃表中存在表头节点,表头节点一共有32个level,即数组的大小为32 。
遍历zskiplist的流程
1.通过zskiplist访问跳跃表中的头节点 。
2.从下一个节点最高的level开始往下遍历,若下一个节点的最高level超过当前节点的最高level,则从当前节点最高的level开始往下遍历 。
3.当不存在下一个节点时,遍历结束 。
5.Redis对象Redis各个对象支持的编码方式
一文详尽解析Redis的设计原理

文章插图
 
5.1 字符串对象
字符串对象支持INT、EMBSTR、ROW三种编码方式
INT编码方式
如果字符串的值是整数,并且可以使用long来进行表示,那么Redis将会使用INT编码方式 。
一文详尽解析Redis的设计原理

文章插图
 
INT编码方式会将RedisObject中的*ptr指针直接改写成long prt,prt属性直接存储整数值 。
EMBSTR编码方式
如果字符串的值是字符,并且其长度小于32个字节,那么Redis将会使用EMBSTR编码方式 。
一文详尽解析Redis的设计原理

文章插图
 
ROW编码方式
如果字符串的值是字符,并且其长度大于32个字节,那么Redis将会使用ROW编码方式 。
一文详尽解析Redis的设计原理

文章插图
 
 
  • EMBSTR和ROW编码方式在内存中都会创建一个RedisObject和SDS,区别在于EMBSTR编码方式中RedisObject和SDS共同使用同一块内存单元,Redis内存分配器只需要分配一次内存,而ROW编码方式中需要分别为RedisObject和SDS分配内存单元 。
编码转换
如果字符串的值不再是整数或者用long无法进行表示,那么INT编码方式将会转换成ROW编码方式 。
如果字符串的值其长度大于32个字节,那么EMBSTR编码方式将会转换成ROW编码方式 。
  • INT编码方式和EMBSTR编码方式在满足条件的情况下,将会转换成ROW编码方式 。
  • INT编码方式不能转换成embstr编码方式 。
字符串共享对象
Redis在启动时会初始化值为09999的SDS作为共享对象,当set一个Key其Value是在09999范围时,会直接使用该共享对象,DictEntry中的Value指针直接指向该共享SDS对应的RedisObject 。
在集群模式中,Redis的每个节点启动时都会初始化值为0~9999的SDS作为共享对象 。
在RedisV4.0以上,使用Object refcount命令不再返回共享对象实际被引用的次数,而是直接返回Integer.MAX_VALUE 。
一文详尽解析Redis的设计原理

文章插图
 
5.2 列表对象
列表对象支持ZIPLIST、LINKEDLIST两种编码方式
ZIPLIST编码方式
如果列表对象保存的所有元素的长度都小于64个字节同时元素的数量小于512个,那么Redis将会使用ZIPLIST编码方式 。
一文详尽解析Redis的设计原理

文章插图
 
LINKEDLIST编码方式
如果列表对象保存的元素的长度大于64个字节或元素的数量大于512个,那么Redis将会使用LINKEDLIST编码方式 。
一文详尽解析Redis的设计原理

文章插图
 
编码转换
如果列表对象保存的元素的长度大于64个字节或元素的数量大于512个,那么Redis将会使用LINKEDLIST编码方式 。
可以通过list-max-ziplist-value和list-max-ziplist-entries参数调整列表对象ZIPLIST编码方式所允许保存的元素的最大值以及最多可以保存元素的数量 。
5.3 哈希对象
哈希对象支持ZIPLIST和HT两种编码方式 。
ZIPLIST编码方式
如果哈希对象保存的所有键值对的键和值的字符串长度都小于64个字节同时键值对的数量小于512个,那么Redis将会使用ZIPLIST编码方式 。
一文详尽解析Redis的设计原理

文章插图
 
HT编码方式
如果哈希对象保存的键值对的键或值的字符串长度大于64个字节或键值对的数量大于512个,那么Redis将会使用HASHTABLE编码方式 。
一文详尽解析Redis的设计原理

文章插图
 
编码转换
如果哈希对象保存的键值对的键或值的字符串长度大于64个字节或键值对的数量大于512个,那么Redis将会使用HASHTABLE编码方式 。
可以通过hash-max-ziplist-value和hash-max-ziplist-entries参数调整哈希对象ZIPLIST编码方式所允许保存的元素的最大值以及最多可以保存元素的数量 。


推荐阅读