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 一次写入多个键是原子的,中间不会插入其他命令,但也无法部分成功;键值参数个数为奇数会直接报错,调用前在应用侧把参数拼装校验好。