redis底层数据结构之ziplist实现

ziplist实现

注意:我使用的版本是6.0.10,不同版本可能略有差别

ziplist又叫做压缩列表,使用一段连续的内存来存储数据的数据结构,redis为了节约内存而开发的,可以节省内存空间,其并不是以某种压缩算法来进行压缩存储数据,而是表示一组连续的内存空间使用

ziplist结构

<zlbytes> <zltail> <zllen> <entry> <entry> ... <entry> <zlend>
  • zlbytes 32位,4个字节 ziplist总字节数
  • zltail 32位,4个字节 压缩列表表尾距离起始位置有多少字节,通过该偏移量,无需遍历整个列表就可以确定表尾节点的地址
  • zllen 16位,2个字节 记录压缩列表节点数量,由于是16位,最大值为65535,超过的话需要遍历整个ziplist才可以知道
  • entry 存储的各个节点
  • zlend 8位,1个字节 表示ziplist结尾的特殊值
entry的结构
<prevlen> <encoding> <entry-data>
  • prevlen 上一个节点的长度,可以和当前的地址进行指针运算,找到上一个节点的起始地址
  • encoding 内容的编码及长度
  • entry-data 字符串类型的值

由于这个特殊的结构构造,所以压缩列表可以很快的从表尾向表头遍历操作

  • 根据zltail可以直接获取到表尾节点
  • 指针指向表尾节点起始地址的指针,根据prevlen可以直接获取到前一个节点的起始地址的指针
  • 一直向前一个节点遍历,一直到头节点

使用ziplist的数据类型

redis中hash、list、zset使用了ziplist结构存储,但是存在了一些条件

hash-max-ziplist-entries 512
hash-max-ziplist-value 64

# -5: max size: 64 Kb  <-- not recommended for normal workloads
# -4: max size: 32 Kb  <-- not recommended
# -3: max size: 16 Kb  <-- probably not recommended
# -2: max size: 8 Kb   <-- good
# -1: max size: 4 Kb   <-- good
list-max-ziplist-size -2

zset-max-ziplist-entries 128
zset-max-ziplist-value 64

ziplist会比hash、list、zset中使用的底层结构节省内存,存储越小的数据,使用ziplist来进行数据压缩可以得到更好的压缩率,但是会造成额外的内存碎片率

https://zhhll.icu/2021/数据库/非关系型数据库/redis/底层实现/1.ziplist实现/

本文由 mdnice 多平台发布

相关推荐

  1. redis底层数据结构ziplist实现

    2023-12-11 11:32:01       38 阅读
  2. redis底层数据结构skiplist实现

    2023-12-11 11:32:01       45 阅读

最近更新

  1. TCP协议是安全的吗?

    2023-12-11 11:32:01       19 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-11 11:32:01       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-11 11:32:01       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-11 11:32:01       20 阅读

热门阅读

  1. 如何利用jQuery来向一个元素中添加和移除CSS类?

    2023-12-11 11:32:01       37 阅读
  2. JWT的原理

    2023-12-11 11:32:01       28 阅读
  3. 尼科彻斯定理

    2023-12-11 11:32:01       40 阅读
  4. 工业相机与镜头选型方法(含实例)

    2023-12-11 11:32:01       37 阅读
  5. Peter算法小课堂—差分数组

    2023-12-11 11:32:01       37 阅读
  6. 使用python统计字符串中字母个数的函数程序设计

    2023-12-11 11:32:01       47 阅读
  7. 7.1 C++11指针空值—nullptr

    2023-12-11 11:32:01       31 阅读
  8. synchronized和volatile的区别

    2023-12-11 11:32:01       32 阅读
  9. 基于AidLux的工业视觉少样本缺陷检测实战

    2023-12-11 11:32:01       43 阅读
  10. iOS 防截屏方法(一)

    2023-12-11 11:32:01       43 阅读