您好,登錄后才能下訂單哦!
序言:
redis是一個key-value存儲系統。和Memcached類似,它支持存儲的value類型相對更多,包括string(字符串)、list(鏈表)、set(集合)、zset(sorted set --有序集合)和hash(哈希類型)。這些數據類型都支持push/pop、add/remove及取交集并集和差集及更豐富的操作,而且這些操作都是原子性的。在此基礎上,redis支持各種不同方式的排序。
“消息隊列”是 Microsoft 的消息處理技術,它在任何安裝 Microsoft Windows 的計算機組合中,為任何應用程序提供消息處理和消息隊列功能,無論這些計算機是否在同一個網絡上或者是否同時聯機。
“消息隊列網絡”是能夠相互間來回發送消息的任何一組計算機。網絡中的不同計算機在確保消息順利處理的過程中扮演不同的角色。它們中有些提供路由信息以確定如何發送消息,有些保存整個網絡的重要信息,而有些只是發送和接收消息。
Redis實現消息隊列有兩種形式:
廣播訂閱模式:基于Redis的 Pub/Sub 機制,一旦有客戶端往某個key里面 publish一個消息,所有subscribe的客戶端都會觸發事件集群訂閱模式:基于Redis List雙向+ 原子性 + BRPOP
Redis消息隊列時,當Redis宕機后,消息可能會丟失(也要看持久化的策略)。如果收消息方未有重發和驗證機制,Redis內的數據會出現丟失。所以,使用Redis的作為消息隊列,通常是對于消息的準確性并非特別高的場景。
如果絕對的保證數據最終一致性,保證消息百分百不丟,那么需要:
1.寫入時候要求啟用事務處理,保證寫一定成功。
2. redis配置成任何變更一定實時持久化,比如存儲端是磁盤的話,每次變更馬上同步寫入磁盤,才算完成。redis是支持這種方式配置的,但是這么做會使它的內存數據庫特性完全消失,性能變得十分低下。
3. 消費端也要實現事務方式,處理完成后,再回來真實刪除消息。
4. 多線程或者多端同時并發處理,可以通過鎖的方式來規避。
3 4的需求需要自己實現,可以一起考慮,用另外一個隊列實現的方式也可以,但是更好的方式是在隊列內部實現個計數器。hash格式的加個字段加數值,list的先推一個數值打底,string的頭上加個數值再加個分隔符,就可以做個簡單計數器了,雖然土,勝在夠實用。
除了特定的系統之外,一般不會要求這么強的一致性,實現倒不難,但是性能會很差很差。
銀行類支付類業務會要求嚴格的事務一致性,而互聯網類業務一般會用點取巧的方式,就是可以容忍極短時間內少量數據丟失的方式,換取更高性能。
比如上面的redis處理,可以改為1000條數據變更的時候再真實落盤,即寫入磁盤。那么極限情況下,如突然斷電,存在可能丟失這1000條數據的風險。當然這種情況出現的概率也是很低的(遠離藍翔挖掘機?),所以大部分場景下可以接受。
以上就是redis消息隊列如何防止數據丟失的詳細內容,更多請關注億速云其它相關文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。