哈希是什么
哈希是「键里再套字段」的结构,适合把一条业务对象的多个属性存在同一个键下:读单个字段不必取出整个对象,也能只更新某个属性。设置字段的命令一次可以写一个或多个字段值,返回的是新建字段的个数——更新已有字段不计入,所以返回零并不代表失败。这一点是排查业务逻辑时最容易踩空的地方。
基本信息
| 用途 | 为哈希键设置字段值 |
|---|---|
| 语法 | 写入命令 键 字段 值 [字段 值 ...] |
| 返回值 | 新建字段个数,更新已有字段计零 |
| 批量写法 | 一条命令写多个字段,减少网络往返 |
| 相关命令 | 读单字段、读多字段、读全部字段、删除字段、统计字段数 |
| 容量限制 | 字段上限很大,实际受内存与操作耗时约束 |
典型使用场景
- 存用户画像:姓名、等级、地区等属性放同一个键
- 存商品快照:价格、库存、状态一起维护
- 配置项分组:按业务模块划分哈希键
- 会话信息:把会话的多个字段集中管理
- 部分更新:只改一个属性而不重写整个对象
- 属性与计数同存:在哈希里维护某个字段的计数值
示例
示例
HSET user:1001 name 张三 age 30 city 上海 # 返回 3,三个字段都是新建
HSET user:1001 age 31 # 返回 0,字段已存在,这里只是更新
HGET user:1001 name # 读取单个字段
HMGET user:1001 name city # 一次读多个字段
HGETALL user:1001 # 读取全部字段与值
HDEL user:1001 city # 删除指定字段
HLEN user:1001 # 统计字段数量常用命令对照
| 命令 | 作用 | 返回 |
|---|---|---|
| 写入字段 | 写一个或多个字段 | 新建字段个数 |
| 读单字段 | 读指定字段的值 | 值或空值 |
| 读多字段 | 一次读多个字段 | 按请求顺序返回值列表 |
| 读全部字段 | 返回整个对象 | 字段与值交替,大对象慎用 |
| 删除字段 | 删除指定字段 | 实际删除的字段数 |
| 判断字段 | 判断字段是否存在 | 存在返回 1 |
| 字段自增 | 字段值按整数自增 | 运算后的新值 |
| 统计字段数 | 返回字段总数 | 字段数量 |
单个哈希的字段数量上限很大,真正的限制是内存与操作耗时:字段上千就该审视设计,考虑拆分成多个键,或换成更合适的数据结构。
一次设置多个字段比逐字段多次写入省网络往返,适合批量初始化;但单条命令过大同样会占用实例处理时间,批量写入要控制规模。
读取全部字段会一次性返回整个对象,字段多、值大时形成大响应,既占带宽也阻塞实例处理其他请求,读取前先确认对象规模。
哈希使用清单
- 字段命名保持稳定,同一语义不要出现多种字段名
- 对象字段过多时按访问频次拆成多个键
- 批量初始化用一条命令写多个字段
- 需要计数时用字段自增命令,而不是先读后写
- 整体替换用一次写入覆盖,别用先删再建
- 大对象读取要控制返回规模,必要时只读需要的字段
哈希适合把同一条记录的小字段聚在一起,但对象很大时它会变成热点:所有查询都落到同一个键,读放大与写放大都集中在单个分片上,规模大了要提前拆分。