*Redis HASH 命令
HASH 是 Redis 中与哈希(Hash)数据结构操作相关的命令分类,用于存储和操作字段-值对的集合。
*语法
HASH 类命令包含以下常用命令:
HSET key field value [field value ...]
HGET key field
HMGET key field [field ...]
HGETALL key
HKEYS key
HVALS key
HLEN key
HEXISTS key field
HDEL key field [field ...]
HINCRBY key field increment
HINCRBYFLOAT key field increment
HSETNX key field value
HSTRLEN key field
HRANDFIELD key [count [WITHVALUES]]
HSCAN key cursor [MATCH pattern] [COUNT count]
HGETDEL key field [field ...]
HGETEX key [EX seconds | PX milliseconds | EXAT timestamp | PXAT milliseconds-timestamp | PERSIST] field [field ...]
HPEXPIRE key milliseconds [NX | XX | GT | LT] field [field ...]
HSETEX key [EX seconds | PX milliseconds | EXAT timestamp | PXAT milliseconds-timestamp] field value [field value ...]
*参数说明
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| key | String | 是 | Hash 键名 |
| field | String | 是 | 字段名 |
| value | String | 是 | 字段值 |
| increment | Integer/Float | 是 | 增量值 |
| count | Integer | 否 | 随机返回的字段数量 |
| cursor | Integer | 是 | 游标,用于 HSCAN |
| pattern | String | 否 | 匹配模式 |
*返回值
- HSET: 新添加的 field 数量(Integer)
- HGET: 字段值(String)或 Nil
- HMGET: 值数组
- HGETALL: 字段和值交替的数组
- HKEYS: 字段名数组
- HVALS: 值数组
- HLEN: 字段数量(Integer)
- HEXISTS: 1 或 0
- HDEL: 成功删除的字段数量(Integer)
- HINCRBY: 新增后的值(Integer)
- HINCRBYFLOAT: 新增后的值(String)
- HSETNX: 1 成功,0 失败
- HSTRLEN: 字段值长度(Integer)
- HRANDFIELD: 随机字段名或字段名-值对
- HSCAN: 新游标和匹配元素数组
- HGETDEL: 被删除字段的值数组
- HGETEX: 字段值数组,并可选设置/清除过期
- HPEXPIRE: 成功设置过期的字段数量(Integer)
- HSETEX: 新添加的字段数量(Integer)
*时间复杂度
- HSET / HGET / HEXISTS / HDEL: O(1) 每字段
- HGETALL / HKEYS / HVALS: O(N),N 为字段数量
- HSCAN: O(1) 每步 + O(N) 匹配
- HGETDEL / HGETEX / HPEXPIRE / HSETEX: O(1) 每字段
*示例
*基本操作
> HSET user:1001 name "Alice" age "30" city "Beijing"
(integer) 3
> HGET user:1001 name
"Alice"
> HLEN user:1001
(integer) 3
> HGETALL user:1001
1) "name"
2) "Alice"
3) "age"
4) "30"
5) "city"
6) "Beijing"
*字段检查与删除
> HEXISTS user:1001 age
(integer) 1
> HDEL user:1001 age
(integer) 1
> HEXISTS user:1001 age
(integer) 0
*增量操作
> HINCRBY user:1001 visits 1
(integer) 1
> HINCRBYFLOAT user:1001 score 1.5
"1.5"
*带过期时间的字段操作(Redis 7.4+)
> HSETEX user:1001 EX 3600 temp "value"
(integer) 1
> HGETEX user:1001 PERSIST temp
1) "value"
> HPEXPIRE user:1001 60000 NX temp
(integer) 1
*常见错误
| 错误 | 原因 | 解决 |
|---|---|---|
| WRONGTYPE | key 已存在但不是 Hash | 确认 key 类型 |
| ERR wrong number of arguments | field 和 value 未成对 | 检查参数数量 |
| ERR value is not an integer | 非数字字段做 HINCRBY | 确认字段值为数字 |
*最佳实践
- 适合存储结构化对象(用户信息、商品属性等)
- 单个 Hash 字段数建议控制在 1000 以内,避免大 Hash 阻塞
- 使用 HSCAN 遍历大 Hash,避免 HGETALL 阻塞
- 使用 HSETNX 实现字段级别的原子条件设置
- Redis 7.4+ 的 HGETEX/HSETEX/HPEXPIRE 支持字段级过期,替代方案更灵活
*FAQ
Q1: Hash 适合存储什么数据? A: 结构化对象,如用户资料、商品属性、配置项等。
Q2: Hash 的 field 可以嵌套吗? A: 不能直接嵌套,value 可以是 JSON 字符串模拟嵌套。
Q3: 单个 Hash 最大能存多少字段? A: 理论上限约 232-1,但建议控制在 1000 以内。
Q4: Hash 和 String 存储 JSON 哪个更好? A: Hash 支持字段级操作,更灵活;String 存储 JSON 更紧凑。按需选择。
Q5: HGETEX 和 HSETEX 支持字段级过期吗? A: 是的,Redis 7.4+ 引入字段级过期功能,可以对单个字段设置 TTL。