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,确认类型再下结论。