Redis 的五种数据类型内部编码

摘要:redis 的五种数据类型内部编码,每种的数据类型内部都有不同的存储编码,编码的不同将直接影响内存的占用和读写效率。

Redis 的内部编码

redis 常用数据类型有 string、hash、list、set、zset 等五种数据类型,但是每种的数据类型内部都有不同的存储编码。所谓编码就是 redis 内部具体使用那种底层数据结构来实现的。

编码的不同将直接影响内存的占用和读写效率,redis 使用不同的编码对数据的存储有两大好处:

(1)可以改进内部的编码,但是对外部数据的结构没有影响。

(2)不同的内部编码实现,可以在不同的场景发挥各自的优势。

我们可以使用 object encoding key 命令来查看当前数据类型是用什么编码存储的。

127.0.0.1:6379> set k1 v1
OK
127.0.0.1:6379> object encoding k1
"embstr"
127.0.0.1:6379> set k2 100
OK
127.0.0.1:6379> object encoding k2
"int"

比如上面的 k1 和 k2 使用存储不同的内存,redis  内部会采用不同的编码结构,每种数据类型,可以至少采用两种编码方式来实现。


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

int:8 个字节的长整型。

embstr:小于等于 39 个字节的字符串。

raw:大于 39 个字节的字符串。


哈希类型的内部编码有两种

ziplist(压缩列表):当哈希类型元素个数小于 hash-max-ziplist-entries 配置(默认512个)、同时所有值都小于 hash-max-ziplist-value 配置(默认64字节)时,redis 会使用 ziplist 作为哈希的内部实现,ziplist 使用更加紧凑的结构实现多个元素的连续存储,所以在节省内存方面比 hashtable 更加优秀。

hashtable(哈希表):当哈希类型无法满足 ziplist 的条件时,redis 会使用 hashtable 作为哈希的内部实现,因为此时 ziplist 的读写效率会下降,而 hashtable 的读写时间复杂度为 O(1)。

当 field 个数比较少且没有大的 value 时,内部编码为 ziplist,当有 value 大于 64 字节,内部编码会由 ziplist 变为 hashtable,当 field 个数超过 512,内部编码也会由 ziplist 变为 hashtable。


列表类型的内部编码有两种

ziplist(压缩列表):当列表的元素个数小于 list-max-ziplist-entries 配置(默认512个),同时列表中每个元素的值都小于 list-max-ziplist-value 配置时(默认64字节),redis 会选用 ziplist 来作为列表的内部实现来减少内存的使用。

linkedlist(链表):当列表类型无法满足 ziplist 的条件时,redis 会使用 linkedlist 作为列表的内部实现。

(1)当元素个数较少且没有大元素时,内部编码为 ziplist。

(2)当元素个数超过 512 个,内部编码变为 linkedlist。

(3)或者当某个元素超过 64 字节,内部编码也会变为 linkedlist。


集合类型的内部编码有两种

intset(整数集合):当集合中的元素都是整数且元素个数小于 set-max-intset-entries 配置(默认512个)时,Redis会选用intset来作为集合的内部实现,从而减少内存的使用。

hashtable(哈希表):当集合类型无法满足 intset 的条件时,redis 会使用 hashtable 作为集合的内部实现。

(1)当元素个数较少且都为整数时,内部编码为 intset。

(2)当元素个数超过 512 个,内部编码变为 hashtable。

(3)当某个元素不为整数时,内部编码也会变为 hashtable。


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

ziplist(压缩列表):当有序集合的元素个数小于 zset-max-ziplist-entries 配置(默认128个),同时每个元素的值都小于 zset-max-ziplist-value 配置(默认 64 字节)时,redis 会用 ziplist 来作为有序集合的内部实现,ziplist 可以有效减少内存的使用。

skiplist(跳跃表):当 ziplist 条件不满足时,有序集合会使用 skiplist 作为内部实现,因为此时 ziplist 的读写效率会下降。

(1)当元素个数较少且每个元素较小时,内部编码为 skiplist。

(2)当元素个数超过 128 个,内部编码变为 ziplist。

(3)当某个元素大于 64 字节时,内部编码也会变为 hashtable。

结束语:感谢您对本网站文章的浏览,欢迎您的分享和转载,但转载请说明文章出处。
Top