HDEL 是什么
HDEL 删除 Hash 中一个或多个字段,返回真正被删掉的字段个数。Hash 的最后一个字段被删除后,整个键会自动消失,不会留下空 Hash。这是 Hash 与 List 的重要差异:列表可以保留空列表,而空的 Hash 一定不存在。
基本信息
| 语法 | HDEL key field [field ...] |
|---|---|
| 返回 | 实际删除的字段数量,不存在的字段不计入 |
| 自动清理 | Hash 为空时键被自动删除 |
| 相关命令 | HSET / HGET / HLEN / HEXISTS / DEL |
| 批量 | 一条 HDEL 可携带多个字段,减少往返 |
典型使用场景
- 购物车里删除单个商品项,而不是清空整个购物车
- 清理用户属性中的某个字段,例如注销手机号后删除该字段
- 批量清理一批过期字段,用返回值确认实际删了多少
- 排查「删完字段后键不见了」这类疑问,确认是自动清理行为
- 配合 HLEN 做结构收敛,及时发现字段数异常增长的键
用法与返回值
用法与返回值
HSET cart:u88 sku1 2 sku2 1
HDEL cart:u88 sku1 # 1:返回真正删除的数量
HDEL cart:u88 sku1 sku2 # 1:sku1 已不存在,只统计实际删除的
EXISTS cart:u88 # 0:字段删空后键自动消失
HLEN cart:u88 # 0
HSET cart:u88 sku3 1 # 重新创建键
HGETALL cart:u88 # 1) sku3 2) 1相关命令对比
| 命令 | 语义 | 注意事项 |
|---|---|---|
| HDEL | 按字段名删除 | 不存在的字段不计入返回值 |
| HGET | 读取单个字段 | 键不存在时返回 nil |
| HLEN | 字段个数 | 键已消失时返回 0 |
| DEL | 删除整个键 | 会把所有字段一起删掉,别当 HDEL 用 |
| HEXISTS | 判断字段是否存在 | 返回 1 或 0 |
空的 Hash 会被自动删除,所以删完字段后 HGET 返回 nil、EXISTS 返回 0 是正常行为,不是数据丢失,业务代码不要把这个当成异常上报。
与 LREM 不同,HDEL 按字段名精确删除,不存在保留空容器的问题,也就无需额外的清理任务去扫「空结构」。如果业务确实需要保留空容器的语义,应改用 List 或 ZSet,而不是在 Hash 上打补丁。
字段数极多的 Hash(几十万字段)上执行一次性大批量 HDEL,单命令可能阻塞数十毫秒;更稳的做法是分批删除,或直接删除整个键由业务重建。大 Hash 的治理优先级高于删除技巧:先拆分结构,再谈怎么删。