redis底层数据结构之ziplist实现详解

 更新时间:2023年12月12日 09:29:34   作者:bug生产者  
这篇文章主要为大家介绍了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来进行数据压缩可以得到更好的压缩率,但是会造成额外的内存碎片率

以上就是redis底层数据结构之ziplist实现详解的详细内容,更多关于redis底层数据结构ziplist的资料请关注脚本之家其它相关文章!

相关文章

  • 关于redis Key淘汰策略的实现方法

    关于redis Key淘汰策略的实现方法

    下面小编就为大家带来一篇关于redis Key淘汰策略的实现方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-03-03
  • CentOS8.4安装Redis6.2.6的详细过程

    CentOS8.4安装Redis6.2.6的详细过程

    本文给大家介绍CentOS8.4安装Redis6.2.6的详细过程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2021-11-11
  • 详解如何清理Redis内存碎片

    详解如何清理Redis内存碎片

    操作系统的剩余空间总量足够,但申请一块N字节连续地址的空间时,剩余内存空间中没有大小为N字节的连续空间,那么这些剩余内存空间中,小于N字节的连续内存空间就是内存碎片,本文详细介绍了如何清理Redis内存碎片,需要的朋友可以参考一下
    2023-04-04
  • Redis MCP 客户端应用配置的实现示例

    Redis MCP 客户端应用配置的实现示例

    本文详细介绍配置客户端应用使用Redis MCP服务,客户端配置包括自动配置和手动配置两种方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-11-11
  • 深入理解Redis BigKey

    深入理解Redis BigKey

    本文主要介绍了Redis中的BigKey问题及其处理方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-02-02
  • Linux下Redis安装教程详解

    Linux下Redis安装教程详解

    这篇文章主要为大家详细介绍了Linux下Redis安装教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-09-09
  • Redis源码解析sds字符串实现示例

    Redis源码解析sds字符串实现示例

    这篇文章主要为大家介绍了Redis源码解析sds字符串实现示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-08-08
  • 使用Redis实现数据库对象自增ID的方法

    使用Redis实现数据库对象自增ID的方法

    在分布式项目中,数据表的主键ID一般可能存在于UUID或自增ID这两种形式,UUID好理解而且实现起来也最容易,但是缺点就是数据表中的主键ID是32位的字符串,我们通常会优先考虑使用自增ID来代替UUID使用,所以本文介绍了使用Redis实现生成对象自增ID的方法
    2024-11-11
  • ​Redis 实现计数器和限速器的示例代码

    ​Redis 实现计数器和限速器的示例代码

    本文主要介绍了​Redis 实现计数器和限速器的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-02-02
  • Redis限流算法解析与实战教程

    Redis限流算法解析与实战教程

    文章对比了多种限流算法(如固定窗口、滑动窗口、令牌桶、漏桶,并详细介绍了RedisCell的使用方式和使用建议,在工程优化方面,文章提供了多个建议,如使用清理、保持一致性、增强可观测性等等等,同时也给出了一些实战场景和限流策略的黄金法则
    2026-04-04

最新评论