Redis 中 Hash 的应用场景

本文最后更新于 2025年10月15日 18:46

Redis 的 Hash 结构(哈希表)是一种非常灵活的数据类型,特别适合存储对象类型的数据。下面梳理一下 Hash 结构的典型应用场景和优势分析。

为什么使用 Hash

  1. 内存效率:相比多个 String 键存储,Hash 更节省内存
  2. 操作原子性:单个 Hash 的操作是原子的
  3. 部分更新:可以只更新需要的字段,不用读写整个对象
  4. 批量操作:支持 HMGET/HMSET 等批量操作

Hash 的常用场景

存储对象数据(最常用的场景)

适用情况:当需要存储一个对象的多个字段时,Hash 比 String 更高效。

示例

1
2
3
4
5
6
# 存储用户信息
HSET user:1001 username "john_doe" age 28 email "john@example.com" score 95

# 获取部分字段
HGET user:1001 username# 返回 "john_doe"
HMGET user:1001 age email# 返回 28 和 "john@example.com"

优势

  • 可以单独获取/修改对象的某个字段,而不需要读写整个对象
  • Redis 对 Hash 有特殊优化。当字段数量和长度小于阈值时,底层会采用 ziplist 存储数据,所有字段和值顺序存储在一个连续内存块中;当超出阈值后,Hash 会自动转换为标准的哈希表结构(类似 Java 的 HashMap),但 Redis 仍然做了优化:使用更高效的哈希算法、渐进式 rehash 机制减少内存峰值、针对小整数等常见值有特殊处理等。

计数器组

适用情况:需要维护一组相关联的计数器时。

示例

1
2
3
4
5
# 记录文章的多种统计信息
HINCRBY article:1234 views 1# 阅读量+1
HINCRBY article:1234 likes 1# 点赞数+1
HINCRBY article:1234 comments 1# 评论数+1# 获取所有统计数据
HGETALL article:1234

不应使用 Hash 的场景

  1. 字段数量非常多(超过几百个),此时 Hash 的性能会下降
  2. 需要单独设置每个字段的 TTL(Hash 只能整体设置过期时间)
  3. 字段值非常大(单个字段值很大时,Hash 的优势不明显,只有小 Hash 会使用 ziplist 高效存储)

For example.

举个例子,在我自己开发的优惠券分发系统中,优惠券模板在 Redis 中就是使用 Hash 进行存储的,每个字段对应模板的一个属性,例如:

  • id: 模板ID
  • name: 模板名称
  • shopNumber: 商户编号
  • type: 优惠券类型
  • status: 模板状态
  • stock: 库存数量

这种设计充分利用了Redis Hash数据结构的特点,可以单独访问和修改模板的某个属性,而不需要每次都操作整个模板对象,提高了缓存的访问效率和灵活性。


Redis 中 Hash 的应用场景
http://example.com/Redis/Redis 中 Hash 的应用场景/
作者
Moonike
发布于
2025年10月15日
更新于
2025年10月15日
许可协议