Redis 的 Hash 类型是一种键值对的集合,适合存储对象或关联数据。以下是其核心操作和典型场景的详细介绍:
一、基本操作
1. 存储数据
# 设置单个字段
HSET key field value
# 示例:存储用户信息
HSET user:1001 name "Alice"
HSET user:1001 age 30
HSET user:1001 email "alice@example.com"
# 批量设置多个字段(更高效)
HMSET key field1 value1 field2 value2 ...
HMSET user:1001 name "Bob" age 25 email "bob@example.com"
2. 获取数据
# 获取单个字段
HGET key field
# 示例:获取用户姓名
HGET user:1001 name # 返回 "Alice"
# 获取所有字段和值
HGETALL key
# 返回结果:
# 1) "name"
# 2) "Alice"
# 3) "age"
# 4) "30"
# 5) "email"
# 6) "alice@example.com"
# 获取所有字段名或值
HKEYS key # 返回: name, age, email
HVALS key # 返回: Alice, 30, alice@example.com
# 获取字段数量
HLEN key # 返回 3
3. 更新与删除
# 递增字段值(原子操作)
HINCRBY key field increment
HINCRBY user:1001 age 1 # 年龄 +1
# 删除字段
HDEL key field1 field2 ...
HDEL user:1001 email # 删除 email 字段
4. 判断字段是否存在
HEXISTS key field
HEXISTS user:1001 name # 返回 1(存在)
二、高级特性
原子性
Redis 的 Hash 操作是原子的,适合高并发场景。例如:HINCRBY user:1001 score 10 # 原子性加分操作
内存优化
当 Hash 元素较少时,Redis 会使用**压缩列表(ziplist)**存储,节省内存。可通过配置调整:hash-max-ziplist-entries 512 # 元素数量上限 hash-max-ziplist-value 64 # 单个值的字节上限
三、典型使用场景
1. 缓存对象
- 场景:缓存用户信息、配置项等对象数据。
- 优势:相比将对象序列化为 JSON 存储,Hash 可单独操作字段,无需反序列化整个对象。
- 示例:
HMSET user:1001 name "Alice" age 30 role "admin" HGET user:1001 age # 单独获取年龄,无需获取整个对象
2. 统计数据
- 场景:计数器、频次统计(如点赞数、访问量)。
- 优势:
HINCRBY
支持原子性递增,避免并发冲突。 - 示例:统计文章的不同维度点赞数:
HINCRBY article:1001 likes 1 # 总点赞 +1 HINCRBY article:1001 likes:mobile 1 # 移动端点赞 +1
3. 购物车
- 场景:电商购物车,存储商品 ID 和数量。
- 优势:字段为商品 ID,值为数量,可快速增删改查。
- 示例:
# 用户1001的购物车 HSET cart:1001 product:apple 2 # 苹果数量 2 HSET cart:1001 product:banana 3 # 香蕉数量 3 HINCRBY cart:1001 product:apple 1 # 苹果 +1
4. 分布式锁
- 场景:使用
HSETNX
(仅当字段不存在时设置)实现锁。 - 示例:
HSETNX lock:order order_id 12345 # 加锁 HDEL lock:order # 释放锁
5. 存储配置信息
- 场景:动态配置项(如限流阈值、功能开关)。
- 优势:可实时修改并立即生效,无需重启服务。
- 示例:
HMSET config:rate_limit max_requests 1000 period 60
四、注意事项
大 Hash 问题
避免单个 Hash 存储过多字段(建议不超过 1000),否则可能影响性能。可拆分为多个 Hash 或使用 Redis Cluster。内存占用
Hash 的字段名会占用额外内存,建议使用短字段名(如uid
替代user_id
)。过期策略
Hash 本身不支持整体过期,需为 key 设置过期时间:EXPIRE user:1001 3600 # 1小时后过期
五、对比其他结构
数据结构 | 适用场景 | 优势 |
---|---|---|
Hash | 对象存储、字段独立操作 | 节省内存、支持部分更新 |
String | 简单键值对、需序列化的对象 | 操作简单 |
Set | 无序不重复集合(如用户标签) | 支持交集、并集等操作 |
Sorted Set | 带权重的排序(如排行榜) | 按分数快速排序 |