*Redis HSCAN 命令

以游标方式分批遍历 Hash 中的 field-value 对。


*语法

HSCAN key cursor [MATCH pattern] [COUNT count]

*参数说明

参数 类型 必填 说明
key String Hash 的键名
cursor Integer 游标,首次为 0
MATCH String 匹配 field 名,glob 风格
COUNT Integer 每次扫描提示数量,默认 10

*返回值

返回 [next_cursor, [field1, value1, field2, value2, ...]]


*时间复杂度

O(1) 每次调用 + O(N) 返回 N 个元素。单步不阻塞。


*示例

> HSET user:1001 name Alice age 30 city Beijing email alice@test.com
(integer) 4

> HSCAN user:1001 0
1) "0"
2) 1) "name"
   2) "Alice"
   3) "age"
   4) "30"
   5) "city"
   6) "Beijing"
   7) "email"
   8) "alice@test.com"

# 带 MATCH
> HSCAN user:1001 0 MATCH a*
1) "0"
2) 1) "age"
   2) "30"

*常见错误

  1. 对非 Hash 使用:返回 WRONGTYPE。
  2. 游标理解错误:同 SCAN,游标非递增,必须用上一次返回值。

*最佳实践

  1. 大 Hash 替代 HGETALL:field > 5000 时,用 HSCAN 分批读取,避免阻塞。
  2. 过滤遍历:MATCH 过滤 field 名,但过滤是在返回前做的,COUNT 提示的是扫描数量不是返回数量。

*FAQ

Q: HSCAN 会返回重复的 field 吗? A: 完整遍历中可能返回重复,业务层需去重或幂等处理。

Q: HSCAN 遍历期间 Hash 被修改? A: 可能遗漏或重复,但不影响绝大多数场景。