Redis怎么一次查多个值,灵活又高效的读取方法分享
- 问答
- 2026-01-07 04:01:34
- 11
在日常使用Redis时,我们经常会遇到一种情况:需要从Redis里获取好几个不同的数据,在一个电商网站的用户个人中心页面,我们可能需要同时显示出用户的昵称、最近浏览的商品、账户积分和未读消息数量,如果按照最直接的想法,我们可能会写四行代码,每一行都向Redis请求一个值,就像这样:
- 获取用户昵称:
GET user:123:name - 获取最近浏览:
LRANGE user:123:recent_views 0 4 - 获取账户积分:
GET user:123:points - 获取未读消息数:
GET user:123:unread_msg_count
这种方法,我们通常称之为“循环GET”或者“串行查询”,它虽然简单直观,但存在一个很大的问题:效率不高,因为每一次请求,你的应用程序(比如用Python、Java写的后端服务)都需要通过网络向Redis服务器发送一个命令,然后等待Redis返回结果,这个过程中,网络传输消耗的时间(我们称之为网络延迟)会累积起来,发一次命令可能很快,但如果一个页面需要几十个数据,发几十次命令,这个总延迟就会变得非常可观,从而拖慢整个页面的响应速度。
有没有更聪明的办法呢?答案是肯定的,Redis的设计者早就考虑到了这种需求,提供了几种能够一次性操作多个键值对的方法,核心思想就是“减少网络往返的次数”,下面就来分享几种既灵活又高效的方法。
第一种方法,也是最重要、最常用的方法:使用MGET命令。
MGET是“Multi-GET”的缩写,意思就是一次性获取多个值,它允许你在一个命令里,指定多个键的名字,然后Redis会一次性把这些键对应的值都返回给你。
还是上面那个例子,我们可以把四行代码合并成一行命令:
MGET user:123:name user:123:points user:123:unread_msg_count
对于列表类型的数据(如最近浏览商品),我们可以配合使用LRANGE,但MGET本身是针对字符串(String)类型的,更常见的做法是,把这条命令和获取列表的命令分开,但总体上仍然能大幅减少命令次数。
MGET的优势非常明显:
- 极大减少网络开销:无论你要获取1个值还是100个值,对于网络来说,都只发生了一次请求和一次响应,这比循环100次GET要快得多。
- 原子性操作:
MGET命令是原子性的,这意味着Redis在执行这个命令时,不会被其他命令打断,你能保证获取到的是一瞬间的快照。
但是MGET也有个小小的限制:它要求所有要获取的键都必须是同一个数据类型(通常是字符串类型),如果你的数据是多种类型的(比如有字符串,有哈希,有列表),那MGET就无能为力了。

第二种方法,适用于复杂数据结构:使用Pipeline(管道)。
Pipeline可以理解为一种“批处理”的技术,它不是Redis的一个特定命令,而是一种使用方式,它的原理是:你的应用程序可以把一连串不同的命令(可以是GET,也可以是HSET、LPOP等各种命令)先收集起来,然后一次性通过网络发送给Redis服务器,Redis服务器会按顺序执行所有这些命令,然后再把所有的结果打包,一次性返回给你的应用程序。
这就好比你去超市买东西,“循环GET”就像是你每拿一件商品就去收银台结一次账,而Pipeline则是把要买的所有商品都放进购物车,最后推去收银台一次性结账。
对于我们那个例子,使用Pipeline的话,我们可以这样做:
- 在代码中启动一个管道。
- 将
GET user:123:name、LRANGE user:123:recent_views 0 4、GET user:123:points、GET user:123:unread_msg_count这四个命令(注意,它们类型不同!)依次放入管道。 - 执行管道,然后一次性收到一个包含四个结果的列表。
Pipeline的优势在于其无与伦比的灵活性:
- 支持混合命令:你可以一次性发送不同类型的命令,完美解决了
MGET只能用于字符串的限制。 - 依然高效:和
MGET一样,它把多次网络往返压缩成了一次,效率提升显著。
第三种方法,当数据天然关联时:使用HGETALL或HMGET。

这种方法的前提是你的数据模型设计,如果我们把同一个用户的相关信息,都存储在一个Redis哈希(Hash)结构里,那么我们就可以利用哈希相关的命令来一次性读取。
我们可以设计一个哈希键叫 user:123:info,它里面包含了多个字段:
name: "张三"points: "1000"unread_msg_count: "5"
要获取所有这些信息,只需要一个命令:HGETALL user:123:info,这个命令会把这个哈希键里面的所有字段和值都返回给你。
如果你只需要其中几个字段,比如只要昵称和积分,还可以使用HMGET user:123:info name points,这样更精确。
这种方法的效率是最高的,因为只需要一个命令就能操作一个包含大量数据的逻辑单元,它的灵活性建立在你的数据规划之上,你需要事先决定哪些数据应该放在同一个哈希里,如果数据模型设计得好,这无疑是最佳实践。
- 简单字符串批量读,首选
MGET:当你要获取的多个数据都是简单的字符串值时,MGET是最直接、最高效的选择。 - 混合命令批量读,要用
Pipeline:当你的批量操作中包含不同类型的命令(比如又有读字符串,又有读列表)时,Pipeline是你的不二法门,它在保持高效的同时提供了最大的灵活性。 - 数据模型规划好,巧用
Hash结构:在设计数据存储时,如果能把逻辑上紧密相关的数据放在一个哈希结构中,那么使用HGETALL或HMGET会带来极致的一次性读取体验。
在实际项目中,这几种方法常常会根据不同的业务场景结合使用,理解它们的原理和优缺点,就能在面对“一次查多个值”的需求时,做出最灵活高效的选择。
参考了Redis官方文档对MGET、Pipeline、HGETALL等命令的说明,以及《Redis实战》等经典技术书籍中关于性能优化的相关章节。)
本文由瞿欣合于2026-01-07发表在笙亿网络策划,如有疑问,请联系我们。
本文链接:http://waw.haoid.cn/wenda/75975.html
