Redis Ziplist(压缩列表)

2024-01-19 22:38
文章标签 redis 压缩 列表 ziplist

本文主要是介绍Redis Ziplist(压缩列表),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

简述

ziplist是Redis list、hash、zset的底层实现结构之一,当list、hash、zset中节点数量较少,并且存储的大多节点为小整数型,较短的字符串时,Redis就会使用ziplist作为list、hash、zset的底层实现。

牺牲时间换取空间

拿list来说,实现有双向链表、ziplist。当实现为双向链表时,节点会有pre和next指针,每一个指针占8个字节。而ziplist的entry中,用previous_entry_length保存上一个entry的长度,当上一个entry长度小于等于263字节时,previous_entry_length只占一个字节;大于263字节时,previous_entry_length占5个字节,并且ziplist存储是连续的内存空间,可以做压缩。当设计计算时,ziplist明显会比双向链表的指针检索慢,因此ziplist是牺牲时间换取空间的结构。

结构

在这里插入图片描述

  • zlbytes:记录整个ziplist的大小。
  • zltail:ziplist开始指针与最后一个entry之间的偏移量,通过该偏移量可以获得最后一个entry。
  • zllen:entry数量。
  • entry:存储具体数据的节点。
  • zlend:ziplist结尾标识。

entry

每一个entry由以下三个部分组成。
在这里插入图片描述

  • previous_entry_length:上一个entry的大小。
  • encoding:记录content的类型以及长度。
  • content:一个整形或者字节数组。
    注:
  1. previous_entry_length保存上一个entry的长度,当上一个entry长度小于等于263字节时,previous_entry_length只占一个字节;大于263字节时,previous_entry_length占5个字节。
  2. 可以通过previous_entry_length得到上一个entry,ziplist就是这样实现从尾到头的检索。

ziplist连续更新

假如现在ziplist中每一个entry的大小都是263字节,那么每一个entry的previous_entry_length都只占一个字节。假如此时在ziplist头部插入一个大于263的entry,那么,该entry往后的entry要把previous_entry_length修改为5个字节,而此时修改之后entry长度变为267,那么再下一个entry也要修改previous_entry_length的长度,以此类推。。。
删除节点的时候也会出现连续更新的情况。
虽然,发生连续更新时,ziplist的性能会大大的降低,但是实际情况下,极少会发生连续更新,而且ziplist都是存储少量的节点,哪怕发生一整个ziplist的更新,也不会占用大量时间。

这篇关于Redis Ziplist(压缩列表)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/623926

相关文章

Python如何计算两个不同类型列表的相似度

《Python如何计算两个不同类型列表的相似度》在编程中,经常需要比较两个列表的相似度,尤其是当这两个列表包含不同类型的元素时,下面小编就来讲讲如何使用Python计算两个不同类型列表的相似度吧... 目录摘要引言数字类型相似度欧几里得距离曼哈顿距离字符串类型相似度Levenshtein距离Jaccard相

redis群集简单部署过程

《redis群集简单部署过程》文章介绍了Redis,一个高性能的键值存储系统,其支持多种数据结构和命令,它还讨论了Redis的服务器端架构、数据存储和获取、协议和命令、高可用性方案、缓存机制以及监控和... 目录Redis介绍1. 基本概念2. 服务器端3. 存储和获取数据4. 协议和命令5. 高可用性6.

Python利用PIL进行图片压缩

《Python利用PIL进行图片压缩》有时在发送一些文件如PPT、Word时,由于文件中的图片太大,导致文件也太大,无法发送,所以本文为大家介绍了Python中图片压缩的方法,需要的可以参考下... 有时在发送一些文件如PPT、Word时,由于文件中的图片太大,导致文件也太大,无法发送,所有可以对文件中的图

Redis的数据过期策略和数据淘汰策略

《Redis的数据过期策略和数据淘汰策略》本文主要介绍了Redis的数据过期策略和数据淘汰策略,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录一、数据过期策略1、惰性删除2、定期删除二、数据淘汰策略1、数据淘汰策略概念2、8种数据淘汰策略

Redis存储的列表分页和检索的实现方法

《Redis存储的列表分页和检索的实现方法》在Redis中,列表(List)是一种有序的数据结构,通常用于存储一系列元素,由于列表是有序的,可以通过索引来访问元素,因此可以很方便地实现分页和检索功能,... 目录一、Redis 列表的基本操作二、分页实现三、检索实现3.1 方法 1:客户端过滤3.2 方法

Python中操作Redis的常用方法小结

《Python中操作Redis的常用方法小结》这篇文章主要为大家详细介绍了Python中操作Redis的常用方法,文中的示例代码简洁易懂,具有一定的借鉴价值,有需要的小伙伴可以了解一下... 目录安装Redis开启、关闭Redisredis数据结构redis-cli操作安装redis-py数据库连接和释放增

redis防止短信恶意调用的实现

《redis防止短信恶意调用的实现》本文主要介绍了在场景登录或注册接口中使用短信验证码时遇到的恶意调用问题,并通过使用Redis分布式锁来解决,具有一定的参考价值,感兴趣的可以了解一下... 目录1.场景2.排查3.解决方案3.1 Redis锁实现3.2 方法调用1.场景登录或注册接口中,使用短信验证码场

Redis 多规则限流和防重复提交方案实现小结

《Redis多规则限流和防重复提交方案实现小结》本文主要介绍了Redis多规则限流和防重复提交方案实现小结,包括使用String结构和Zset结构来记录用户IP的访问次数,具有一定的参考价值,感兴趣... 目录一:使用 String 结构记录固定时间段内某用户 IP 访问某接口的次数二:使用 Zset 进行

解读Redis秒杀优化方案(阻塞队列+基于Stream流的消息队列)

《解读Redis秒杀优化方案(阻塞队列+基于Stream流的消息队列)》该文章介绍了使用Redis的阻塞队列和Stream流的消息队列来优化秒杀系统的方案,通过将秒杀流程拆分为两条流水线,使用Redi... 目录Redis秒杀优化方案(阻塞队列+Stream流的消息队列)什么是消息队列?消费者组的工作方式每

Redis如何使用zset处理排行榜和计数问题

《Redis如何使用zset处理排行榜和计数问题》Redis的ZSET数据结构非常适合处理排行榜和计数问题,它可以在高并发的点赞业务中高效地管理点赞的排名,并且由于ZSET的排序特性,可以轻松实现根据... 目录Redis使用zset处理排行榜和计数业务逻辑ZSET 数据结构优化高并发的点赞操作ZSET 结