*Redis MGET 命令

返回所有(一个或多个)给定 key 的 value。


*语法

MGET key [key ...]

*参数说明

参数 类型 必填 说明
key String 至少一个键名

*返回值

条件 返回值
key 存在且为 String 返回 value
key 不存在 返回 nil
key 存在但非 String 返回 nil(不报错)

*时间复杂度

O(N),N 为 key 的数量。对单个 key 是 O(1)。


*示例

> SET k1 v1
> SET k2 v2
> SET k3 v3

> MGET k1 k2 k3
1) "v1"
2) "v2"
3) "v3"

# 包含不存在的 key
> MGET k1 nokey k2
1) "v1"
2) (nil)
3) "v2"

*常见错误

  1. 对非 String key 返回 nil:不会报错,但返回 nil。若需类型检查,先用 TYPE

*最佳实践

  1. 批量读取减少 RTT:一次 MGET 100 个 key,网络往返从 100 次降为 1 次,延迟降低 99%。
  2. 缓存穿透防护:MGET 返回的 nil 表示 key 不存在,业务层可填充默认值或回源数据库。
  3. Pipeline 替代:key 数量极大(>1000)时,用 Pipeline 分多个 MGET 批量请求,避免单次命令过大。

*FAQ

Q: MGET 和 Pipeline 多次 GET 有什么区别? A: 两者都减少 RTT,但 MGET 是原子一次请求,服务端并行读取;Pipeline 是批量发送多个独立命令。性能接近,MGET 更简洁。

Q: MGET 对不存在 key 为什么不报错? A: 设计如此,方便批量读取时区分存在和不存在。返回值顺序与请求 key 顺序一致。

Q: MGET 有数量限制吗? A: 没有硬性限制,但一次请求过大可能阻塞 Redis 或触发客户端缓冲区限制。建议单次 100-1000 个 key。