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