Redis数据结构的内部编码

21 篇文章 0 订阅

Redis每种数据结构都有自己底层的内部编码实现,而且是多种实现。
如图:

数据结构编码图

目录

字符串

哈希

列表

集合

有序集合


字符串

1.三种编码:
int:8个字节的长整型
embstr:小于等于39个字节的字符串
raw:大于39个字节的字符串
Redis会根据当前值的类型和长度决定使用哪种内部编码实现
2.例子
整数类型示例如下:
set m 6666
object encoding m
短字符串示例如下:
#小于等于39个字节的字符串:embstr
set m "hello"
object encoding m
长字符串示例如下:
#大于39个字节的字符串:raw
set m "Redis is an open source (BSD licensed)..."
object encoding m
strlen m

哈希


1.两种编码:
ziplist(压缩列表):当哈希类型元素个数小于hash-max-ziplist-entries配置(默认512个)、
同时所有值都小于hash-max-ziplist-value配置(默认64字节)时,redis会使用ziplist作为哈希的内部实现,
ziplist使用更加紧凑的结构实现多个元素的连续存储,所以在节省内存方面比hashtable更加优秀。
hashtable(哈希表):当哈希类型无法满足ziplist的条件时,redis会使用hashtable作为哈希的内部实现,
因此此时ziplist的读写效率会下降,而hashtable的读写时间复杂度为O(1)
2.例子
1)当field个数比较少且没有大的value时,内部编码为ziplist
hmset m f1 v1 f2 v2
object encoding m
2.1)当有value大于64字节,内部编码会由ziplist变为hashtable:
 hset m f3 "Redis is an open source (BSD licensed), in-memory data structure store, used as a database..."
 object encoding m
2.2)当field个数超过512,内部编码也会由ziplist变为hashtable:
hmset m f1 .....f513
object encoding m

列表


1.两种编码:
ziplist(压缩列表):当列表的元素个数小于list-max-ziplist-entries配置(512个),同时列表中每个元素的值都小于
list-max-ziplist-value配置(64个),redis会选用ziplist来作为列表的内部实现来减少内存的使用.
linkedlist(链表):当列表类型无法满足ziplist的条件时,redis会使用linkedlist作为列表的内部实现。
2.例子
1)当元素个数较少且没有大元素时,内部编码为ziplist:
rpush m a1 a2 a3
object encoding m
2.1)当元素个数超过512个,内部编码变为linkedlist:
rpush m a1...a513
object encoding m
2.2)或者当某个元素超过64字节,内部编码也会变为linkedlist:
rpush m "Redis is an open source (BSD licensed), in-memory data structure store, used as a database..."
object encoding m
注:Redis3.2版本提供了quicklist内部编码,简单地说它是以一个ziplist为节点的linkedlist,它结合了ziplist和linkedlist两者的优势,为列表类型提供了一
种更为优秀的内部编码实现,它的设计原理可以参考Redis的另一个作者Matt Stancliff的博客:https://matt.sh/redis-quicklist。

集合


1.两种编码:
intset(整数集合):当集合中的元素都是整数且元素个数小于set-max-ziplist-entries配置(512)时,redis会选用intset来作为集合的内部实现,从而减少内存的使用
hashtable(哈希表):当集合类型无法满足intset的条件时,redis会使用hashtable作为集合的内部实现
2.例子:
1)当元素个数较少且都为整数时,内部编码为intset:
sadd m 1 2 3 4
object encoding m
2.1)当元素的个数超过512个,内部编码变为hashtable:
sadd m 1...513
scard setkey
object encoding m
2.2)当某个元素不为整数时,内部编码也会变为hashtable
sadd m a
object encoding m

有序集合


1.两种编码:
ziplist(压缩列表):当有序集合的元素个数小于zset-max-ziplist-entries配置(默认128个),同时每个元素的值都小于zset-max-ziplist-value配置(64个)时,
redis会用ziplist来作为有序集合的内部实现,ziplist可以有效的减少内存的使用.
skiplist(跳跃表):当ziplist条件不满足时,有序集合会使用skiplist作为内部的实现,因为此时ziplist的读写效率会下降.
2.例子:
1)当元素个数较少且每个元素较小shi,内部编码为skiplist:
zadd m 50 a1 60 a2 30 a3
object encoding m
2)当元素个数超过128个,内部编码变为ziplist:
zadd m 50 a1 60 a2 84 a129
object encoding m
2.2)当某个元素大于64字节时,内部编码也会变为hashtable:
zadd m  20 "Redis is an open source (BSD licensed), in-memory data structure store, used as a database..."
object encoding m 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值