2014-10-06 68 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