字段存在性与字段数
HEXISTS 判断 Hash 中的某个字段是否存在,返回 1 或 0;HLEN 返回字段总数。两者都是 O(1),适合做写入前置校验与容量判断。需要注意的是键不存在时 HEXISTS 返回 0、HLEN 返回 0,与「键存在但字段为空」并不区分——Redis 里也不存在空 Hash,最后一个字段被删除后键会随之消失。
基本信息
| 适用 | Redis 2.0 及以上,Hash 类型命令 |
|---|---|
| 复杂度 | 均为 O(1) |
| 键不存在时 | HEXISTS 返回 0,HLEN 返回 0 |
| 相关命令 | EXISTS 判键、HSTRLEN 看字段值长度、HGETALL 取全部字段 |
示例与边界
示例与边界
HSET user:1001 name alice age 30 city hangzhou # 建一个三字段 Hash
HEXISTS user:1001 name # 1:字段存在
HEXISTS user:1001 weibo # 0:字段不存在
HLEN user:1001 # 3:字段总数
HEXISTS user:9999 name # 0:键不存在也返回 0
HLEN user:9999 # 0
EXISTS user:1001 # 1:判断「键」是否存在要用 EXISTS
HSTRLEN user:1001 name # 5:字段值的字节长度命令与返回值读法
| 命令 | 返回 | 边界情况 |
|---|---|---|
| HEXISTS key field | 1 存在 / 0 不存在 | 键不存在同样返回 0,无法区分 |
| HLEN key | 字段个数 | 键不存在返回 0 |
| EXISTS key | 1 存在 / 0 不存在 | 判断键本身,不涉及字段 |
| HSTRLEN key field | 字段值的字节长度 | 字段不存在返回 0 |
| HGETALL key | 全部字段与值 | 大 Hash 上会一次返回大量数据,慎用 |
典型使用场景
- 写入前校验字段是否已存在,避免覆盖有效数据
- 容量治理:HLEN 接近约定上限时触发拆分或清理
- 判断键是否初始化,配合 EXISTS 与 HLEN 组合使用
- 统计维度基数:按 Hash 字段数评估单键规模
- 排查「读不到字段」,先确认键与字段分别是否存在
HEXISTS 与 HSET 是两条独立命令,非原子组合在并发下会互相覆盖;需要「不存在才写」时用 HSETNX,或在 Lua 脚本里把判断与写入合成一步。
HLEN 为 0 只能说明键不存在或没有字段,而 Redis 不会保留空 Hash:删掉最后一个字段后键即消失,因此 HLEN 为 0 实际等价于键不存在。
规模治理相关命令
- HKEYS、HVALS 与 HGETALL 在大 Hash 上会一次返回大量数据,排障时慎用
- HRANDFIELD 可按数量随机取样,适合抽样核对内容
- 字段数接近阈值时编码会从 listpack 切换为 hashtable,内存占用随之跳升
- 需要控制单键规模时按业务维度拆成多个 Hash,而不是继续往一个键里写