尧图精选

Redis命令:HMSET

🕒 发布时间:2026/10/1 20:04:36 📁 来源:尧图网络
Redis HMSET 命令详细教程HMSET一次性设置 Hash 中多个字段的值返回简单的OK。它自 Redis 4.0.0 起被标记为弃用官方建议改用可接收多个字段值对的HSET。资料合集https://pan.quark.cn/s/10e98d308913、https://pan.quark.cn/s/f56bc69c5338一、概览与语法HMSET key field value [field value ...]项目说明数据类型Hash支持版本Redis 2.0.0 起4.0.0 起弃用keyHash 的 Key不存在时自动创建field value一组或多组字段与值必须成对出现返回值简单字符串OK时间复杂度O(N)N 为设置的字段数量ACLwrite、hash、fast命令标记write、denyoom、fast官方元数据明确记录deprecated_since: 4.0.0并给出替代方案HSETwith multiple field-value pairs。注意“弃用”不等于“移除”在多数版本中该命令仍可正常执行但新代码不应继续使用。$TRAE_REF二、基础示例以下命令在测试实例的 redis-cli 中执行。文中结果是预期说明未实际连接 Redis 运行。DEL tutorial:{hmset}:user HMSET tutorial:{hmset}:user name Alice city Shanghai age 30 HGETALL tutorial:{hmset}:user HMSET tutorial:{hmset}:user age 31 HGET tutorial:{hmset}:user age HLEN tutorial:{hmset}:user预期结果HMSET 返回OKHGETALL 返回 6 个元素再次 HMSET 更新 age 仍返回OKHGET 返回31HLEN 返回3说明更新已有字段不会增加字段数量。三、与 HSET 的关键差异这是使用 HMSET 时最容易踩坑的地方两者写入语义几乎相同但返回值完全不同。对比项HMSETHSET返回值简单字符串OK整数新增字段的数量是否支持多字段支持必须成对Redis 4.0.0 起支持弃用状态4.0.0 起弃用当前推荐参数个数要求至少一组字段值对至少一组字段值对DEL tutorial:{hmset}:cmp HSET tutorial:{hmset}:cmp a 1 b 2 HMSET tutorial:{hmset}:cmp a 9 HSET tutorial:{hmset}:cmp a 8预期结果第一次 HSET 返回2新增两个字段HMSET 更新已有字段返回OK最后一次 HSET 更新已有字段返回0。可见 HSET 的返回值能反映“新增了几个字段”而 HMSET 永远只回OK无法据此判断字段是新增还是覆盖。四、迁移到 HSET 的方式迁移非常简单把命令名替换为 HSET 即可参数结构完全一致。旧写法HMSET user name Alice city Shanghai 新写法HSET user name Alice city Shanghai需要注意两点事项说明返回值变化若代码依赖OK判断成功改用 HSET 后需改为判断是否为整数客户端方法名部分客户端仍保留hmset方法其内部可能已转为 HSET 调用原子性不变两者都是单条命令多字段写入仍是一个原子操作覆盖语义不变两者都会覆盖已有字段的值在 redis-py 中hmset方法已被标记为弃用推荐使用hset(name, mapping{...})。迁移时不要只改命令名却保留旧的返回值判断逻辑。五、覆盖、TTL 与错误情况场景行为Key 不存在自动创建 Hash字段已存在覆盖其值同时清除该字段已有的 TTLKey 是 String、List 等非 Hash报 WRONGTYPE 错误字段与值未成对报语法错误未提供任何字段值对报语法错误字段值非字符串类型值会被转为字符串存储数字、布尔同理字段级 TTL 在 Redis 7.4 及以后可用。需要特别注意的是HMSET 与 HSET 一样属于“赋值”而非“基于原值修改”因此会清除被覆盖字段的过期时间而 HINCRBY、HINCRBYFLOAT 这类在原值上运算的命令会保留 TTL。DEL tutorial:{hmset}:ttl HSET tutorial:{hmset}:ttl a 1 HEXPIRE tutorial:{hmset}:ttl 300 FIELDS 1 a HTTL tutorial:{hmset}:ttl FIELDS 1 a HMSET tutorial:{hmset}:ttl a 2 HTTL tutorial:{hmset}:ttl FIELDS 1 a预期结果设置 TTL 后 HTTL 返回正数HMSET 覆盖 a 之后 HTTL 变为-1说明 TTL 已被清除。六、客户端示例前提为已安装 redis-py 并准备好本地测试实例。示例同时给出旧方法与新写法便于迁移对照。importredis rredis.Redis(hostlocalhost,port6379,decode_responsesTrue)ktutorial:{hmset}:pythontry:r.delete(k)# 旧写法已弃用部分版本会提示警告print(r.hmset(k,{name:Alice,age:30}))# True# 推荐写法print(r.hset(k,mapping{city:Shanghai}))# 1新增字段数print(r.hset(k,mapping{name:Bob}))# 0更新已有字段print(r.hgetall(k))# {name: Bob, age: 30, city: Shanghai}finally:r.delete(k)r.close()JavaJedis示例try(JedisjedisnewJedis(localhost,6379)){MapString,StringdatanewHashMap();data.put(name,Alice);data.put(age,30);jedis.hset(tutorial:{hmset}:java,data);// 推荐System.out.println(jedis.hgetAll(tutorial:{hmset}:java));jedis.del(tutorial:{hmset}:java);}七、原子性与并发HMSET 是一条命令多个字段的写入在服务端原子完成不会出现“写了一半”的中间状态。但“先读取、再决定写什么”的流程仍不是原子的两次调用之间其他客户端可能已修改数据。需要基于旧值做条件写入时应使用 Lua 脚本或带 WATCH 的事务。另外多字段写入会一次性占用较多内存配额命令带有denyoom标记在内存达到上限且策略不允许写入时会被拒绝此时整条命令失败不会部分成功。八、练习、排错与总结练习新建tutorial:{hmset}:exercise用 HMSET 一次写入 a1、b2、c3确认返回OK用 HLEN 确认字段数为 3再用 HSET 写入相同的 a1观察返回0而非OK理解两者返回值的差异最后用 HGETALL 确认数据一致。排错要点收到弃用警告属预期改用 HSET 即可报“参数数量错误”时检查字段与值是否成对报 WRONGTYPE 时用 TYPE 确认类型写入后 TTL 消失属正常因为赋值会清除字段过期时间依赖OK判断成功的代码在迁移到 HSET 后必须同步调整。清理使用DEL tutorial:{hmset}:user tutorial:{hmset}:cmp tutorial:{hmset}:ttl tutorial:{hmset}:exercise。速记4.0.0 起弃用、返回OK不返回新增数、参数必须成对、迁移到 HSET 只需改命令名、赋值会清除字段 TTL。
上一篇/下一篇内容由系统自动关联 返回资讯列表 →