Hash 与对象缓存
约 666 字大约 2 分钟
布欧-Lewyon
2026-05-15
Hash 是字段-值对的集合,适合存储对象(类似 Java 的 Map<String, String>)。
基础操作
# 设置字段
HSET user:100 name "Alice" age 25 city "Beijing"
# 获取单个字段
HGET user:100 name # "Alice"
# 获取多个字段
HMGET user:100 name age
1) "Alice"
2) "25"
# 获取所有字段和值
HGETALL user:100
1) "name"
2) "Alice"
3) "age"
4) "25"
5) "city"
6) "Beijing"
# 获取所有字段名
HKEYS user:100
1) "name"
2) "age"
3) "city"
# 获取所有值
HVALS user:100
# 字段数量
HLEN user:100 # 3判断与删除
# 判断字段是否存在
HEXISTS user:100 "name" # 1
HEXISTS user:100 "phone" # 0
# 删除字段
HDEL user:100 "city"
# 字段不存在时才设置
HSETNX user:100 "email" "alice@example.com"计数器
# Hash 字段递增
HINCRBY user:100 "login_count" 1 # 1
HINCRBY user:100 "login_count" 1 # 2
HINCRBYFLOAT user:100 "score" 0.5 # 0.5遍历大 Hash
# HSCAN:游标遍历(不阻塞,生产推荐)
HSCAN user:100 0 MATCH * COUNT 10
1) "0"
2) 1) "name" -> "Alice"
2) "age" -> "25"Hash vs String 存储对象
# String 方式(序列化整个对象)
SET user:100 '{"name":"Alice","age":25}'
GET user:100 # 整个取出,改一个字段要全量更新
# Hash 方式(分字段存储)
HSET user:100 name "Alice" age 25
HGET user:100 name # 只取 name 字段
HINCRBY user:100 age 1 # 只增 age| 对比 | String + JSON | Hash |
|---|---|---|
| 内存 | 更少(序列化后小) | 更多(字段元数据) |
| 部分更新 | ❌ 需全量重新 SET | ✅ 单个字段操作 |
| 部分读取 | ❌ 全量 GET 后解析 | ✅ HGET 单字段 |
| 适用 | 小对象、只需整体存取 | 大对象、需要部分更新 |
应用场景
用户信息缓存
HSET session:abc123 user_id 100 username "Alice" role "admin"
HEXISTS session:abc123 "user_id"购物车
# 用户购物车:Hash 的 field 是商品 ID,value 是数量
HSET cart:user:100 "product:1" 2
HSET cart:user:100 "product:2" 1
HINCRBY cart:user:100 "product:1" 1 # 增加数量
# 查看购物车
HGETALL cart:user:100
1) "product:1"
2) "3"
3) "product:2"
4) "1"
# 获取商品数
HLEN cart:user:100 # 2 种商品
# 删除商品
HDEL cart:user:100 "product:1"小结
| 命令 | 用途 | O |
|---|---|---|
HSET/HGET | 设/取字段 | 1 |
HMSET/HMGET | 批量设/取 | N |
HGETALL | 全部字段 | N |
HEXISTS | 字段存在 | 1 |
HDEL | 删除字段 | N |
HINCRBY | 字段递增 | 1 |
HLEN | 字段数 | 1 |
HKEYS/HVALS | 字段名/值 | N |
HSCAN | 游标遍历 | N |
- Hash 是对象缓存的理想选择,支持字段级别的读写。
- 需要部分更新/读取时用 Hash;整体存取且数据量小时用 String + JSON。
- 小 Hash(<512 字段)用 ziplist 编码压缩内存。
HSCAN遍历大 Hash,生产推荐。
上一节:Sorted Set 与排行榜 下一节:Stream 与消息队列进阶
