源码位置:t_hash.c/server.h
hash 对象底层编码方式有两种,ziplist
或hashtable
。
使用 ziplist 编码需要同时满足以下条件:
- hash 对象保存的键值对的键和值的字符串长度小于 64 字节(可通过 redis.conf 配置:hash_max_ziplist_value)
- hash 对象保存的键值对数小于 512 个(可通过 redis.conf 配置:hash_max_ziplist_entries)
源码位置:t_hash.c/server.h
hash 对象底层编码方式有两种,ziplist
或hashtable
。
使用 ziplist 编码需要同时满足以下条件:
源码位置:t_list.c/server.h
Redis3.2 版本之前,list 对象底层是由 ziplist 和 linkedlist 实现的。3.2 版本之后,底层是由 quicklist 来实现。
源码位置:t_string.c/server.h
字符串是redis中最常用的数据结构,在对象系统object一文中我们提到,字符串数据结构根据场景会有三种编码类型:OBJ_ENCODING_RAW
、OBJ_ENCODING_INT
、OBJ_ENCODING_EMBSTR
,分别对应底层数据结构:sds、int、sds。下面说说这三种编码类型的使用场景。
源码位置:rax.c/rax.h
Redis 5.0版本引入的一个新的数据结构。目前主要用在stream这个数据结构上。Rax是一个有序字典树(基数树),按照key的字典序排列,支持快速定位、查找和删除操作。
源码位置:listpack.c/listpack.h
Redis 5.0版本引入的一个新的数据结构,它是对ziplist压缩列表的改进,listpack结构更为精简,更加节省内存空间。它的实现方式也和ziplist很类似,所以阅读理解起来并不难。也许该数据结构设计出来是要替代ziplist的,只不过ziplist目前在redis中的应用非常广泛,替换起来复杂度很高,所以目前该数据结构只有在新引入的stream数据结构中使用,可能将来有一天会全面替换ziplist。
相对于ziplist,listpack取消了存储前置节点长度的字段,listpack的节点之间是相互独立的,改变前置节点的长度,不会影响到后续节点的长度,所以再也不需要连锁更新操作。
源码位置:object.c/server.h
在之前的文章中,我们介绍了redis底层的数据结构,比如简单动态字符串,双端链表,跳跃表,字典,整数集合,压缩列表,快速列表,基数树,紧凑列表等。