Redis Hash 基础
Redis 的 Hash 类型本质上是键值对的集合,字段(field)和值(value)都支持字符串或数字。它非常适合存储对象类数据,比如用户信息、配置项等。
底层实现上,Redis 会根据数据量自动选择压缩列表(ziplist)或哈希表(hashtable),在空间利用率和查询效率之间取得平衡。作为 Redis 中存储结构化数据的核心类型之一,Hash 支持单字段或多字段的增删改查,以及字段存在性判断和原子数值操作。
需要注意的是,Redis 本身基于 KV 结构,Hash 实际上是'键中的键'。在 Hash 内部,我们用 field 来替代原本的 Key 位置,避免命名冲突。
核心读写指令
hset:设置字段
用于创建或更新 Hash 中的字段。如果字段已存在,则覆盖旧值;如果不存在,则新建。
hset key field value
返回值为 1 表示新建成功,0 表示更新成功。一个 Key 下可以包含多个 Field,每个 Field 对应唯一的 Value。
hget:获取字段
通过 Key 和 Field 获取对应的 Value。该命令仅支持单次访问单个字段,无法批量获取。
hget key field
hdel:删除字段
删除指定的 Field 及其对应的 Value。注意,只要 Key 下还有其他 Field,执行删除后 Key 本身不会消失。
hdel key field
批量与统计指令
hmget:批量获取
当需要一次性读取多个字段的值时,使用此命令比多次调用 hget 更高效。
hmget key field [field ...]
hkeys / hvals:获取所有字段或值
hkeys返回 Key 下的所有字段名。hvals返回 Key 下的所有值。
hkeys key
hvals key
注意:这两个命令配合 hgetall 使用时需谨慎。由于 Redis 是单线程架构,如果 Hash 中的数据量非常大,这些命令会阻塞主线程,影响其他请求。生产环境中建议先确认数据规模,避免直接对大对象执行全量扫描。
hgetall:获取全部键值对
一次性返回 Key 下所有的 Field 和 Value 映射。
hgetall key
同样受限于上述性能问题,仅在数据量可控时使用。
hexists:判断字段存在
检查指定 Field 是否存在于 Key 中。存在返回 1,否则返回 0。
hexists key field
hlen:统计字段数量
返回 Key 下 Field 的数量。如果 Key 不存在,返回 0。
hlen key
特殊场景指令
hsetnx:条件设置
仅在字段不存在时设置值。如果字段已存在,则不执行任何操作并返回 0。常用于防止重复写入的场景。
hsetnx key field value
hincrby / hincrbyfloat:数值增减
用于对 Hash 中的数值型字段进行自增或自减操作。
hincrby处理整数。hincrbyfloat处理浮点数,但也兼容整数运算。
hincrby key field increment
hincrbyfloat key field increment
负数参数可实现减法操作。这两个命令是构建计数器、排行榜等功能的基石。
总结
Hash 类型在 Redis 中扮演着重要角色,特别适合结构化数据的存储。掌握上述命令能帮助你高效管理对象数据。在实际开发中,务必关注大 Key 带来的性能风险,合理设计数据结构,确保系统稳定性。


