hash存储对象比string存json更省内存且高效,因hash共享字段名、支持ziplist压缩编码(实测省40%–60%),而string重复存储引号、逗号等冗余字符;需合理配置hash-max-ziplist-entries和hash-max-ziplist-value以维持ziplist编码,并避免字段名冗余及超长值触发hashtable退化。

用 Hash 存储对象数据能显著减少内存开销,关键在于避免把整个对象序列化成 JSON 存 String 类型——那样每次读写都要全量解析、传输和分配内存。Hash 把字段拆开存,底层还能自动压缩,小数据时用 ziplist,省内存又快。
用 Hash 替代 JSON String 存对象
比如用户信息,别这么存:
❌ 错误做法(String + JSON)SET user:1001 '{"name":"张三","age":25,"email":"z@x.com"}'每次改邮箱,得取整条 JSON、反序列化、改字段、再序列化、全量写回——CPU 和带宽都浪费。
换成 Hash 就干净多了:
✅ 正确做法(Hash)HSET user:1001 name "张三" age 25 email "z@x.com"改邮箱只需:
HSET user:1001 email "new@x.com",不碰其他字段,也不做 JSON 处理。
控制底层用 ziplist 节省内存
Redis 会自动在小 Hash 时用 ziplist(紧凑连续内存),比哈希表省很多指针和元数据空间。要让它长期保持 ziplist,注意两个配置:
-
字段数 ≤ 512(默认
hash-max-ziplist-entries) -
每个 field 和 value 长度 ≤ 64 字节(默认
hash-max-ziplist-value)
例如存手机号、状态码、开关标志这类短字段,天然适配;但别往里塞长文本或 Base64 图片——超长会触发转 dict,内存反而上升。
Redis 缓存和数据结构管理技能。通过自然语言操作 Redis,支持 String、Hash、List、Set、ZSet、Stream 等数据结构操作。当用户提到 Redis、缓存、消息队列、会话存储时使用此技能。
字段命名简洁,避免冗余前缀
Hash 内部的 field 是纯字符串,没命名空间。别这样写:
HSET user:1001 user_name "张三" user_age "25" user_email "z@x.com"重复的 user_ 白占字节。直接用:
HSET user:1001 name "张三" age "25" email "z@x.com"字段越短,ziplist 存储越紧凑,内存利用率越高。
批量操作优先用 HMSET/HMGET,少用 HGETALL
HGETALL 返回全部 field-value,网络和内存开销随字段数线性增长,还容易阻塞主线程。
- 只查几个字段 → 用
HMGET user:1001 name age - 初始化或导出全量 → 才考虑
HGETALL,且建议配合HSCAN分批处理大 Hash - 写多个字段 → 用
HSET key f1 v1 f2 v2 ...(Redis 4.0+ 已统一 HSET 支持多 field)










