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

Redis - 做緩存時(shí)高并發(fā)問題:緩存穿透、擊穿、雪崩,數(shù)據(jù)庫緩存雙寫不一致

這篇具有很好參考價(jià)值的文章主要介紹了Redis - 做緩存時(shí)高并發(fā)問題:緩存穿透、擊穿、雪崩,數(shù)據(jù)庫緩存雙寫不一致。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

緩存穿透

當(dāng)用戶訪問的數(shù)據(jù)既不在緩存也不在數(shù)據(jù)庫中時(shí),就會(huì)導(dǎo)致每個(gè)用戶查詢都會(huì)“穿透”
緩存“直抵”數(shù)據(jù)庫。這種情況就稱為緩存穿透。當(dāng)高度發(fā)的訪問請(qǐng)求到達(dá)時(shí),緩存穿透不
僅增加了響應(yīng)時(shí)間,而且還會(huì)引發(fā)對(duì) DBMS 的高并發(fā)查詢,這種高并發(fā)查詢很可能會(huì)導(dǎo)致
DBMS 的崩潰。
緩存穿透產(chǎn)生的主要原因有兩個(gè):一是在數(shù)據(jù)庫中沒有相應(yīng)的查詢結(jié)果,二是查詢結(jié)果
為空時(shí),不對(duì)查詢結(jié)果進(jìn)行緩存。所以,針對(duì)以上兩點(diǎn),解決方案也有兩個(gè):
? 對(duì)非法請(qǐng)求進(jìn)行限制
? 對(duì)結(jié)果為空的查詢給出默認(rèn)值

緩存擊穿

對(duì)于某一個(gè)緩存,在高并發(fā)情況下若其訪問量特別巨大,當(dāng)該緩存的有效時(shí)限到達(dá)時(shí),
可能會(huì)出現(xiàn)大量的訪問都要重建該緩存,即這些訪問請(qǐng)求發(fā)現(xiàn)緩存中沒有該數(shù)據(jù),則立即到
DBMS 中進(jìn)行查詢,那么這就有可能會(huì)引發(fā)對(duì) DBMS 的高并發(fā)查詢,從而接導(dǎo)致 DBMS 的崩
潰。這種情況稱為緩存擊穿,而該緩存數(shù)據(jù)稱為熱點(diǎn)數(shù)據(jù)。
對(duì)于緩存擊穿的解決方案,較典型的是使用“雙重檢測(cè)鎖”機(jī)制。
// 使用雙重檢測(cè)鎖機(jī)制預(yù)防緩存擊穿
// 若緩存中沒有該數(shù)據(jù),則先從DB中查詢,然后再寫入到緩存
if (turnover == null) {
    synchronized (this) {
        turnover = ops.get();
        if (turnover == null) {
            // 獲取當(dāng)前日期,并格式化
            Date date = new Date();
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
            turnover = dao.selectTurnover(sdf.format(date));

            // 將查詢結(jié)果寫入到緩存
            ops.set(turnover, 10, TimeUnit.SECONDS);
        }
    }
}

緩存雪崩

對(duì)于緩存中的數(shù)據(jù),很多都是有過期時(shí)間的。若大量緩存的過期時(shí)間在同一很短的時(shí)間
段內(nèi)幾乎同時(shí)到達(dá),那么在高并發(fā)訪問場(chǎng)景下就可能會(huì)引發(fā)對(duì) DBMS 的高并發(fā)查詢,而這將
可能直接導(dǎo)致 DBMS 的崩潰。這種情況稱為緩存雪崩。
對(duì)于緩存雪崩沒有很直接的解決方案,最好的解決方案就是預(yù)防,即提前規(guī)劃好緩存的
過期時(shí)間。要么就是讓緩存永久有效,當(dāng) DB 中數(shù)據(jù)發(fā)生變化時(shí)清除相應(yīng)的緩存。如果 DBMS
采用的是分布式部署,則將熱點(diǎn)數(shù)據(jù)均勻分布在不同數(shù)據(jù)庫節(jié)點(diǎn)中,將可能到來的訪問負(fù)載
均衡開來。

數(shù)據(jù)庫緩存雙寫不一致

以上三種情況都是針對(duì) 高并發(fā)讀 場(chǎng)景中可能會(huì)出現(xiàn)的問題,而數(shù)據(jù)庫緩存雙寫不一致問
題,則是在 高并發(fā)寫 場(chǎng)景下可能會(huì)出現(xiàn)的問題。
對(duì)于數(shù)據(jù)庫緩存雙寫不一致問題,以下兩種場(chǎng)景下均有可能會(huì)發(fā)生:
修改 DB 更新緩存 場(chǎng)景
對(duì)于具有緩存 warmup 功能的系統(tǒng), DBMS 中常用數(shù)據(jù)的變更,都會(huì)引發(fā)緩存中相關(guān)數(shù)
據(jù)的更新。在高并發(fā) 請(qǐng)求場(chǎng)景下,若多個(gè)請(qǐng)求要對(duì) DBMS 中同一個(gè)數(shù)據(jù)進(jìn)行修改,修改后
還需要更新緩存中相關(guān)數(shù)據(jù),那么就有可能會(huì)出現(xiàn)緩存與數(shù)據(jù)庫中數(shù)據(jù)不一致的情況。
Redis - 做緩存時(shí)高并發(fā)問題:緩存穿透、擊穿、雪崩,數(shù)據(jù)庫緩存雙寫不一致,Redis,緩存,redis,數(shù)據(jù)庫
修改 DB 刪除緩存 場(chǎng)景
在很多系統(tǒng)中是沒有緩存 warmup 功能的,為了保持緩存與數(shù)據(jù)庫數(shù)據(jù)的一致性,一般
都是在對(duì)數(shù)據(jù)庫執(zhí)行了寫操作后,就會(huì)刪除相應(yīng)緩存。
在高并發(fā) 讀寫 請(qǐng)求場(chǎng)景下,若這些請(qǐng)求對(duì) DBMS 中同一個(gè)數(shù)據(jù)的操作既包含寫也包含讀,
且修改后還要?jiǎng)h除緩存中相關(guān)數(shù)據(jù),那么就有可能會(huì)出現(xiàn)緩存與數(shù)據(jù)庫中數(shù)據(jù)不一致的情況。
Redis - 做緩存時(shí)高并發(fā)問題:緩存穿透、擊穿、雪崩,數(shù)據(jù)庫緩存雙寫不一致,Redis,緩存,redis,數(shù)據(jù)庫
解決方案:延遲雙刪
延遲雙刪方案是專門針對(duì)于“修改 DB 刪除緩存”場(chǎng)景的解決方案。但該方案并不能徹
底解決數(shù)據(jù)不一致的狀況,其只可能降低發(fā)生數(shù)據(jù)不一致的概率。
延遲雙刪方案是指,在寫操作完畢后會(huì)立即執(zhí)行一次緩存的刪除操作,然后再停上一段
時(shí)間(一般為幾秒)后再進(jìn)行一次刪除。而兩次刪除中間的間隔時(shí)長(zhǎng),要大于一次緩存寫操
作的時(shí)長(zhǎng)。
Redis - 做緩存時(shí)高并發(fā)問題:緩存穿透、擊穿、雪崩,數(shù)據(jù)庫緩存雙寫不一致,Redis,緩存,redis,數(shù)據(jù)庫
解決方案:隊(duì)

以上兩種場(chǎng)景中,只所以會(huì)出現(xiàn)數(shù)據(jù)庫與緩存中數(shù)據(jù)不一致,主要是因?yàn)閷?duì)請(qǐng)求的處理出現(xiàn)了并行。只要將請(qǐng)求寫入到一個(gè)統(tǒng)一的隊(duì)列,只有處理完一個(gè)請(qǐng)求后才可處理下一個(gè)請(qǐng)求,即使系統(tǒng)對(duì)用戶請(qǐng)求的處理串行化,就可以完全解決數(shù)據(jù)不一致的問題。

解決方案:分布式

使用隊(duì)列的串行化雖然可以解決數(shù)據(jù)庫與緩存中數(shù)據(jù)不一致,但系統(tǒng)失去了并發(fā)性,降低了性能。使用分布式鎖可以在不影響并發(fā)性的前提下,協(xié)調(diào)各處理線程間的關(guān)系,使數(shù)據(jù)庫與緩存中的數(shù)據(jù)達(dá)成一致性。

只需要對(duì)數(shù)據(jù)庫中的這個(gè)共享數(shù)據(jù)的訪問通過分布式鎖來協(xié)調(diào)對(duì)其的操作訪問即可。文章來源地址http://www.zghlxwxcb.cn/news/detail-758900.html

到了這里,關(guān)于Redis - 做緩存時(shí)高并發(fā)問題:緩存穿透、擊穿、雪崩,數(shù)據(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緩存問題:穿透,擊穿,雪崩,雙寫一致性等

    在高并發(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 性能管理/優(yōu)化 雙一致性問題 緩存雪崩/擊穿/穿透

    Redis 性能管理/優(yōu)化 雙一致性問題 緩存雪崩/擊穿/穿透

    used_memory_rss:是Redis向操作系統(tǒng)申請(qǐng)的內(nèi)存。 used_memory:是Redis中的數(shù)據(jù)占用的內(nèi)存。 mem_fragmentation_ratio:內(nèi)存碎片率。 used_memory_peak:redis內(nèi)存使用的峰值。 內(nèi)存碎片如何產(chǎn)生的? Redis內(nèi)部有自己的內(nèi)存管理器,為了提高內(nèi)存使用的效率,來對(duì)內(nèi)存的申請(qǐng)和釋放進(jìn)行管理。

    2024年02月11日
    瀏覽(37)
  • 【Redis(8)】Spring Boot整合Redis和Guava,解決緩存穿透、緩存擊穿、緩存雪崩等緩存問題

    在緩存技術(shù)的挑戰(zhàn)及設(shè)計(jì)方案我們介紹了使用緩存技術(shù)可能會(huì)遇到的一些問題,那么如何解決這些問題呢? 在構(gòu)建緩存系統(tǒng)時(shí),Spring Boot和Redis的結(jié)合提供了強(qiáng)大的支持,而Guava的 LoadingCache 則為緩存管理帶來了便捷的解決方案。下面我將介紹如何通過整合Spring Boot、Redis和Gu

    2024年04月22日
    瀏覽(24)
  • 探討Redis緩存問題及解決方案:緩存穿透、緩存擊穿、緩存雪崩與緩存預(yù)熱(如何解決Redis緩存中的常見問題并提高應(yīng)用性能)

    探討Redis緩存問題及解決方案:緩存穿透、緩存擊穿、緩存雪崩與緩存預(yù)熱(如何解決Redis緩存中的常見問題并提高應(yīng)用性能)

    Redis是一種非常流行的開源緩存系統(tǒng),用于緩存數(shù)據(jù)以提高應(yīng)用程序性能。但是,如果我們不注意一些緩存問題,Redis也可能會(huì)導(dǎo)致一些性能問題。在本文中,我們將探討Redis中的一些常見緩存問題,并提供解決方案。 緩存穿透指的是當(dāng)一個(gè)請(qǐng)求嘗試訪問一個(gè)不存在于緩存中的

    2024年02月03日
    瀏覽(169)
  • Redis 緩存穿透、緩存雪崩、緩存擊穿

    Redis 緩存穿透、緩存雪崩、緩存擊穿

    緩存穿透是指客戶端請(qǐng)求的數(shù)據(jù)在緩存中和數(shù)據(jù)庫中都不存在,這樣緩存永遠(yuǎn)不會(huì)生效,這些請(qǐng)求都會(huì)打到數(shù)據(jù)庫。 常見的解決方案有兩種: ????????緩存空對(duì)象 ???????? ????????優(yōu)點(diǎn):實(shí)現(xiàn)簡(jiǎn)單,維護(hù)方便 ????????????????缺點(diǎn): 額外的內(nèi)存消耗 可能造

    2024年02月02日
    瀏覽(28)
  • redis 緩存雪崩 && 緩存擊穿 && 緩存穿透

    什么是緩存雪崩 當(dāng)我們提到緩存系統(tǒng)中的問題,緩存雪崩是一個(gè)經(jīng)常被討論的話題。緩存雪崩是指在某一時(shí)刻發(fā)生大量的緩存失效,導(dǎo)致瞬間大量的請(qǐng)求直接打到了數(shù)據(jù)庫,可能會(huì)導(dǎo)致數(shù)據(jù)庫瞬間壓力過大甚至宕機(jī)。尤其在高并發(fā)的系統(tǒng)中,這種情況會(huì)導(dǎo)致連鎖反應(yīng),整個(gè)系

    2024年02月07日
    瀏覽(30)
  • Redis緩存擊穿、雪崩、穿透

    我們通過對(duì)數(shù)據(jù)庫的數(shù)據(jù)進(jìn)行查詢后在redis中緩存,但是在高并發(fā)環(huán)境下,某個(gè)保存的key值在失效的瞬間被大量并發(fā)請(qǐng)求訪問,這些持續(xù)的大并發(fā)量就會(huì)穿破緩存,直接請(qǐng)求數(shù)據(jù)庫,會(huì)對(duì)數(shù)據(jù)庫造成巨大壓力,這些請(qǐng)求還會(huì)使數(shù)據(jù)多次寫入緩存,多了許多不必要的操作。 ? ?

    2024年02月08日
    瀏覽(26)
  • Redis緩存穿透,雪崩,擊穿

    1、定義 緩存 就是數(shù)據(jù)交換的 緩沖區(qū) ,緩存就是 緩沖區(qū)內(nèi)的數(shù)據(jù) ,一般從數(shù)據(jù)庫中獲取,存儲(chǔ)于本地代碼。 由于其被 Static 修飾,所以隨著類的加載而被加載到 內(nèi)存之中 ,作為本地緩存,由于其又被 final 修飾,所以其引用和對(duì)象之間的關(guān)系是固定的,不能改變,因此不用擔(dān)心賦值(=

    2024年02月10日
    瀏覽(21)
  • REDIS緩存穿透 擊穿 雪崩

    REDIS緩存穿透 擊穿 雪崩

    一、前言 ? 在我們?nèi)粘5拈_發(fā)中,無不都是使用數(shù)據(jù)庫來進(jìn)行數(shù)據(jù)的存儲(chǔ),由于一般的系統(tǒng)任務(wù)中通常不會(huì)存在高并發(fā)的情況,所以這樣看起來并沒有什么問題,可是一旦涉及大數(shù)據(jù)量的需求,比如一些商品搶購(gòu)的情景,或者是主頁訪問量瞬間較大的時(shí)候,單一使用數(shù)據(jù)庫來

    2024年02月09日
    瀏覽(22)
  • redis的緩存穿透,緩存并發(fā),緩存雪崩,緩存問題及解決方案

    redis的緩存穿透,緩存并發(fā),緩存雪崩,緩存問題及解決方案

    緩存穿透 問題原因 解決方案 緩存并發(fā) 緩存雪崩 緩存失效時(shí)間設(shè)置一致導(dǎo)致的。 解決方案: 1)方案一 2)方案二 如何設(shè)計(jì)一個(gè)緩存策略,緩存熱點(diǎn)數(shù)據(jù)?

    2024年02月21日
    瀏覽(27)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包