Redis 每个应用程序生命周期一个连接

Redis one connection per application lifetime

我是 Redis 的新手,想知道在我的 Java 应用 运行 期间一直打开客户端连接是否是好的做法。此连接将被各种功能使用。

或者更好的选择:将每个连接的范围限定到该方法,然后连接、设置或获取数据,并在最后关闭连接。

哪种方法是理想的方法?

谢谢。

注意:我正在使用 lettuce Redis 客户端

与大多数与数据库服务器的连接一样,您需要保持连接打开。与发送 1 个请求数据包并几乎立即返回 1 个回复数据包相比,重新连接需要大量时间和 TCP 数据包。

管理连接通常由池实现完成。在生菜的情况下 docs state

lettuce provides connection pooling for Redis Standalone and Redis Sentinel-managed connections. While pooling is not necessary when using lettuce it can be handy for some certain scenarios. Lettuce connections are designed to be long-lived and feature auto-reconnection. Multiple threads can use one connection concurrently.

在这种情况下,我不会费心去创建一个池。不管怎样,Redis 都是单线程的,而对于 jedis 等其他库,您想要使用池的原因是它们的连接不是线程安全的。


正如 lettuce 的作者在评论中指出的那样,在某些情况下你应该,甚至必须使用多个连接。同样来自上面链接的相同文档:

You use blocking calls such as BLPOP, BRPOP, ... to not block the whole connection. Once a connection is blocked by a blocking command, it will stay in this state until Redis responds with the result

这些命令不会阻塞 Redis 的单线程,它们会等待特定事件的发生(比如将元素添加到列表中)。因此,您可以并且应该在另一个连接上与 Redis 交互。不这样做只会减慢你的速度 - 但是:如果你是唯一的客户并且你打算写入导致事件的数据,如果你还想在写入之前阅读一些东西,你可能会陷入僵局。

You use transactions (MULTI/EXEC). Transactions will switch your connection in a transactional state. Other threads which share the connection would fall unintentionally into the transaction.

在这种情况下,您基本上必须使用多个连接,因为它会影响代码的正确性。您在 transactions 期间突然得到 null 值 returned,这并不意味着没有存储任何值。即使您不检查 return 值,您的更改也可能会在您不注意的情况下回滚。

保持redis 连接打开是更好的选择。如果连接保持打开状态,它也不会为异步运行的程序带来任何问题。