*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: HGETEXHSETEX 支持字段级过期吗? A: 是的,Redis 7.4+ 引入字段级过期功能,可以对单个字段设置 TTL