国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

redis高級(jí)篇 緩存雙寫一致性之更新策略

這篇具有很好參考價(jià)值的文章主要介紹了redis高級(jí)篇 緩存雙寫一致性之更新策略。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

閑聊

緩存通用查詢3部曲

  1. redis 中數(shù)據(jù),返回redis 中的數(shù)據(jù)
  2. redis 中沒有,查詢數(shù)據(jù)庫并返回
  3. 完成第二部的同時(shí),將數(shù)據(jù)庫查詢結(jié)果寫到redis,redis和數(shù)據(jù)庫數(shù)據(jù)一致.

談?wù)勲p寫一致性的理解

1.如果redis 中有數(shù)據(jù):需要和數(shù)據(jù)庫中的相同
2.如果redis 中無數(shù)據(jù): 數(shù)據(jù)庫中的值如果是最新的,則要寫入到redis

redis 緩存種類

  1. 只讀(通過命令的方式寫入,不是由我們的java程序,不常用)
  2. 讀寫(常用)

redis 讀寫緩存的策略

  1. 同步直寫策略
    寫數(shù)據(jù)后,也同步寫到redis,緩存和數(shù)據(jù)庫中的數(shù)據(jù)一致。
    對(duì)于讀寫緩存來說,要想保證緩存和數(shù)據(jù)庫中的數(shù)據(jù)一致,就要采用同步直寫策略
  2. 異步緩存策略
    正常業(yè)務(wù)運(yùn)行中,一定時(shí)間后才將數(shù)據(jù)寫到redis(比如下單后的快遞信息)
    異常情況出現(xiàn)后,需要將失敗的動(dòng)作進(jìn)行修補(bǔ),有可能需要借助mq等消息隊(duì)列。

問題

1. 如果使用redis,那就回涉及到redis 緩存與數(shù)據(jù)庫雙寫問題。是先動(dòng)redis呢,還是先動(dòng)mysql?

首先我們的目的是明確的:就是保證redis和mysql的一致性。

給緩存設(shè)置過期時(shí)間,定期清理緩存并會(huì)寫,是最終保證一致性的解決方案。
我們可以對(duì)緩存數(shù)據(jù)設(shè)置過期時(shí)間,所有的寫以數(shù)據(jù)庫為準(zhǔn),對(duì)緩存操作盡最大
努力即可。也就是說數(shù)據(jù)庫寫入成功,而緩存寫入失敗,那么只要達(dá)到過期時(shí)間,
則后面的請(qǐng)求會(huì)從數(shù)據(jù)庫中讀取新值回寫緩存。從而達(dá)到最終一致性。

在了解一下4中更新策略

  1. 先更新數(shù)據(jù)庫,在更新緩存
    如果更新mqsql 成功,redis 失敗,則數(shù)據(jù)不一致
    緩存中使錯(cuò)誤的數(shù)據(jù),數(shù)據(jù)不一致,且高并發(fā)下問題更是嚴(yán)重
    redis高級(jí)篇 緩存雙寫一致性之更新策略

  2. 線程緩存,在更新數(shù)據(jù)庫
    如果redis 成功,mqsql失敗,則數(shù)據(jù)不一致

redis高級(jí)篇 緩存雙寫一致性之更新策略
3. 先刪除緩存,在更新數(shù)據(jù)庫
如果redis 刪除成功, 數(shù)據(jù)庫刪除失敗,則數(shù)據(jù)不一致
下面有問題的代碼
redis高級(jí)篇 緩存雙寫一致性之更新策略

A線程執(zhí)行下面的代碼,刪除緩存后,正在更新數(shù)據(jù)庫,
線程B要獲取這個(gè)緩存 ,沒有查到,線程B就把數(shù)據(jù)回寫到緩存,
然后線程A更新完數(shù)據(jù)庫后,發(fā)現(xiàn)緩存還在
導(dǎo)致緩存中一直都是錯(cuò)的數(shù)據(jù)。

處理辦法1 延遲雙刪除
這個(gè)方案在第一次刪除之后,延遲一段時(shí)間再次進(jìn)行刪除,所以我們把它叫做“延遲雙栓”
redis高級(jí)篇 緩存雙寫一致性之更新策略

  1. 先更新數(shù)據(jù)庫,在刪除緩存 (可用,也有問題,但是比上面的3種更好)
    如果mqsql成功,redis 失敗,只要是mysql 是正確的,下次通過回寫到reids,保證一致性
    ali的cannel也是這個(gè)思想, myssql有個(gè)中間件canel,可以完成biglog日志訂閱功能。 先更新數(shù)據(jù)庫,在更新緩存。
    redis高級(jí)篇 緩存雙寫一致性之更新策略
如果上述的問題也不能容忍(在通過在get一次,以取得正確的數(shù)據(jù)),那我們只能借助mq與mysql的binlog日志了
redis高級(jí)篇 緩存雙寫一致性之更新策略

1.我們可以監(jiān)聽 binlog 日志, 但我們知道那些key 和那些表的關(guān)系的時(shí)。我們便可以篩選出我們要監(jiān)聽的sql語句了。
2.當(dāng)監(jiān)聽到 執(zhí)行刪除緩存關(guān)聯(lián)的sql語句時(shí),便把這個(gè)key放到消息隊(duì)列。
3.通過mq 中消息執(zhí)行刪除操作。刪除成功則已出,刪除失敗重試。如果重試次數(shù)較多,加入死信隊(duì)列,后續(xù)處理,排查故障。

但是這樣做有一定的延遲性。比如充值話費(fèi),高峰期;1分鐘后到賬。

2.了解延遲雙刪嗎

延遲雙刪,
是指在第一次刪除之后,延遲一段時(shí)間再次進(jìn)行刪除,所以我們把它叫做“延遲雙栓”。 目的是 在第一次刪除和第二次刪除之前,防止有別的線程將值回寫到reids.

線程A sleep的時(shí)間,需要大于線程B讀取數(shù)據(jù)在寫入緩存的時(shí)間。
這個(gè)時(shí)間該怎么確定呢?
第一種方法:
在業(yè)務(wù)運(yùn)行的時(shí)候統(tǒng)計(jì)下線程讀取數(shù)據(jù)與寫回?cái)?shù)據(jù)的時(shí)間 T1。結(jié)合自己業(yè)務(wù),只要保證雙刪之間的時(shí)間 大于T1百毫秒即可。

第二種方法:
新啟動(dòng)后臺(tái)監(jiān)控程序,后面將會(huì)提到 watchDog監(jiān)控程序。

這種同步刪除降低吞吐量怎么辦?
因?yàn)橐獎(jiǎng)h除2次,所以吞吐量會(huì)降低,另起一個(gè)線程,異步刪除。
redis高級(jí)篇 緩存雙寫一致性之更新策略

3. 微服務(wù)查詢r(jià)edis無,mysql有。為了保證雙寫一致性,會(huì)寫redis 時(shí)需要注意什么?,了解雙檢加鎖嗎,如何避免緩存擊穿?

一般情況下,使用上面的緩存三部曲即可,但如果是高并發(fā)就不行了。想想看,
統(tǒng)一時(shí)刻有1000個(gè)請(qǐng)求過來,代碼都執(zhí)行 判斷redis中有無數(shù)據(jù),也就是要
1000次,接著因?yàn)閞edis中沒有,又是1000次訪問數(shù)據(jù)庫,再接著又是1000次
的會(huì)寫redis. 這個(gè)在高并發(fā)下,明顯是不可取的。
所有出現(xiàn) 雙檢加鎖。

那什么是雙檢加鎖呢?

 public String doubleCheckCache() {
        // 先從redis 中查詢
        String key = "user:1000";
        String s = stringRedisTemplate.opsForValue().get(key);
        if (!StringUtils.hasLength(s)) {
            // 加鎖,防止qps高時(shí),同時(shí)查到redis中無數(shù)據(jù)的情況下,繼續(xù)訪問數(shù)據(jù)庫。防止緩存擊穿。
            synchronized (this) {
                // 再次檢查redis,第一個(gè)進(jìn)入同步的線程,已經(jīng)將數(shù)據(jù)寫回了redis
                s = stringRedisTemplate.opsForValue().get(key);
                if (!StringUtils.hasLength(s)) {
                    //模擬查詢數(shù)據(jù)庫
                    s = "我是小明";
                    // 會(huì)寫redis
                    stringRedisTemplate.opsForValue().setIfAbsent(key,s);
                    // 這里要考慮數(shù)據(jù)庫如果為空的時(shí)候,要懷疑這ke能時(shí)惡意的,續(xù)作我們將其加入黑明單。
                }
            }
        }
        return s;
    }

5. redis 和mysql 100%會(huì)出紕漏,做不到強(qiáng)一致性,如何保證最終一致性?

消息隊(duì)列,有延遲,
延遲雙刪除,線程A 時(shí)間不好估算
等待刪除后,執(zhí)行查詢命令,不支持高并發(fā)文章來源地址http://www.zghlxwxcb.cn/news/detail-464122.html

到了這里,關(guān)于redis高級(jí)篇 緩存雙寫一致性之更新策略的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Redis---緩存雙寫一致性

    Redis---緩存雙寫一致性

    目錄 一、什么是緩存雙寫一致性呢? ?1.1 雙檢加鎖機(jī)制 ?二、數(shù)據(jù)庫和緩存一致性的更新策略 2.1、先更新數(shù)據(jù)庫,后更新緩存 ?2.2 、先更新緩存,后更新數(shù)據(jù)庫 ?2.3、先刪除緩存,在更新數(shù)據(jù)庫 延時(shí)雙刪的策略: ?2.4.先更新數(shù)據(jù)庫,在刪除緩存(常用) 2.5、實(shí)際中是不可

    2024年02月15日
    瀏覽(26)
  • Redis緩存雙寫一致性

    Redis緩存雙寫一致性

    如果redis中有數(shù)據(jù):需要和數(shù)據(jù)庫中的值相同 如果redis中無數(shù)據(jù):數(shù)據(jù)庫中的值要是最新值,且準(zhǔn)備回寫redis 緩存按照操作來分,可細(xì)分為兩種: 只讀緩存和讀寫緩存 只讀緩存很簡單:就是Redis只做查詢,有就是有,沒有就是沒有,不會(huì)再進(jìn)一步訪問MySQL,不再需要會(huì)寫機(jī)制

    2023年04月17日
    瀏覽(18)
  • Redis緩存(雙寫一致性問題)

    Redis緩存(雙寫一致性問題)

    前言 : 什么是緩存? 緩存就像自行車,越野車的避震器 舉個(gè)例子:越野車,山地自行車,都擁有\(zhòng)\\"避震器\\\", 防止 車體加速后因慣性,在酷似\\\"U\\\"字母的地形上飛躍,硬著陸導(dǎo)致的 損害 ,像個(gè)彈簧一樣; 同樣,實(shí)際開發(fā)中,系統(tǒng)也需要\\\"避震器\\\",防止過高的數(shù)據(jù)訪問猛沖系統(tǒng),導(dǎo)致其操作線程無法

    2024年02月02日
    瀏覽(22)
  • redis的緩存更新策略以及如何保證redis與數(shù)據(jù)庫的數(shù)據(jù)一致性

    redis的緩存更新策略有這么幾種: 1、由應(yīng)用直接和redis以及數(shù)據(jù)庫相連接: ?? ??? ?查詢數(shù)據(jù)時(shí),應(yīng)用去redis中查詢,查不到的話再由應(yīng)用去數(shù)據(jù)庫中查詢,并將查詢結(jié)果放在redis; ?? ??? ?更新數(shù)據(jù)時(shí),由應(yīng)用去觸發(fā)redis數(shù)據(jù)的刪除以及數(shù)據(jù)庫的update。 2、應(yīng)用只跟redi

    2024年02月13日
    瀏覽(25)
  • 【Redis】聊一下緩存雙寫一致性

    【Redis】聊一下緩存雙寫一致性

    緩存雖然可以提高查詢數(shù)據(jù)的的性能,但是在緩存和數(shù)據(jù) 進(jìn)行更新的時(shí)候 其實(shí)會(huì)出現(xiàn)數(shù)據(jù)不一致現(xiàn)象,而這個(gè)不一致其實(shí)可能會(huì)給業(yè)務(wù)來帶一定影響。無論是Redis 分布式緩存還是其他的緩存機(jī)制都面臨這樣的問題。 數(shù)據(jù)一致性 緩存中有數(shù)據(jù),那么緩存的數(shù)據(jù)和數(shù)據(jù)庫的數(shù)據(jù)

    2024年02月06日
    瀏覽(25)
  • 緩存與數(shù)據(jù)庫雙寫一致性幾種策略分析

    作者:京東零售?于瀧 在高并發(fā)場(chǎng)景中,為防止大量請(qǐng)求直接訪問數(shù)據(jù)庫,緩解數(shù)據(jù)庫壓力,常用的方式一般會(huì)增加緩存層起到緩沖作用,減少數(shù)據(jù)庫壓力。引入緩存,就會(huì)涉及到緩存與數(shù)據(jù)庫中數(shù)據(jù)如何保持一致性問題,本文將對(duì)幾種緩存與數(shù)據(jù)庫保證數(shù)據(jù)一致性的使用方

    2023年04月19日
    瀏覽(36)
  • Redis緩存問題:穿透,擊穿,雪崩,雙寫一致性等

    Redis緩存問題:穿透,擊穿,雪崩,雙寫一致性等

    在高并發(fā)場(chǎng)景下,數(shù)據(jù)庫往往是最薄弱的環(huán)節(jié),我們通常選擇使用 redis 來進(jìn)行緩存,以起到緩沖作用,來降低數(shù)據(jù)庫的壓力,但是一旦緩存出現(xiàn)問題,也會(huì)導(dǎo)致數(shù)據(jù)庫瞬間壓力過大甚至崩潰,從而導(dǎo)致整個(gè)系統(tǒng)崩潰.今天就聊聊常見的 redis 緩存問題. 緩存擊穿 緩存擊穿一般指redis中的一

    2024年04月27日
    瀏覽(31)
  • 【redis】緩存雙寫一致性之工程落地實(shí)現(xiàn)(下)

    【redis】緩存雙寫一致性之工程落地實(shí)現(xiàn)(下)

    提示:以下是本篇文章正文內(nèi)容,下面案例可供參考 如何監(jiān)聽MySQL的變動(dòng)? MySQL有一個(gè)binlog日志 偽裝成從機(jī),從主機(jī)獲取二進(jìn)制文件 配置不在詳述 配置不再詳述 a、業(yè)務(wù)類: 當(dāng)MySQL進(jìn)行增刪改操作時(shí),后臺(tái)的canal會(huì)立刻監(jiān)聽捕捉到MySQL的二進(jìn)制binlog日志文件改動(dòng),并通過Jav

    2023年04月19日
    瀏覽(22)
  • Redis雙寫一致性?

    Redis雙寫一致性?

    雙寫一致性:當(dāng)修改了數(shù)據(jù)庫的數(shù)據(jù)也要同時(shí)更新緩存的數(shù)據(jù),緩存和數(shù)據(jù)庫的數(shù)據(jù)要保持一致。 Redis作為緩存,mysql的數(shù)據(jù)如何與redis進(jìn)行同步呢?(雙寫一致性) 1.我們當(dāng)時(shí)做排行榜業(yè)務(wù)時(shí),把歷史榜單數(shù)據(jù)存儲(chǔ)到了緩存中。這個(gè)雖然也是熱點(diǎn)數(shù)據(jù),但是實(shí)時(shí)要求性不高。

    2024年02月16日
    瀏覽(21)
  • 如何保證數(shù)據(jù)庫和緩存雙寫一致性?

    如何保證數(shù)據(jù)庫和緩存雙寫一致性?

    如何保證數(shù)據(jù)庫和緩存雙寫一致性,是面試中經(jīng)常被問的一個(gè)技術(shù)問題,程序汪推薦大家有必要好好研究一波 數(shù)據(jù)庫和緩存(比如:redis)雙寫數(shù)據(jù)一致性問題,是一個(gè)跟開發(fā)語言無關(guān)的公共問題。尤其在高并發(fā)的場(chǎng)景下,這個(gè)問題變得更加嚴(yán)重。 我很負(fù)責(zé)的告訴大家,該問

    2024年01月18日
    瀏覽(41)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包