Redis 哈希(Hash)
核心概念
Hash 结构对应 key-hash 关系,内部是 field-value 对。它非常适合存储对象属性,比如用户信息 user:1000 包含 name、age 等字段。
相比 String 存 JSON,Hash 在修改单个字段时效率更高,无需反序列化整个对象。例如修改年龄,直接操作 field 即可,避免了整体解析再写入的开销。
基础操作指令
HSET:设置字段值。支持一次设置多个字段(Redis 4.0+),时间复杂度 O(1)。
HSET user:1000 name "Alice" age 30 email "[email protected]"
注意:若字段已存在会被覆盖。
HGET:获取指定字段值。不存在返回 nil。
HGET user:1000 name
HDEL:删除一个或多个字段。返回实际删除的数量。
HDEL user:1000 age
HEXISTS:检查字段是否存在,O(1) 复杂度。
HEXISTS user:1000 name
HSETNX:仅当字段不存在时设置,原子操作。返回 1 表示成功,0 表示已存在。
HSETNX user:1000 gender "female"
批量与统计
HMSET:批量设置字段。Redis 4.0+ 后推荐直接用 HSET 替代,功能一致但更通用。
HMGET:批量获取字段值。按请求顺序返回列表,缺失字段返回 nil。
HMGET user:1000 name email
HGETALL:获取所有字段和值。大数据量时可能阻塞 Redis,建议用 HSCAN 替代。
HGETALL user:1000
HKEYS / HVALS / HLEN:分别获取所有字段名、所有值及字段数量。HLEN 为 O(1),适合快速检查规模。
HSTRLEN:获取字段值的字符串长度。
数值操作
HINCRBY:整数自增。支持负数增量。
HINCRBY stats:2023 page_views 1
HINCRBYFLOAT:浮点数自增。注意 IEEE 754 精度问题,建议客户端处理舍入。
高级遍历
HSCAN:增量迭代哈希表。解决 HGETALL 阻塞问题,适合大 Key 场景。
HSCAN user:1000 0 MATCH n* COUNT 10
参数说明:游标从 0 开始,MATCH 用于模式匹配,COUNT 控制单次返回数量。
编码与优化
Redis 底层会根据数据大小自动选择编码:
- ziplist:小 Hash(字段少、值小)使用紧凑存储,节省内存。
- hashtable:超过阈值(由 等配置控制)自动转为哈希表,查询更快但内存占用高。


