欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

在redis中防止消息丟失的機(jī)制

 更新時間:2023年02月08日 08:26:09   作者:葉 秋  
在項目中,由于網(wǎng)絡(luò)問題,我們很難保證生產(chǎn)者發(fā)送的消息能100%到達(dá)消息隊列服務(wù)器,也就是說有消息丟失的可能性,因 此,生產(chǎn)者就必須具有消息丟失檢測和重發(fā)機(jī)制,這篇文章主要介紹了如何在redis中防止消息丟失,需要的朋友可以參考下

如何在redis中防止消息丟失

前言

在項目中,由于網(wǎng)絡(luò)問題,我們很難保證生產(chǎn)者發(fā)送的消息能100%到達(dá)消息隊列服務(wù)器,也就是說有消息丟失的可能性,因 此,生產(chǎn)者就必須具有消息丟失檢測和重發(fā)機(jī)制,也就是我們常說的消息隊列的事物機(jī)制。

不能把可靠性的保證全部交給TCP,TCP只保證了傳輸層的可靠傳輸,但是無法保證與應(yīng)用層的交互是否出錯 TCP無法給應(yīng)用層任何反饋,因此必須在應(yīng)用層處理差錯

同步的事務(wù)——停止等待

所謂停止等待協(xié)議就是沒發(fā)送完一組數(shù)據(jù)后,等待對方確認(rèn)并且收到確認(rèn)后,再發(fā)送下一組數(shù)據(jù)。

在這里插入圖片描述

同步的事務(wù)——連續(xù)ARQ

類似于TCP的滑動窗口模型

在這里插入圖片描述

異步的事務(wù)——回調(diào)機(jī)制

生產(chǎn)者在發(fā)送消息的時候,注冊一個回調(diào)函數(shù),這樣生產(chǎn)者便不用停下來等待確認(rèn)了,而是可以一直持續(xù)發(fā)送消息,當(dāng)消息到達(dá)消息隊列服務(wù)器的時候,服務(wù)器便會調(diào)用生產(chǎn)者注冊的回調(diào)函數(shù),告知生產(chǎn)者消息發(fā)送成功了還是失敗了,進(jìn)而做進(jìn)一步的處理,從而提高了并發(fā)量。

在這里插入圖片描述

消息的冪等處理

由于網(wǎng)絡(luò)原因,生產(chǎn)者可能會重復(fù)發(fā)送消息,因此消費者方必須做消息的冪等處理,常用的解決方案有:

  • 查詢操作:查詢一次和查詢多次,在數(shù)據(jù)不變的情況下,查詢結(jié)果是一樣的。select是天然的冪等操作;
  • 刪除操作:刪除操作也是冪等的,刪除一次和多次刪除都是把數(shù)據(jù)刪除。(注意可能返回結(jié)果不一樣,刪除的數(shù)據(jù)不存在,返回0,刪除的數(shù)據(jù)多條,返回結(jié)果多個) ;
  • 唯一索引,防止新增臟數(shù)據(jù)。比如:支付寶的資金賬戶,支付寶也有用戶賬戶,每個用戶只能有一個資金賬戶,怎么防止給用戶創(chuàng)建資金賬戶多個,那么給資金賬戶表中的用戶ID加唯一索引,所以一個用戶新增成功 一個資金賬戶記錄。要點:唯一索引或唯一組合索引來防止新增數(shù)據(jù)存在臟數(shù)據(jù)(當(dāng)表存在唯一索引,并發(fā) 時新增報錯時,再查詢一次就可以了,數(shù)據(jù)應(yīng)該已經(jīng)存在了,返回結(jié)果即可);
  • token機(jī)制,防止頁面重復(fù)提交。業(yè)務(wù)要求: 頁面的數(shù)據(jù)只能被點擊提交一次;發(fā)生原因: 由于重復(fù)點擊或 者網(wǎng)絡(luò)重發(fā),或者nginx重發(fā)等情況會導(dǎo)致數(shù)據(jù)被重復(fù)提交;解決辦法: 集群環(huán)境采用token加redis(redis單 線程的,處理需要排隊);單JVM環(huán)境:采用token加redis或token加jvm內(nèi)存。處理流程:1. 數(shù)據(jù)提交前要向 服務(wù)的申請token,token放到redis或jvm內(nèi)存,token有效時間;2. 提交后后臺校驗token,同時刪除 token,生成新的token返回。token特點:要申請,一次有效性,可以限流。注意:redis要用刪除操作來判 斷token,刪除成功代表token校驗通過,如果用select+delete來校驗token,存在并發(fā)問題,不建議使用;
  • 悲觀鎖——獲取數(shù)據(jù)的時候加鎖獲取。select * from table_xxx where id=‘xxx’ for update; 注意:id字段一 定是主鍵或者唯一索引,不然是鎖表,會死人的悲觀鎖使用時一般伴隨事務(wù)一起使用,數(shù)據(jù)鎖定時間可能會 很長,根據(jù)實際情況選用;
  • 樂觀鎖——樂觀鎖只是在更新數(shù)據(jù)那一刻鎖表,其他時間不鎖表,所以相對于悲觀鎖,效率更高。樂觀鎖的 實現(xiàn)方式多種多樣可以通過version或者其他狀態(tài)條件:1. 通過版本號實現(xiàn)update table_xxx set name=#name#,version=version+1 where version=#version#如下圖(來自網(wǎng)上);2. 通過條件限制 update table_xxx set avai_amount=avai_amount-#subAmount# where avai_amount-#subAmount# >= 0要求: quality-#subQuality# >= ,這個情景適合不用版本號,只更新是做數(shù)據(jù)安全校驗,適合庫存模型,扣份額和 回滾份額,性能更高;
  • 分布式鎖——還是拿插入數(shù)據(jù)的例子,如果是分布是系統(tǒng),構(gòu)建全局唯一索引比較困難,例如唯一性的字段沒法 確定,這時候可以引入分布式鎖,通過第三方的系統(tǒng)(redis或zookeeper),在業(yè)務(wù)系統(tǒng)插入數(shù)據(jù)或者更新數(shù)據(jù),獲 取分布式鎖,然后做操作,之后釋放鎖,這樣其實是把多線程并發(fā)的鎖的思路,引入多多個系統(tǒng),也就是分布式系 統(tǒng)中得解決思路。要點:某個長流程處理過程要求不能并發(fā)執(zhí)行,可以在流程執(zhí)行之前根據(jù)某個標(biāo)志(用戶ID+后綴 等)獲取分布式鎖,其他流程執(zhí)行時獲取鎖就會失敗,也就是同一時間該流程只能有一個能執(zhí)行成功,執(zhí)行完成 后,釋放分布式鎖(分布式鎖要第三方系統(tǒng)提供);
  • select + insert——并發(fā)不高的后臺系統(tǒng),或者一些任務(wù)JOB,為了支持冪等,支持重復(fù)執(zhí)行,簡單的處理方法 是,先查詢下一些關(guān)鍵數(shù)據(jù),判斷是否已經(jīng)執(zhí)行過,在進(jìn)行業(yè)務(wù)處理,就可以了。注意:核心高并發(fā)流程不要用這 種方法;

到此這篇關(guān)于如何在redis中防止消息丟失的文章就介紹到這了,更多相關(guān)redis防止消息丟失內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Redis內(nèi)存回收策略

    Redis內(nèi)存回收策略

    這篇文章主要介紹了Redis內(nèi)存回收策略,需要的朋友可以參考下
    2007-02-02
  • redis初學(xué)者常見字符亂碼問題及解決方案

    redis初學(xué)者常見字符亂碼問題及解決方案

    這篇文章主要介紹了redis初學(xué)者常見字符亂碼問題及解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • Redis+IDEA實現(xiàn)單機(jī)鎖和分布式鎖的過程

    Redis+IDEA實現(xiàn)單機(jī)鎖和分布式鎖的過程

    這篇文章主要介紹了Redis+IDEA實現(xiàn)單機(jī)鎖和分布式鎖的過程,本文通過示例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-07-07
  • Redis?的內(nèi)存淘汰策略和過期刪除策略的區(qū)別

    Redis?的內(nèi)存淘汰策略和過期刪除策略的區(qū)別

    這篇文章主要介紹了Redis?的內(nèi)存淘汰策略和過期刪除策略的區(qū)別,Redis?是可以對?key?設(shè)置過期時間的,因此需要有相應(yīng)的機(jī)制將已過期的鍵值對刪除,而做這個工作的就是過期鍵值刪除策略
    2022-07-07
  • redis底層數(shù)據(jù)結(jié)構(gòu)之ziplist實現(xiàn)詳解

    redis底層數(shù)據(jù)結(jié)構(gòu)之ziplist實現(xiàn)詳解

    這篇文章主要為大家介紹了redis底層數(shù)據(jù)結(jié)構(gòu)之ziplist實現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-12-12
  • redis執(zhí)行l(wèi)ua腳本的實現(xiàn)方法

    redis執(zhí)行l(wèi)ua腳本的實現(xiàn)方法

    redis在2.6推出了腳本功能,允許開發(fā)者使用Lua語言編寫腳本傳到redis中執(zhí)行。本文就介紹了redis執(zhí)行l(wèi)ua腳本的實現(xiàn)方法,感興趣的可以了解一下
    2021-11-11
  • redis如何實現(xiàn)清空緩存

    redis如何實現(xiàn)清空緩存

    這篇文章主要介紹了redis如何實現(xiàn)清空緩存,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • Redis 刪除策略的三種實現(xiàn)

    Redis 刪除策略的三種實現(xiàn)

    本文主要介紹了Redis 刪除策略的三種實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • Redis持久化與主從復(fù)制的實踐

    Redis持久化與主從復(fù)制的實踐

    這篇文章主要介紹了Redis持久化與主從復(fù)制的實踐,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • Window server中安裝Redis的超詳細(xì)教程

    Window server中安裝Redis的超詳細(xì)教程

    這篇文章主要介紹了Window server中安裝Redis的教程,本文通過圖文實例代碼相結(jié)合給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-11-11

最新評論