首页/数据/Redis 进阶速查/MGET/MSET 合并往返
性能与排障129 条

MGET/MSET 合并往返

把多次单键读写合并成 MGET/MSET:往返次数下降、总延迟更小;注意单条命令的参数规模与单次延迟上限。

Redis 进阶速查数据更新于 2026-10-13

MGET/MSET 省的是往返

把多次单键读写合并成 MGET/MSET,省下的是网络往返:一个请求内 N 条命令的 RTT 收敛成一条命令的一次往返,客户端与内核的系统调用次数同步减少。代价是单条命令更大,服务端要在一次调用里处理完所有键,占用主线程的时间更长,参数数量没有硬上限,规模要按实测控制。

基本信息

语法MGET key [key ...] 与 MSET key value [key value ...]
主要收益往返合并,命令条数带来的延迟累加被消除
主要代价单命令更大,主线程被单次调用占用更久
返回值MGET 按请求顺序返回值数组,缺失键位置为 nil
批次建议按业务批次拆分,规模用压测确定,不宜凭感觉放大

典型使用场景

  • 批量读取:一次取一批用户资料或配置项,替代循环单键 GET
  • 缓存回填:一次写入多个键,减少往返与连接占用
  • 批处理作业:分批读写并控制单批规模,避免长阻塞
  • 热点集中:把分散的小请求打包,降低总延迟
  • 集群环境:键跨槽时必须在客户端拆分为多次调用

常用写法

常用写法
redis-cli MGET key:1 key:2 key:3                 # 批量读,返回顺序与请求一致
redis-cli MSET key:1 v1 key:2 v2 key:3 v3        # 批量写,键值必须成对
redis-cli MGET k:1 k:2 k:3 k:4 k:5               # 小批次先验证语义与顺序
redis-cli MEMORY USAGE key:1                     # 看单键体积,决定批次大小
redis-cli INFO commandstats | grep -E 'mget|mset' # 观察调用量与单次耗时

使用要点

项说明注意
返回值顺序与请求键顺序一一对应按位置解析,不能当无序集合处理
缺失键对应位置返回 nil位置保留,方便与请求列表对齐
参数规模无硬性上限用压测定批量,避免单次长阻塞
集群模式同一次调用要求同槽跨槽需在客户端按槽拆分
批次大小同样要压测:批量过大时单条命令长时间占用主线程,其他客户端排队,尾延迟反而变差。经验方向是值越大、批越小。
MSET 一次写入多个键是原子的,中间不会插入其他命令,但也无法部分成功;键值参数个数为奇数会直接报错,调用前在应用侧把参数拼装校验好。

易错点

  • 超大批量命令长时间占用主线程:其他客户端排队等待,尾延迟恶化,故障时放大影响面
  • 只看往返收益不看单命令规模:批量堆到几千个键后,一次调用本身就成了新的阻塞点
  • 把 MGET 返回值当无序结果:顺序与请求键严格对应,按位置解析才不会错位
  • 集群模式下 MGET 跨槽:命令会因键不在同一槽而失败,需要在客户端按槽拆分后再合并结果

数据来源与参考

  • Redis 官方文档:批量命令
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌