首页/数据/Redis 进阶速查/list-compress-depth:列表压缩深度
内存与管理99 条

list-compress-depth:列表压缩深度

quicklist 由多个节点组成,list-compress-depth 控制两端各多少个节点不压缩、中间节点压缩存储,平衡内存与访问成本。

Redis 进阶速查数据更新于 2026-10-13

list-compress-depth 是什么

Redis 的 list 由 quicklist 实现:一个逻辑列表被拆成多个节点,Redis 7 起节点内部用 listpack 存储。list-compress-depth 规定两端各保留多少个节点不压缩、中间节点用 LZF 压缩保存,默认值 0 表示完全不压缩。它换来的是内存:读中段元素要先解压,写入新节点时才按当时参数决定是否压缩。

基本信息

配置项list-compress-depth
默认值0(不压缩)
单位节点个数,N 表示两端各 N 个节点不压
生效方式CONFIG SET 动态生效,不回改已有节点
实现依赖quicklist(Redis 3.2 起)

典型使用场景

  • 超长列表当归档用:中段几乎不访问,压缩能省下可观内存
  • 消息堆积型队列:两端进出频繁、中段堆积,压缩中间节点降低内存水位
  • 日志类列表:只保留最近若干条并定期裁剪,老数据没有随机访问需求
  • 内存吃紧的只读数据:写入后基本不再修改,压缩收益长期稳定
  • 两端都热的场景:随机访问中段时压缩只增加 CPU,属于不该开的场景

配置与观察

配置与观察
redis-cli CONFIG GET list-compress-depth      # 查看当前设置
redis-cli CONFIG SET list-compress-depth 1    # 两端各保留 1 个节点不压缩
redis-cli CONFIG GET list-max-listpack-size   # 顺带确认单个节点的大小上限
redis-cli RPUSH big:list v1 v2 v3             # 新写入的节点才按新参数处理
redis-cli OBJECT ENCODING big:list            # 应为 quicklist
redis-cli MEMORY USAGE big:list               # 观察整体内存是否下降

取值对照

取值行为判断建议
0所有节点都不压缩两端都热的短列表,保持默认
1两端各 1 个节点不压,中间压缩队列类场景的常用起点
2-3两端保留更多热节点两端访问频繁、中段偶尔访问
很大的值实际等于不压缩参数超过节点总数时一个节点也不会被压
压缩只作用于中段:列表节点总数少于两倍参数值时,其实没有任何节点被压缩,调参后先确认列表规模再判断收益。
list-max-listpack-size 决定每个节点能装多少元素(正值按元素个数、负值按字节数),它和压缩深度是两个维度:前者控制切分粒度,后者控制保留多少热节点。

易错点

  • 不看访问模式就开压缩:两端频繁访问的列表调大参数后 CPU 上升,内存收益却很小
  • 以为改完立即生效:已有节点按写入时的参数处理,收益只能随新写入逐步体现
  • 节点很少时设了很大的压缩深度,实际一个节点都没压,却在排查为什么没省内存
  • 把压缩深度与 list-max-listpack-size 混为一谈,参数调错方向,问题在原地打转

数据来源与参考

  • Redis 官方文档:quicklist 压缩配置
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌