redis中的压缩列表

使用场景:

          为了节约内存空间,在zset和hash容器对象比较少的时候,会采用压缩列表(ziplist)来储存。

使用条件:

  1. 有序集合保存的对象数量小于128个
  2. 有序集合保存的所有元素的成员都小于64字节

压缩列表的数据结构:

    

zltail_offset 表示最一个元素距离压缩列表启始位置的偏移量,是为了能够列表可以进行双向便利,从后往前遍历。比如说倒数第二个的元素就可以拿ztail_offset - 最后一个元素的prevlen的值。

entry的数据结构:

prelen表示前一个entry的字节长度,需要通过这个字段来定位到在一个元素的位置。prelen的长度不是定长的 当前一个entry长度小于254的时候会采用一个字节来表示,当entry长度大于254的时候 就会采用5个字节来表示。

压缩列表只适合小数据量的Hash和zset存储的原因:

1, 设计到更新和删除 都可能造成级联更新。

    因为prelen的长度是一个弹性的值而不是固定值,所以前一个entry的lenth由253变成256的时候 会导致后一个entry的prelen变大 ,从而会引发后续一系列的问题。

2,插入数据的时候可能会导致ziplist重新分配空间,并且会将之前旧的值一次性拷贝到新的内存空间里。

 

redis节约存储空间的方式:

例如

[0f 00 00 00] [0c 00 00 00] [02 00] [00 f3] [02 f6] [ff]
      |                      |                  |          |           |     |
   zlbytes            zltail           zllen     "2"     "5"   end

例如 前4个表示这个压缩队列是 15个字节  zltail 说明最后一个元素的偏移量是12,zllen是2表示存在着2个元素,oo表示前一个元素长度是0  f3 -> 0x11110011 也就是 (0011 - 1)“2” 5同理

如果把5这个元素换成“Hello World” 那么5的这个位置应该是 02 0b (00001011)  48 65 6c 6c 6f 20 57 6f 72 6c 64 (Hello World)

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值