以下是 Redis 中 哈希(Hash)类型 的系统化讲解,涵盖基础命令、高级用法、典型应用场景及注意事项,适用于用户信息存储、对象建模等结构化数据场景。
📚 目录
🧩 哈希简介
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 value2 | Redis 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 的哈希字段锁机制代码,也可以告诉我!
发表回复