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


 

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

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

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

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

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

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM