Redis开发与运维之内部编码

Redis开发与运维之内部编码


Redis共有5种数据结构,它们分别是string、hash、list、set、zset,但这些只是Redis对外的数据结构,实际上他们都有自己的内部编码实现,而且是多种实现,Redis会在合适的场景自动选择合适的内部编码。

如何查看内部编码呢?可以通过

object encoding key

命令来查询内部编码。下面让我们分别是看下他们的内部编码机制。

string

字符串类型的内部编码有3种:

  • int : 8个字节的长整形
  • embstr : 小于等于39个字节的字符串
  • raw : 大于39个字节的字符串

Redis会自动根据当前值的类型和长度决定使用哪种内部编码。

hash

哈希类型的内部编码有2种:

  • ziplist(压缩列表): 当哈希类型元素个数小于hash-max-ziplist-entries 配置(默认512个)、同时所有值都小于hash-max-ziplist-value配置(默认64 字节)时,Redis会使用ziplist作为哈希的内部实现,ziplist使用更加紧凑的 结构实现多个元素的连续存储,所以在节省内存方面比hashtable更加优秀。
  • hashtable(哈希表): 当哈希类型无法满足ziplist的条件时,Redis会使 用hashtable作为哈希的内部实现,因为此时ziplist的读写效率会下降,而 hashtable的读写时间复杂度为O(1)。

list

列表类型的内部编码有2种:

  • ziplist(压缩列表):当列表的元素个数小于list-max-ziplist-entries配置 (默认512个),同时列表中每个元素的值都小于list-max-ziplist-value配置时 (默认64字节),Redis会选用ziplist来作为列表的内部实现来减少内存的使 用。
  • linkedlist(链表):当列表类型无法满足ziplist的条件时,Redis会使用 linkedlist作为列表的内部实现。

Redis3.2版本后,提供了quicklist(快速列表)内部编码,它是以一个ziplist为节点的linkedlist,它结合了ziplist和linkedlist两者的优势,为列表类型提供了一种更为优秀的内部编码实现。

set

集合类型的内部编码有2种:

  • intset(整数集合):当集合中的元素都是整数且元素个数小于set-max- intset-entries配置(默认512个)时,Redis会选用intset来作为集合的内部实 现,从而减少内存的使用。
  • hashtable(哈希表):当集合类型无法满足intset的条件时,Redis会使 用hashtable作为集合的内部实现。

zset

有序集合类型的内部编码有2种:

  • ziplist(压缩列表):当有序集合的元素个数小于zset-max-ziplist- entries配置(默认128个),同时每个元素的值都小于zset-max-ziplist-value配 置(默认64字节)时,Redis会用ziplist来作为有序集合的内部实现,ziplist 可以有效减少内存的使用。
  • skiplist(跳跃表):当ziplist条件不满足时,有序集合会使用skiplist作 为内部实现,因为此时ziplist的读写效率会下降。

ok,具体还是需要动手去实践,才能更好的体验每种类型的内部编码。这里只是整理了5种数据结构的内部编码,有机会再详细的了解其内部结构。