首页/数据/数据库速查/MSET / MGET 批量读写
Redis 命令96 条

MSET / MGET 批量读写

一次网络往返读写多键,降低 RTT;MGET 只支持字符串、不存在的位置返回 nil;MSET 原子性仅保证一起返回,不代表事务。

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

MSET / MGET 是什么

MSET 与 MGET 用一条命令读写多个字符串键,把 N 次网络往返压缩成 1 次,是降低 RTT 最直接的手段。MGET 按传入顺序返回结果,键不存在或类型不是字符串时该位置返回 nil。它们只作用于字符串类型,也并不是事务。

基本信息

语法MSET key value [key value ...] / MGET key [key ...]
返回MSET 返回 OK;MGET 返回按序结果列表
类型限制只支持 string,Hash/ZSet 等类型的位置返回 nil
集群限制多键必须落在同一槽,否则报 CROSSSLOT
原子性MSET 一次写入多个键,但不提供回滚与条件判断

典型使用场景

  • 批量预热缓存:配置项、字典表、功能开关一次性灌入
  • 一次取回一批用户资料,把 20 次 GET 合并成 1 次 MGET
  • 跨机房或高延迟链路上优化,用批处理吞掉 RTT 成本
  • 活动开始前批量写入静态数据,避免开抢瞬间压力集中在单键
  • 脚本与定时任务里成批写状态,减少连接占用与往返次数

基本用法

基本用法
MSET cfg:a 1 cfg:b 2 cfg:c 3        # 一次写多个键
MGET cfg:a cfg:missing cfg:c        # 按序返回 1) "1"  2) (nil)  3) "3"
MSETNX lock:a 1 lock:b 1            # 任一键已存在则整体不写,返回 0
HSET user:1 name 张三               # 注意这里是 Hash 类型
MGET user:1                         # (nil):类型不匹配也是 nil,不是报错
redis-cli --raw MGET cfg:a cfg:c    # --raw 去掉引号,便于脚本取值

同类命令对比

命令作用注意
MSET批量覆盖写入字符串键不返回旧值,覆盖即丢失
MGET按序批量读取字符串键缺失与类型不符都是 nil
MSETNX所有键都不存在时才写入任一键存在则整体不执行
GET / SET单键读写键数量多时 RTT 成本被放大
批量键数要控制:单命令参数过多会让单线程处理时间变长、响应包变大,实践上每批 100 到 500 个键;集群模式用 hash tag(例如 user:{1001}:name)把相关键固定到同一槽。
需要「一起成功」的语义时用 MULTI/EXEC 或 Lua:MSET 只保证多个键在同一条命令里被写入,不提供条件判断、也不会因为中间出错而回滚。
用 MGET 的结果判断键是否存在并不可靠:非字符串类型同样返回 nil。排查数据问题时先对可疑键执行 TYPE,确认类型再下结论。

易错点

  • 以为 MSET 是事务:中间出错不会回滚,也拿不到「部分成功」的结构化信息
  • 在集群模式直接 MSET 多个不同前缀的键:报 CROSSSLOT,需要 hash tag 或改键设计
  • 把 MGET 返回的 nil 一律当成键不存在:类型不匹配也是 nil,容易误判
  • 一次 MGET 上千个键:响应包变大、单线程阻塞变长,高峰期把延迟放大

数据来源与参考

  • Redis 官方文档: MSET
  • Redis 官方文档: MGET

相关工具

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