首页/数据/数据库速查/HSET / HMSET 设置哈希字段
Redis 命令96 条

HSET / HMSET 设置哈希字段

Hash 是「键里套字段」结构:HSET 一次写一个或多个 field-value,返回新建字段数;HMSET 已被 HSET 取代(旧代码仍常见)。

数据库速查数据更新于 2026-10-13

哈希是什么

哈希是「键里再套字段」的结构,适合把一条业务对象的多个属性存在同一个键下:读单个字段不必取出整个对象,也能只更新某个属性。设置字段的命令一次可以写一个或多个字段值,返回的是新建字段的个数——更新已有字段不计入,所以返回零并不代表失败。这一点是排查业务逻辑时最容易踩空的地方。

基本信息

用途为哈希键设置字段值
语法写入命令 键 字段 值 [字段 值 ...]
返回值新建字段个数,更新已有字段计零
批量写法一条命令写多个字段,减少网络往返
相关命令读单字段、读多字段、读全部字段、删除字段、统计字段数
容量限制字段上限很大,实际受内存与操作耗时约束

典型使用场景

  • 存用户画像:姓名、等级、地区等属性放同一个键
  • 存商品快照:价格、库存、状态一起维护
  • 配置项分组:按业务模块划分哈希键
  • 会话信息:把会话的多个字段集中管理
  • 部分更新:只改一个属性而不重写整个对象
  • 属性与计数同存:在哈希里维护某个字段的计数值

示例

示例
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
字段自增字段值按整数自增运算后的新值
统计字段数返回字段总数字段数量
单个哈希的字段数量上限很大,真正的限制是内存与操作耗时:字段上千就该审视设计,考虑拆分成多个键,或换成更合适的数据结构。
一次设置多个字段比逐字段多次写入省网络往返,适合批量初始化;但单条命令过大同样会占用实例处理时间,批量写入要控制规模。
读取全部字段会一次性返回整个对象,字段多、值大时形成大响应,既占带宽也阻塞实例处理其他请求,读取前先确认对象规模。

哈希使用清单

  • 字段命名保持稳定,同一语义不要出现多种字段名
  • 对象字段过多时按访问频次拆成多个键
  • 批量初始化用一条命令写多个字段
  • 需要计数时用字段自增命令,而不是先读后写
  • 整体替换用一次写入覆盖,别用先删再建
  • 大对象读取要控制返回规模,必要时只读需要的字段
哈希适合把同一条记录的小字段聚在一起,但对象很大时它会变成热点:所有查询都落到同一个键,读放大与写放大都集中在单个分片上,规模大了要提前拆分。

易错点

  • 把返回值当成更新成功的数量:它只统计新建字段数,更新返回零并不表示失败
  • 用已标注弃用的批量写入命令写新代码:语义虽然等价,但统一到新命令能减少后续维护困扰
  • 对字段极多的哈希执行全量读取:一次性大响应拖慢实例与调用方,应改成按需读取字段
  • 用先读整个对象再写回的方式改一个字段:并发下互相覆盖,直接写单个字段即可避免
  • 忘记给哈希键设置过期:整个对象长期驻留内存,最终触发淘汰或内存告警

数据来源与参考

  • Redis 官方文档: HSET
  • Redis 官方文档: HMSET(已弃用)

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌