【redis源码分析】压缩列表---ziplist

压缩列表的结构可以表示为以下:


每个节点的构成:

 


        上面的两个数据结构就可以实现整个压缩链表,其实他就是一个连续内存占用的双向链表,只不过没有以固定的节点大小来表示每个节点,而是以各个节点内部的长度标识了节点的额大小,这样可以更加剩内存,

在实现的过程中,使用了如下的技巧来保证压缩列表的性质:

1根据编码方式的不同, pre_entry_length 域可能占用 1 字节或者 5 字节:

    1 字节:如果前一节点的长度小于 254 字节,便使用一个字节保存它的值。

    5 字节:如果前一节点的长度大于等于 254 字节,那么将第 1 个字节的值设为 254 ,然后用接下来的 4 个字节保存实际长度。

2encoding 和 length 两部分一起决定了 content 部分所保存的数据的类型(以及长度)。

其中, encoding 域的长度为两个 bit , 它的值可以是 00 、 01 、 10 和 11 :

    00 、 01 和 10 表示 content 部分保存着字符数组。

    11 表示 content 部分保存着整数。

以 00 、 01 和 10 开头的字符数组的编码方式如下:

编码

编码长度

content 部分保存的值

00bbbbbb

1 byte

长度小于等于 63 字节的字符数组。

01bbbbbb xxxxxxxx

2 byte

长度小于等于 16383 字节的字符数组。

10____ aaaaaaaa bbbbbbbb cccccccc dddddddd

5 byte

长度小于等于 4294967295 的字符数组。

表格中的下划线 _ 表示留空,而变量 b 、 x 等则代表实际的二进制数据。为了方便阅读,多个字节之间用空格隔开。

11 开头的整数编码如下:

编码

编码长度

content 部分保存的值

11000000

1 byte

int16_t 类型的整数

11010000

1 byte

int32_t 类型的整数

11100000

1 byte

int64_t 类型的整数

11110000

1 byte

24 bit 有符号整数

11111110

1 byte

8 bit 有符号整数

1111xxxx

1 byte

4 bit 无符号整数,介于 0 至 12 之间

        

         可以看出,由于压缩列表的性质,在有些情况下会造成连锁更新的情况,比如,你将一个原本很小的节点进行了update操作,就有可能使这个节点的encoding 和 length字段重新编码,导致长度发生变化,这时对于他后面的节点,就需要更新他的pre_entry_length字段,同样,由于pre_entry_length字段的长度可以用一个字节,也可以用五个字节,所以长度也发生了变化,以此类推,导致后面的节点都需要更新,这就是压缩列表的连锁更新,但是这种更新的机会并不会特别多。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
shiro-redis-spring-boot-starter是一个用于集成Apache Shiro和Redis的Spring Boot Starter项目。Apache Shiro是一个强大而灵活的Java安全框架,用于身份验证、授权和会话管理等安全功能。而Redis是一个高性能的内存数据库,其具有快速的数据存取能力和持久化支持。 shiro-redis-spring-boot-starter提供了一种简化和快速集成Shiro和Redis的方式,使得在Spring Boot应用中实现安全功能变得更加容易。通过使用该Starter,我们可以方便地将Shiro的会话管理功能存储到Redis中,从而支持分布式环境下的会话共享和管理。 使用shiro-redis-spring-boot-starter可以带来以下好处: 1. 分布式环境的会话共享:通过将Shiro的会话数据存储到Redis中,不同的应用节点可以共享同一个会话,从而实现分布式环境下的会话管理和跨节点的身份验证和授权。 2. 高可用性和性能:Redis作为一个高性能的内存数据库,具有出色的数据读写能力和持久化支持,可以提供可靠的会话存储和高性能的数据访问能力。 3. 简化配置和集成:shiro-redis-spring-boot-starter提供了封装好的配置和集成方式,减少了我们自己实现集成的复杂性和工作量。 总结来说,shiro-redis-spring-boot-starter为我们提供了一种简化和快速集成Shiro和Redis的方式,使得在Spring Boot应用中实现安全功能变得更加容易和高效。通过它,我们可以实现分布式环境下的会话共享和管理,提供高可用性和性能的数据存取能力,同时简化了配置和集成的复杂性。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值