如何安全地使用redis的pop命令

 

Redis的list經常被當作隊列使用,左進右出,一般生產者使用lpush壓入數據,消費者調用rpop取出數據。

這是很自然的行爲,然而有時會發現lpush成功,但rpop並沒有取到數據,特別是一些客戶端庫封裝了rpop操作,添加了調用者無感知的自動重試。數據憑空消失,找不到問題所在。

實際上,這是所有網絡類操作存在的共同的天生的問題,即網絡超時,pop的數據實際已在對應的連接中,但因爲調用者設定的超時被丟棄了。

如何解決這個問題?有多種可選方法,可根據實際採取其中一種。

方法一:調大Redis連接超時值,比如設置成3秒、5秒等,一般能保證6個9以上的成功率,這也是最簡單的優化方法。但有個副作用,即對其它異常反應變遲鈍了,爲降低這個影響,一般在實現時建立pop操作單獨一個Redis實例。

方法二:改用lrange+ltrim替代lpop,在處理成功後調用ltrim,這樣可做到至少處理一次。本方法時可能產生重複,調用者需要做密等處理。另外普通使用lrange+ltrim還會限定只能有一個消費者,如果是多消費者,則還需結合eval命令,藉助lua來實現多消息。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章