2014-10-06 70 views
2

我使用Python创建如下Redis的管道:redis连接/管道的寿命?

rPipe = redis.Redis(...).pipeline() 

可变RPIPE在一个类中的__init__定义。

类中的函数执行设置得到命令时使用RPIPE用户调用。

rpipe.set(...) 

rpipe.execute() 

但据我了解,Redis的连接是通过Redis的服务器将自动关闭,所以多久一次我创建的对象我RPIPE将是有效的?

回答

3

在正常情况下(例如,除非您达到最大客户端数量或最大缓冲区大小的限制,或者客户端设置了特定超时),则Redis不会自动关闭客户端连接。

在Redis中,这是一种将命令组合在一起并将它们一次发送到服务器,然后在一个步骤中接收所有回复的简单方法。

假设你正在使用redis-py库(但同样的参数可以合理地适用于任何深思熟虑的客户),()当您在管道调用​​对象的命令被打包并传送到Redis的。然后,管道对象的状态被重置,客户端可以安全地重新使用它。作为一个方面说明,如果使用redis-py,请考虑流水线命令默认包装在MULTI/EXEC transaction中,这并不总是可取的。

+0

嘿!谢谢您的帮助。我确实需要原子组事务。它们对我的实施至关重要。 我在这里有一个后续问题:由于Redis不会自动关闭连接,并且我假设客户端没有API来执行此操作,所以在发生异常时会发生什么情况? redis-py会干净地释放资源吗? 由于Redis是单线程服务器,管道中查询的异常会安全吗? – 2014-10-07 06:05:21

+0

为什么你需要手动关闭连接? Redis-py使用连接池,即使在流水线命令或事务中也可以处理错误。请参阅redis-py [自述文件](https://github.com/andymccurdy/redis-py/blob/master/README.rst)doc和redis [transaction](http://redis.io/topics/transactions )处理更多细节。此外,管道的[测试文件](https://github.com/andymccurdy/redis-py/blob/master/tests/test_pipeline.py)包含有用的代码示例。 – 2014-10-07 08:04:02

+0

我会阅读更多关于连接池的信息。谢谢! – 2014-10-07 09:42:40