redis 7.x 彻底移除了 ziplist,统一改用 listpack,导致 object encoding 结果不再显示 "ziplist",而是 "listpack" 或 "quicklist";listpack 消除了连锁更新问题但对单元素长度更敏感,超64字节易触发编码降级,且 quicklist 节点由 listpack 构成,相关配置参数和边界判断逻辑均已调整。

Redis 7.x 彻底移除了 ziplist,改用 listpack
这是最直接影响内存使用和大 key 行为的底层变更。Redis 6.x 中,list、hash、zset 在满足小数据量条件时会用 ziplist 编码;而 Redis 7.0+ 完全废弃了 ziplist,统一改用更紧凑、更易维护的 listpack。你执行 object encoding mykey 时,再也看不到 "ziplist",只会看到 "listpack" 或 "quicklist"(后者内部也由 listpack 构成)。
实际影响包括:
-
listpack不再有ziplist的“连锁更新”问题(比如插入中间元素导致大量内存重分配),写入更稳定 - 但
listpack对单个元素长度更敏感:超过 64 字节就可能触发编码降级(如从listpack切换到quicklist),而ziplist是按总长度和元素数双重判断的 - 升级后如果原有
hash或zsetkey 恰好处于临界尺寸,重启或REWRITE后可能立即切换编码,引发一次性的内存小幅上涨
quicklist 在 7.x 中不再包含 ziplist,只由 listpack 组成
Redis 6.x 的 quicklist 是双端链表 + 每个节点为 ziplist;到了 7.x,每个节点变成 listpack。这意味着:
Redis 缓存和数据结构管理技能。通过自然语言操作 Redis,支持 String、Hash、List、Set、ZSet、Stream 等数据结构操作。当用户提到 Redis、缓存、消息队列、会话存储时使用此技能。
-
LPOP/RPOP、LPUSH/RPUSH等操作在小列表上依然高效,但底层内存布局不同 - 你不能通过配置
list-max-ziplist-size控制quicklist节点大小了——这个参数在 7.x 已被忽略,取而代之的是list-max-listpack-size(默认 -5,即最大 64 字节/元素) - 如果业务依赖
ziplist的特定内存对齐行为(极少数 C 模块或调试工具),升级后会失效
set 和 sorted set 的底层组合方式没变,但编码细节受 listpack 连带影响
set 在两个版本中都用 ht(哈希表)或 intset(整数集合);zset 都是 skiplist + 底层编码(6.x 是 ziplist,7.x 是 listpack)。关键差异在于:
- 当
zset元素数少、score 和 member 都较短时,6.x 可能用ziplist,7.x 用listpack—— 内存占用略低,但序列化格式不兼容(RDB/AOF 升级后自动转换,无需人工干预) -
ZRANGE myzset 0 -1 WITHSCORES返回结构一致,但底层遍历逻辑变了:7.x 的listpack迭代器不支持反向遍历,所以ZRANGE ... REV在listpack编码下会先全量读取再反转,小数据无感,大数据量时比 6.xziplist略慢一点 -
zset的zadd命令在 7.x 新增了GT/LT选项,但这属于功能扩展,和底层编码无关
hash 的编码策略更激进地倾向 listpack
Redis 6.x 默认用 ziplist 存小 hash,但一旦字段数超 hash-max-ziplist-entries(默认 512)或任意字段值超 hash-max-ziplist-value(默认 64 字节),就整体升级为 ht。7.x 把这套逻辑迁移到 listpack,但调整了默认阈值:
-
hash-max-listpack-entries默认仍是 512,但hash-max-listpack-value默认降为 64(和旧版一致),不过内部判断更严格:只要一个字段 value 超过该值,整个hash就弃用listpack - 这意味着:如果你的
hash里混有长字符串(比如 JSON 片段),哪怕只有一个,7.x 更容易直接走ht编码,而 6.x 可能还卡在ziplist边缘 - 升级前建议用
redis-cli --scan --pattern "your:hash:*" | xargs -L1 redis-cli object encoding批量检查现有hash编码,预估内存分布变化
listpack 的边界行为和旧版 ziplist 不完全等价——尤其当你的监控脚本或运维工具硬编码了 "ziplist" 字符串做判断时,会直接失效。










