以下是 Redis 中 哈希(Hash)类型 的系统化讲解,涵盖基础命令、高级用法、典型应用场景及注意事项,适用于用户信息存储、对象建模等结构化数据场景。


📚 目录

  1. 哈希简介
  2. 常用命令大全
  3. 典型使用场景
  4. 高级操作与技巧
  5. 性能与限制
  6. 参考资料

🧩 哈希简介

Redis 的 Hash 类型是一个 字段(field)到值(value)映射的集合,类似于编程语言中的字典或对象。

  • 每个哈希由一个唯一 key 标识
  • 每个哈希内部包含若干 field-value 对
  • 单个字段和值的长度不能超过 512MB

🔧 常用命令大全

命令功能描述
HSET key field value设置哈希字段的值(若字段存在则覆盖)
HGET key field获取字段的值
HMSET key field1 value1 field2 value2一次设置多个字段(已废弃,推荐使用 HSET)
HSET key field1 value1 field2 value2Redis 4.0+ 推荐写法
HMGET key field1 field2获取多个字段值
HGETALL key获取所有字段和值
HDEL key field [field ...]删除字段
HEXISTS key field判断字段是否存在
HKEYS key获取所有字段名
HVALS key获取所有值
HLEN key获取字段数量
HINCRBY key field increment字段值加整数
HINCRBYFLOAT key field increment字段值加浮点数
HSTRLEN key field获取字段值的字符串长度

🧪 典型使用场景

✔ 存储用户信息

HSET user:1001 name "Alice" age 25 email "alice@example.com"
HGET user:1001 email

✔ 缓存结构化对象

HSET product:2001 name "iPhone 15" stock 100 price 8999

✔ 统计维度数据

HINCRBY analytics:page:home views 1
HINCRBY analytics:page:home clicks 2

✔ 后台任务进度跟踪

HSET task:job123 status "running" progress "30%" start_time 1712958080


🛠️ 高级操作与技巧

🔁 批量写入或读取

HSET user:1002 name "Bob" age 30 gender "male"
HMGET user:1002 name gender

📈 增量统计

HINCRBY score:user:1001 math 5
HINCRBYFLOAT finance:account:001 balance 19.99

🧹 删除字段

HDEL user:1001 email phone


⚠️ 性能与限制

项目建议说明
✅ 适合字段数量较少的数据结构适用于 <1000 个字段的轻量对象建模
⚠️ 哈希字段过多影响内存结构超过阈值后 Redis 不再用紧凑 ZipList,而转为 Hashtable,占用内存更高
❗ 不支持嵌套结构Redis Hash 不支持嵌套字段,复杂结构需序列化(如 JSON)存储
🧼 不支持过期字段只能设置整个哈希键的 TTL,不能对某个字段设置过期时间

🧠 实践建议

  • 命名规范建议:<模块>:<对象ID>:<属性>,如 user:1001:name
  • 如果哈希字段很少(如只一个字段),使用字符串类型可能更合适
  • 对于频繁更新某字段的场景(如余额、进度),Hash 性能优于 JSON 串

📎 参考资料


如需我为你生成哈希型用户信息缓存模板、进度追踪脚本,或提供结合 Lua 的哈希字段锁机制代码,也可以告诉我!