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

时间:2016-06-06 17:49:28

标签: java redis client

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

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

哪一种是理想的方法?

感谢。

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

2 个答案:

答案 0 :(得分:4)

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

管理连接通常由池实现完成。如果是生菜docs state

  

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

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

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

  

您使用阻止调用,例如BLPOPBRPOP,...来阻止整个连接。一旦连接被阻塞命令阻止,它将保持此状态,直到Redis以结果

响应

这些命令不会阻止Redis'单线程,他们等待某些事件发生(就像元素被添加到列表中)。你可以&因此,应该与Redis在另一个连接上进行交互。不这样做只会减慢你的速度 - 但是:如果你是唯一的客户,并且你计划编写导致事件的数据,那么如果你还想在写作之前阅读某些内容,你就会陷入僵局。

  

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

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

答案 1 :(得分:1)

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