Redis底层数据结构之压缩列表

文章参考:《Redis 设计与实现》黄建宏

压缩列表

压缩列表 ziplist 是列表键和哈希键的底层实现之一。当一个列表键只包含少量列表项,并且每个列表项要么就是小整数值,要么就是长度比较短的字符串, 那么Redis 就会使用压缩列表当列表键的底层实现。

例如:

redis> RPUSH lst 1 3 5 10086 "hello" "world"
(integer)6

redis> OBJECT ENCODING lst
"ziplist"

列表键里面包含的都是1、3、5、10086 这样的小整数值以及 “hello”, “world” 这样的短字符串

压缩列表的构成

压缩列表是 Redis 为了节约内存而开发的,是由一系列特殊编码的连续内存块组成的顺序数据结构。一个压缩列表可以包含多个 entry, 每个 entry 可以保存一个字节数组或者一个整数值

image-20210705203008310

例如一个包含3个节点的压缩列表

在这里插入图片描述

  • zlbytes = 0x50, 表示压缩列表总长为 80 字节( 0x50(16进制) = 80(10进制) )
  • zltail = 0x3c(60), 表示如果我们有一个指向压缩列表起始地址的指针p,那么p+60就可以计算出表尾节点 entry3 的地址
  • zllen = 0x3(3), 表示压缩列表包含3个节点

entry 的构成

在这里插入图片描述

  • Previous_entry_length 记录了压缩列表前一个字节的长度,所以程序可以根据指针运算,计算出前一个节点的起始地址
  • encoding 记录了 content 保存的数据类型和长度
  • content 负责保存节点的值,可以是一个字节数组或者整数
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值