前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【redis源码学习】紧凑列表 listpack,t_hash的御用底层结构

【redis源码学习】紧凑列表 listpack,t_hash的御用底层结构

作者头像
看、未来
发布2021-12-27 13:17:25
5460
发布2021-12-27 13:17:25
举报
文章被收录于专栏:CSDN搜“看,未来”

文章目录

listpack

Stream 定制的数据结构有两个:listpack 和 rax。这篇我们先讲一下 listpack。

listpack 是对 ziplist 的优化。从5中率先在streams中引入listpack,直到6后作为t_hash御用底层数据结构,redis应该是发现极致的内存使用远远不如提高redis的处理性能。

ziplist 的级联更新

这个级联更新出现的概率极低,所以在ziplist的那篇我就没写。但是它一旦出现的话就是一场灾难,而 listpack 则是为了解决这一问题而生,所以在这一篇我补上这一个知识点。

级联更新是现有压缩列表构造的一个弊端。

这个弊端源于previous_entry_length属性的设定,这个属性可能占1字节,也可能占5字节,实际占用空间大小和前一个节点大小有关。如果在某个位置新插入一个较大的节点,或者删除一个大节点后的节点,可能就会导致后面节点的previous_entry_length属性由1字节变成5字节,而因为该属性的改变也会导致该entry大小的改变,从而可能引发该entry大于等于254字节,进而导致后面的entry大小继续改变。这个改变可能会波及到整个压缩列表,所以称之为级联更新。

级联更新在最坏情况下需要对压缩列表执行N次空间重分配操作,每次重分配的复杂度是ON,级联更新最坏复杂度为ON方。

虽然级联更新存在,但是出现概率很低,几乎可以忽略不计。

设计图 PK

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

整体上看,listpack少了一些。其实相比较ziplist,listpack中的优化在于entry中。

entry 的内容分布为:<encode><val><backlen> encode:节点编码格式 val:节点元素 backlen:反向遍历时使用的节点长度

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/12/25 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • listpack
    • ziplist 的级联更新
      • 设计图 PK
      相关产品与服务
      云数据库 Redis
      腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档