与大多数与数据库服务器的连接一样,您需要保持连接打开。与发送 1 个请求数据包并几乎立即返回 1 个回复数据包相比,重新连接需要花费大量时间和 TCP 数据包。
管理连接通常由池实现来完成。如果是生菜,文档说明
lettuce 为 Redis Standalone 和 Redis Sentinel 管理的连接提供连接池。虽然使用生菜时不需要池化,但在某些特定情况下池化可能会很方便。Lettuce 连接的设计寿命长,并且具有自动重新连接的功能。多个线程可以同时使用一个连接。
在这种情况下,我不会费心去创建一个池。jedis无论如何,Redis 是单线程的,而像其他库一样,您想要使用池的原因是因为它们的连接不是线程安全的。
正如 Lettuce 的作者在评论中指出的那样,在某些情况下您应该甚至必须使用多个连接。也来自上面链接的同一文档:
您可以使用诸如
BLPOP,BRPOP, ... 之类的阻塞调用来不阻塞整个连接。一旦连接被阻塞命令阻塞,它将保持这种状态,直到 Redis 响应结果
这些命令不会阻塞 Redis 的单线程,它们会等待某些事件发生(例如将元素添加到列表中)。因此,您可以并且应该在另一个连接上与 Redis 交互。不这样做只会减慢你的速度 - 但是:如果你是唯一的客户端,并且你打算写入导致事件的数据,如果你还想在写入之前读取某些内容,那么你可能会陷入僵局。
您使用事务 (
MULTI/EXEC)。事务会将您的连接切换到事务状态。共享连接的其他线程将无意中陷入事务中。
在这种情况下,您基本上必须使用多个连接,因为它会影响代码的正确性。您在交易期间突然得到null返回值,这并不意味着没有存储任何值。即使您不检查返回值,您的更改也可能会在您不注意的情况下回滚。