String 内部编码
- int:8 个字节的长整型
- embstr:<= 39 个字符的字符串
- raw:> 39 个字符的字符串
Hash 内部编码
- ziplist 压缩列表
当 Hash 元素个数小于 hash-max-ziplist-entries(default 512 个),同时所有值都小于 hash-max-ziplist-value(default 64 字节),选用 ziplist 做为 Hash 内部实现
ziplist 使用更加紧凑的结构实现多个元素连续存在,比 hashtable 节省内存
- hashtable 哈希表
当 Hash 无法满足 ziplist 时,使用 hashtable 作为 Hash 内部实现,因为此时 ziplist 读写效率下降,而 hashtable 的读写时间复杂度为 O(1)
List 内部编码
- ziplist 压缩列表
当 List 元素个数小于 list-max-ziplist-entries(default 512 个),同时列表中每个元素值都小于 list-max-ziplist-value(default 64 字节),选用 ziplist 做为 List 内部实现减少内存使用
- linkedlist 链表
当 List 无法满足 ziplist 条件时,使用 linkedlist 做为内部实现
Redis 3.2 提供 quicklist 内部内部编码,简单说是一个 ziplist 为节点的 linkedlist,结合 ziplist 和 linkedlist 优势,为列表型提供更优秀的编码,设计原理参考 redis-quicklist
SET 内部编码
- intset 整数集合
当集合中元素都是整数且元素个数小于 set-max-intset-entries(default 512个),采用 intset 作为内部实现,减少内存使用
- hashtable 哈希表
当集合类型无法满足 intset ,使用 hashtable 作为集合的内部 实现
ZSET 内部编码
- ziplist 压缩列表
当有序集合的元素个数小于 zset-max-ziplist-entries(default 128个),同时每个元素的值都小于 zset-max-ziplist-value(default 64 字节),会使用 ziplist 作为有序集合内部实现,有效减少内存使用
- skiplist 跳跃表
当 ziplist 不满足条件时,使用 skiplist 作为有序集合内部实现,此时 ziplist 读写效率下降