讲师中心 微信公众号
AI工具推荐 视频效率加速

为什么Redis Hash在ziplist编码下更省空间_分析紧凑存储与随机访问权衡

夜杰大大_3885

夜杰大大_3885

发布时间:2026-07-02 06:30:20

|

366人浏览过

|

来源于php中文网

原创

Redis Hash用ziplist编码更省内存因无指针、哈希桶等开销,字段值紧凑存储,实测比hashtable少占40%~70%;但HGET为O(n)顺序查找,字段越多或位置越靠后性能越差,200+字段且频繁查后置字段时易拖垮主线程。

为什么redis hash在ziplist编码下更省空间_分析紧凑存储与随机访问权衡

Hash 用 ziplist 编码确实更省空间,但代价是随机访问变慢——这不是配置没调对,而是 Redis 在内存和 CPU 之间做的硬性取舍。

ziplist 为什么比 hashtable 少占内存

ziplist 是一块连续内存,没有指针、没有哈希桶、没有链表节点。每个 field 和 value 紧挨着存,只靠长度前缀和类型标记区分;而 hashtable 要维护数组 + dictEntry 结构 + next 指针 + key/value 双重 SDS 开销。实测一个含 10 个字段的 Hash,ziplist 编码比 hashtable 少占 40%~70% 内存。

关键节省点包括:

  • 单个 key 的元数据(如过期时间、引用计数、类型标识)只算 1 份,不是每个 field 单独一份
  • 字段名(如 name、status)不重复存储,也不带 JSON 引号/逗号等序列化冗余
  • 小整数可被编码为 1 字节长度前缀,字符串短于 64 字节时直接内联,无额外 len/free 字段

HGET 性能掉多少?取决于字段位置和数量

ziplist 查找是顺序扫描:从头开始,逐个读 entry 的 prelen 和内容,直到匹配 field。它不支持 O(1) 跳转。

这意味着:

Redis Skill - 高性能缓存管理
Redis Skill - 高性能缓存管理

Redis 缓存和数据结构管理技能。通过自然语言操作 Redis,支持 String、Hash、List、Set、ZSet、Stream 等数据结构操作。当用户提到 Redis、缓存、消息队列、会话存储时使用此技能。

下载
  • 查第一个字段(如 name)最快,几乎常数时间
  • 查最后一个字段,要遍历全部前面的 entry,耗时与字段总数成正比
  • 字段数从 100 增到 500,最差情况 HGET 延迟可能翻 5 倍(实测在 Redis 6.2 中约从 0.02ms → 0.1ms)
  • Redis 7.0 起改用 listpack 替代 ziplist,缓解了“连锁更新”问题,但查找仍是 O(n)

什么时候 ziplist 反而更费 CPU,甚至拖垮主线程

不是所有“省内存”都值得要。以下场景 ziplist 会成为性能瓶颈:

  • Hash 有 200+ 字段,且业务频繁执行 HGET user:123 avatar_url(靠后字段)
  • 用 HSET 在中间插入新字段(如加 updated_at),触发整块内存 memcpy 移动后续所有 entry
  • 字段值长度波动大(如 bio 有时 10 字节、有时 200 字节),导致 ziplist 频繁 realloc + copy,产生内部碎片
  • 配置 hash-max-ziplist-entries 10000 强行维持 ziplist,但实际字段达 8000 —— 此时每次 HGET 平均扫描 4000 个 entry,CPU 使用率飙升

这种“计算密集型 BigKey”,比单纯内存大的 hashtable 更危险:它不占更多 RAM,但会让 Redis 主线程卡住,影响所有请求。

如何判断你的 Hash 还在享受 ziplist 优势

别猜,直接看编码:

  • 运行 DEBUG OBJECT myhash,返回中含 encoding:ziplist 才算生效
  • 若返回 encoding:hashtable,说明已触发退化(哪怕你刚删掉 500 个字段,也不会缩回去)
  • 批量检查可用:redis-cli --scan --pattern "user:*" | xargs -L1 -I{} redis-cli DEBUG OBJECT {} 2>/dev/null | grep -E "(key|encoding)"
  • MEMORY USAGE myhash 能看总字节数,但看不出编码方式;INFO memory 的 used_memory_dataset_perc 偏高,往往暗示大量小对象未被压缩

真正容易被忽略的是:ziplist 的优势只在线性增长阶段成立。一旦字段数或 value 长度越过阈值,切换不可逆,且再无回退机制——设计阶段就要预估字段稳定性,而不是上线后再靠调参硬扛。

热门AI工具

更多
PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

AionClaw
AionClaw Hot

AionClaw是一款面向办公、创作和编程任务的AI桌面智能体。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

相关专题

更多
常用的数据库软件
常用的数据库软件

常用的数据库软件有MySQL、Oracle、SQL Server、PostgreSQL、MongoDB、Redis、Cassandra、Hadoop、Spark和Amazon DynamoDB。更多关于数据库软件的内容详情请看本专题下面的文章。php中文网欢迎大家前来学习。

4329

2023.11.02

内存数据库有哪些
内存数据库有哪些

内存数据库有Redis、Memcached、Apache Ignite、VoltDB、TimesTen、H2 Database、Aerospike、Oracle TimesTen In-Memory Database、SAP HANA和ache Cassandra。更多关于内存数据库相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

3835

2023.11.14

mongodb和redis哪个读取速度快
mongodb和redis哪个读取速度快

redis 的读取速度比 mongodb 更快。原因包括:1. redis 使用简单的键值存储,而 mongodb 存储 json 格式的数据,需要解析和反序列化。2. redis 使用哈希表快速查找数据,而 mongodb 使用 b-tree 索引。因此,redis 在需要高性能读取操作的应用程序中是一个更好的选择。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

6972

2024.04.02

redis怎么做缓存服务器
redis怎么做缓存服务器

redis 作为缓存服务器的答案:redis 是一款开源、高性能、分布式的键值存储,可作为缓存服务器使用。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

623

2024.04.07

redis怎么解决数据一致性
redis怎么解决数据一致性

redis 提供了两种一致性模型,以维护副本数据一致性:强一致性 (sync) 确保写操作仅在复制到所有从节点后才完成;最终一致性 (async) 则在主节点上写操作后认为已完成,牺牲一致性换取性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

756

2024.04.07

mysql和redis怎么保证双写一致性
mysql和redis怎么保证双写一致性

确保 mysql 和 redis 双写一致性的技术包括:1、事务性更新:同时更新 mysql 和 redis,保证一致性;2、主从复制:mysql 主服务器更改同步到 redis 从服务器;3、基于事件的更新:mysql 记录更改并发送到 redis等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

6662

2024.04.07

redis缓存一般存些什么数据
redis缓存一般存些什么数据

redis缓存中存储的数据类型包括:字符串、哈希、列表、集合、有序集合、位图、地理空间数据和hyperloglog。这些数据类型适用于存储各种数据,从简单信息到复杂对象和地理位置。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1160

2024.04.07

redis的8种数据类型有哪些
redis的8种数据类型有哪些

redis 提供 8 种数据类型:字符串(文本、数字、二进制)、哈希(键值对)、列表(有序集合)、集合(无序唯一元素)、有序集合(按分数排序)、地理空间(地理位置)、hyperloglog(估计大数据基数)和位图(位序列存储)。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1036

2024.04.07

FrankenPHP集成Laravel详细教程
FrankenPHP集成Laravel详细教程

本专题提供FrankenPHP集成Laravel的详细配置指南,全面解析运行原理、开发环境搭建、Caddyfile配置、Octane工作模式、数据库连接、队列任务、定时任务和生产环境优化,解决部署过程中常见的报错与兼容性问题。

0

2026.10.08

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
深入剖析redis教程
深入剖析redis教程

共55课时 | 9.7万人学习

传智播客redis基础视频教程
传智播客redis基础视频教程

共13课时 | 6.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn