簡體   English   中英

在每個應用程序生命周期內重新連接一個連接

[英]Redis one connection per application lifetime

我是Redis的新手,我想知道在我的Java應用程序運行的整個過程中打開客戶端連接是否是一個好習慣。 此連接將由各種功能使用。

或者更好的選擇是:定義方法的每個連接,然后將連接,設置或獲取數據,並最后關閉連接。

理想的方法是哪一種?

謝謝。

注意:我正在使用生菜 Redis Client

與大多數與數據庫服務器的連接一樣,您將需要保持連接打開。 與發送1個請求數據包和獲得1個回復數據包幾乎立即返回相比,重新連接需要大量時間和TCP數據包。

管理連接通常是通過池實現來完成的。 如果生菜文檔狀態

lettuce為Redis Standalone和Redis Sentinel管理的連接提供連接池。 雖然使用生菜時池化不是必需的,但在某些情況下可能很方便。 生菜連接被設計為長期存在,並具有自動重新連接功能。 多個線程可以同時使用一個連接。

在這種情況下,我不會費心創建一個池。 Redis仍然是單線程的,之所以要與其他類似jedis庫一起使用池,是因為它們的連接不是線程安全的。


正如生菜的作者在評論中指出的那樣,在某些情況下,您甚至應該使用多個連接。 同樣來自上面鏈接的相同文檔:

您可以使用諸如BLPOPBRPOP ,...之類的阻塞調用來不阻塞整個連接。 連接被阻止命令阻止后,它將保持這種狀態,直到Redis響應結果為止

這些命令不會阻止Redis的單線程,它們會等待某些事件的發生(例如將元素添加到列表中)。 因此,您可以&應該在另一個連接上與Redis進行交互。 不這樣做只會減慢您的速度-但是:如果您是唯一的客戶端,並且您打算寫入導致事件的數據,那么如果您還想在寫入之前讀取某些內容,則可能使自己死鎖。

您使用事務( MULTI/EXEC )。 事務將在事務狀態下切換您的連接。 共享連接的其他線程將無意中落入事務中。

在這種情況下,您基本上必須使用多個連接,因為這會影響代碼的正確性。 您突然得到在交易期間返回的null值,這並不意味着沒有存儲任何值。 即使您不檢查返回值,您的更改也可能會在不注意的情況下被回滾。

保持redis連接打開是一個更好的選擇。 如果連接保持打開狀態,則對於異步運行的程序也不會產生任何問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM