连接池和多路复用
高效管理Redis连接
Redis示例代码通常打开一个连接,演示一个命令或功能,然后关闭。实际代码通常与服务器有短暂的通信爆发,中间有不活动的时间段。频繁地打开和关闭连接会涉及一些开销并导致效率低下。这意味着您可以通过尽可能减少单独的连接来提高生产代码的性能。
在自己的代码中管理连接可能会很棘手,因此Redis客户端库提供了一些帮助。连接管理的两种基本方法称为连接池和多路复用。redis-py
、jedis
和go-redis
客户端支持连接池,而NRedisStack
支持多路复用。Lettuce
支持这两种方法。
连接池
当你初始化一个连接池时,客户端会打开少量连接并将它们添加到池中。
每次你从连接池中“打开”一个连接时,客户端会返回其中一个现有的连接,并标记它正在使用中。
当你稍后“关闭”连接时,客户端会将其放回可用连接池中,而不会实际关闭它。
如果池中的所有连接都在使用中,但应用程序需要更多连接,那么客户端可以根据需要简单地打开新连接。通过这种方式,客户端最终会找到满足应用程序需求的正确连接数。
多路复用
与汇集多个连接不同,复用器保持一个单一连接开放,并用于客户端和服务器之间的所有通信。返回到您代码中的“连接”用于标识从您的命令发送响应数据的位置。
请注意,如果多路复用器在短时间内接收到多个命令,这并不是一个问题。当这种情况发生时,多路复用器通常可以将这些命令组合成一个管道,从而提高效率。
多路复用提供了高效率,但在您的应用程序中无需任何特殊代码即可透明地工作。与连接池相比,多路复用的主要缺点是它不能支持阻塞的“pop”命令(例如BLPOP
),因为这些命令会为所有调用者停滞连接。