最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

如何在redis中防止消息丟失

前言

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

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

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

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

在這里插入圖片描述

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

類似于TCP的滑動(dòng)窗口模型

在這里插入圖片描述

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

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

在這里插入圖片描述

消息的冪等處理

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

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

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

相關(guān)文章

  • Redis中哈希結(jié)構(gòu)(Dict)的實(shí)現(xiàn)

    Redis中哈希結(jié)構(gòu)(Dict)的實(shí)現(xiàn)

    本文主要介紹了Redis中哈希結(jié)構(gòu)(Dict)的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • 超強(qiáng)、超詳細(xì)Redis數(shù)據(jù)庫(kù)入門教程

    超強(qiáng)、超詳細(xì)Redis數(shù)據(jù)庫(kù)入門教程

    這篇文章主要介紹了超強(qiáng)、超詳細(xì)Redis入門教程,本文詳細(xì)介紹了Redis數(shù)據(jù)庫(kù)各個(gè)方面的知識(shí),需要的朋友可以參考下
    2014-10-10
  • Redis密碼設(shè)置與訪問(wèn)限制實(shí)現(xiàn)方法

    Redis密碼設(shè)置與訪問(wèn)限制實(shí)現(xiàn)方法

    這篇文章主要介紹了Redis密碼設(shè)置與訪問(wèn)限制實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-11-11
  • redis中key使用冒號(hào)分隔的原理小結(jié)

    redis中key使用冒號(hào)分隔的原理小結(jié)

    Redis是一種高性能的鍵值對(duì)非關(guān)系型數(shù)據(jù)庫(kù),通過(guò)redis不同類型命令可以為其中的鍵指定不同的數(shù)據(jù)類型,其中每個(gè)鍵的命名規(guī)范通常使用冒號(hào)符號(hào)分隔字符串,本文主要介紹了redis中key使用冒號(hào)分隔的原理小結(jié),感興趣的可以了解一下
    2024-01-01
  • Redis教程(十二):服務(wù)器管理命令總結(jié)

    Redis教程(十二):服務(wù)器管理命令總結(jié)

    這篇文章主要介紹了Redis教程(十二):服務(wù)器管理命令總結(jié),本文講解了CONFIGGETparameter、CONFIG SETparameter value、FLUSHALL等命令,需要的朋友可以參考下
    2015-04-04
  • redis執(zhí)行redis命令的方法教程

    redis執(zhí)行redis命令的方法教程

    這篇文章主要給大家介紹了在redis中執(zhí)行redis命令的方法教程,文中詳細(xì)介紹了關(guān)于Redis 命令及在遠(yuǎn)程服務(wù)上執(zhí)行命令的方法,介紹的非常詳細(xì),對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起看看吧。
    2017-06-06
  • 使用Redis防止重復(fù)發(fā)送RabbitMQ消息的方法詳解

    使用Redis防止重復(fù)發(fā)送RabbitMQ消息的方法詳解

    今天遇到一個(gè)問(wèn)題,發(fā)送MQ消息的時(shí)候需要保證不會(huì)重復(fù)發(fā)送,注意不是可靠到達(dá),這里保證的是不會(huì)生產(chǎn)多條一樣的消息,所以本文主要介紹了使用Redis防止重復(fù)發(fā)送RabbitMQ消息的方法,需要的朋友可以參考下
    2025-01-01
  • 使用Redis實(shí)現(xiàn)微信步數(shù)排行榜功能

    使用Redis實(shí)現(xiàn)微信步數(shù)排行榜功能

    這篇文章主要介紹了使用Redis實(shí)現(xiàn)微信步數(shù)排行榜功能,本文通過(guò)圖文實(shí)例代碼相結(jié)合給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-06-06
  • 使用Grafana監(jiān)控Redis的操作方法

    使用Grafana監(jiān)控Redis的操作方法

    這篇文章主要介紹了使用Grafana監(jiān)控Redis,號(hào)稱下一代可視化監(jiān)控系統(tǒng),結(jié)合SpringBoot使用,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-04-04
  • Redis高并發(fā)防止秒殺超賣實(shí)戰(zhàn)源碼解決方案

    Redis高并發(fā)防止秒殺超賣實(shí)戰(zhàn)源碼解決方案

    本文主要介紹了Redis高并發(fā)防止秒殺超賣實(shí)戰(zhàn)源碼解決方案,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-10-10

最新評(píng)論

霍邱县| 伊金霍洛旗| 友谊县| 镇原县| 泰顺县| 平江县| 大名县| 肇州县| 南京市| 五峰| 静宁县| 禄丰县| 中卫市| 商南县| 楚雄市| 西安市| 英超| 滨海县| 旌德县| 北宁市| 昌宁县| 松滋市| 盐池县| 木兰县| 玛沁县| 深州市| 舟曲县| 珲春市| 广安市| 阜平县| 阿拉善右旗| 越西县| 黄平县| 铜山县| 天水市| 湟源县| 迭部县| 社旗县| 黄龙县| 巴林右旗| 通海县|