Redis 内部编码

2017/7/14 浏览量: - | posted in  Redis comments

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 读写效率下降