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

sar*_*gas 5 java client redis

我是Redis的新手,想知道在我的Java应用程序运行的整个过程中打开客户端连接是否是一个好习惯.该连接将由各种功能使用.

或者替代方案更好:确定方法的每个连接,然后连接,设置或获取数据,最后关闭连接.

哪一个是理想的方法?

谢谢.

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

zap*_*apl 5

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

管理连接通常由池实现来完成。如果是生菜,文档说明

lettuce 为 Redis Standalone 和 Redis Sentinel 管理的连接提供连接池。虽然使用生菜时不需要池化,但在某些特定情况下池化可能会很方便。Lettuce 连接的设计寿命长,并且具有自动重新连接的功能。多个线程可以同时使用一个连接。

在这种情况下,我不会费心去创建一个池。jedis无论如何,Redis 是单线程的,而像其他库一样,您想要使用池的原因是因为它们的连接不是线程安全的。


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

您可以使用诸如BLPOP, BRPOP, ... 之类的阻塞调用来不阻塞整个连接。一旦连接被阻塞命令阻塞,它将保持这种状态,直到 Redis 响应结果

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

您使用事务 ( MULTI/EXEC)。事务会将您的连接切换到事务状态。共享连接的其他线程将无意中陷入事务中。

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

  • 总体上同意答案,但池的使用取决于您的用例。使用事务或阻塞操作是使用连接池的一个很好的理由。在所有其他情况下,池化只是浪费资源。Lettuce 连接提供自动重新连接,因此 Lettuce 用户不会看到断开的连接(除非 Lettuce 配置为拒绝断开连接上的命令)。 (2认同)