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

Redis:緩存擊穿、緩存穿透與緩存雪崩的區(qū)別、解決方案

這篇具有很好參考價(jià)值的文章主要介紹了Redis:緩存擊穿、緩存穿透與緩存雪崩的區(qū)別、解決方案。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

0、前言

? ? ? ? 近期學(xué)習(xí)redis相關(guān)原理,記錄一下開發(fā)過程中Redis的一些常見問題及應(yīng)對方法。

1、緩存穿透

一句話總結(jié):先查redis發(fā)現(xiàn)沒數(shù)據(jù),再去數(shù)據(jù)庫查發(fā)現(xiàn)還是沒數(shù)據(jù)。

這種情況下緩存永遠(yuǎn)不會生效,數(shù)據(jù)庫將承擔(dān)巨大壓力。

? ? ? ? 我們知道,redis的緩存作用,是在客戶端發(fā)起查詢請求時(shí):
? ? ? ? (1)先找redis,如果redis內(nèi)命中數(shù)據(jù)則直接返回。
? ? ? ? (2)如果未命中,則不得不去數(shù)據(jù)庫中查詢,把數(shù)據(jù)放到redis里,然后再返回?cái)?shù)據(jù)給客戶端。
? ? ? ? 對于緩存穿透的情況,例如多次惡意查詢數(shù)據(jù)庫和redis里都沒有的數(shù)據(jù),將給數(shù)據(jù)庫帶來巨大壓力。

常見解決方法:

Redis:緩存擊穿、緩存穿透與緩存雪崩的區(qū)別、解決方案

? ? ? ? ?緩存空對象,就是發(fā)現(xiàn)數(shù)據(jù)庫也沒有這個(gè)數(shù)據(jù)的時(shí)候,緩存一個(gè)空值在redis里,那么下次這種訪問就會從redis里返回null,而不會繼續(xù)查詢數(shù)據(jù)庫了。

2. 緩存雪崩

一句話:大量的緩存key同時(shí)失效(比如同時(shí)過期了),或者redis服務(wù)宕機(jī)(redis寄了),導(dǎo)致大量請求直接給到數(shù)據(jù)庫,壓力過大寄了。

????????緩存雪崩,指的是大面積的 key 同時(shí)過期,導(dǎo)致大量并發(fā)打到我們的數(shù)據(jù)庫。不像擊穿,只是因?yàn)?1 個(gè) key 的過期。所以,對于雪崩來說,一般少量的 key 失效,所帶來的數(shù)據(jù)庫的并發(fā)壓力是不會太大的。而大量 key 的同時(shí)失效,導(dǎo)致所有 key 的并發(fā)加起來,會影響到我們的數(shù)據(jù)庫。

????????那就算一個(gè) key 失效,也會對數(shù)據(jù)庫造成很大的影響,那么你把雪崩的所有 key 拆成一個(gè)一個(gè) key 來看,也就是雪崩可以拆分成一個(gè)一個(gè)緩存擊穿的集合。

????????其實(shí)在真實(shí)場景中,雪崩才是一個(gè)更容易發(fā)生的一個(gè)問題,它不像擊穿那么極端,一個(gè) key 就成千上萬的并發(fā),直接把數(shù)據(jù)庫打垮了;而是,可能就一個(gè) key 幾十幾百的并發(fā),然后大量的 key 一過期,然后就使得好多并發(fā),同時(shí)疊加起來,累積到上千上萬個(gè),把數(shù)據(jù)庫打崩了。

解決方案

? ? ? ? 怕key同時(shí)失效,那就把緩存的TTL時(shí)間分散開,?比如在失效時(shí)間的基礎(chǔ)上加上一個(gè)隨機(jī)值。

? ? ? ? 針對redis宕機(jī)情況,可以進(jìn)行Redis集群的布置,或者添加多級緩存,增強(qiáng)系統(tǒng)的容錯(cuò)性。

3、緩存擊穿

????????概括:要查的key對應(yīng)的數(shù)據(jù)是存在的(不像穿透,是不存在的數(shù)據(jù)),但redis里沒有(比如過期了,這很常見),如果這個(gè)key的數(shù)據(jù)是熱點(diǎn)數(shù)據(jù),即可能會有大量并發(fā)請求。

? ? ? ? 這么多的并發(fā)請求都發(fā)現(xiàn)redis沒有對應(yīng)的數(shù)據(jù),則都要去查數(shù)據(jù)庫,這樣一來將造成巨大壓力。

?????????例如下圖中,在線程1把數(shù)據(jù)寫入緩存之前,其他多個(gè)并發(fā)線程都會去查數(shù)據(jù)庫,這樣將造成巨大的壓力。Redis:緩存擊穿、緩存穿透與緩存雪崩的區(qū)別、解決方案

?解決方案

? ? ? ? 有的人可能會覺得,熱點(diǎn)key過期容易導(dǎo)致緩存擊穿,那我們把它的存活時(shí)間設(shè)成永久不就好了?
? ? ? ? 這樣肯定是不可以的,畢竟redis空間有限,不可能緩存那么多數(shù)據(jù),而且“熱點(diǎn)數(shù)據(jù)”也是會隨時(shí)間變化的,也不可能把所有數(shù)據(jù)當(dāng)成熱點(diǎn)數(shù)據(jù)來緩存。

方案1:互斥鎖(開發(fā)常用)

? ? ? ??假設(shè)會有 1w 個(gè)并發(fā)來訪問這個(gè) key,那么它們就會先查詢 redis,然后都發(fā)現(xiàn),這個(gè) key 不存在;然后,它們就會對應(yīng)的,往 redis 用 setnx 設(shè)置一個(gè) key,來表示這是一把鎖;

? ? ? ? 這里介紹一下redis的setnx,該方法的作用可以標(biāo)識鎖,什么意思呢?

? ? ? ? setnx的使用方法是這樣的:
? ? ? ? setnx key value

? ? ? ? 如果key沒有value,設(shè)置值成果。如果key已經(jīng)有對應(yīng)value,設(shè)置失敗。

? ? ? ? 類似于我們的互斥。上鎖就是賦值、釋放鎖就是刪掉鎖(del key即可)

? ? ? ? 一般會設(shè)置有效期,防止死鎖。

Redis:緩存擊穿、緩存穿透與緩存雪崩的區(qū)別、解決方案
? ? ? ? 該方法通過傳入鎖的id,返回一個(gè)布爾值,來模擬獲取鎖的過程。

????????然后,只有一個(gè)線程,會設(shè)置成功,然后去讀取數(shù)據(jù)庫,寫回 redis;其他的 9999 個(gè)線程,則 sleep 一小會,然后再去訪問我們的 redis。
????????有人看到這,首先會問,這個(gè) sleep 要多久?
????????這個(gè)是要根據(jù)壓測,以及線上環(huán)境進(jìn)行調(diào)整的,一般會給出一個(gè)合適的值,也就是大約從數(shù)據(jù)庫取出數(shù)據(jù)的時(shí)間。

?文章來源地址http://www.zghlxwxcb.cn/news/detail-464349.html

Redis:緩存擊穿、緩存穿透與緩存雪崩的區(qū)別、解決方案

Redis:緩存擊穿、緩存穿透與緩存雪崩的區(qū)別、解決方案

?

?方案2:邏輯過期

? ? ? ? 這種情況,我們假設(shè)key不會過期,而是通過人為地設(shè)置”expire time“一個(gè)屬性,來進(jìn)行人為地判斷數(shù)據(jù)是否過期(比如,熱門商品,那就在活動(dòng)期間把它變?yōu)椴粫^期地key,等活動(dòng)過了以后在主動(dòng)讓他過期)。

? ? ? ? 中心思路就是,線程1搶到鎖以后,將查數(shù)據(jù)庫、返回緩存,這項(xiàng)比較耗時(shí)的任務(wù)交給別的線程(線程2)去做,然后多個(gè)并發(fā)線程就可以先返回過期的數(shù)據(jù),等更新好了再返回新的。

????????這樣避免了大量線程休眠等待的情況。

Redis:緩存擊穿、緩存穿透與緩存雪崩的區(qū)別、解決方案

Redis:緩存擊穿、緩存穿透與緩存雪崩的區(qū)別、解決方案

?

到了這里,關(guān)于Redis:緩存擊穿、緩存穿透與緩存雪崩的區(qū)別、解決方案的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關(guān)文章

  • Redis緩存雪崩、穿透、擊穿原因分析和解決方案,附Redis管道使用技巧

    Redis緩存雪崩、穿透、擊穿原因分析和解決方案,附Redis管道使用技巧

    先給大家附上其他幾篇文章,感興趣的自行開車導(dǎo)航 Redis過期策略和持久化機(jī)制全面揭秘,教你如何合理配置 【深入淺出Redis 一】從版本特性到數(shù)據(jù)類型到線程模型,帶你了解Redis的核心特性和應(yīng)用場景! 一次redis OOM問題分析解決,rdbtools安裝分析redis內(nèi)存 Redis管道(pipelin

    2024年02月16日
    瀏覽(23)
  • 【Redis從入門到進(jìn)階】第 6 講:緩存雪崩、擊穿、穿透場景與解決方案

    【Redis從入門到進(jìn)階】第 6 講:緩存雪崩、擊穿、穿透場景與解決方案

    本文已收錄于專欄 ??《Redis從入門到進(jìn)階》?? ?? 本專欄開啟,目的在于幫助大家更好的掌握學(xué)習(xí) Redis ,同時(shí)也是為了記錄我自己學(xué)習(xí) Redis 的過程,將會從基礎(chǔ)的數(shù)據(jù)類型開始記錄,直到一些更多的應(yīng)用,如緩存擊穿還有分布式鎖以及 Redis 持久化等。希望大家有問題也可

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

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

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

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

    緩存穿透、緩存雪崩、緩存擊穿解決方案

    緩存就是數(shù)據(jù)交換的緩沖區(qū)(稱作Cache),是存貯數(shù)據(jù)的臨時(shí)地方,一般讀寫性能較高。 需求:添加ShopTypeController中的queryTypeList方法,添加查詢緩存 業(yè)務(wù)場景: 低一致性需求:使用內(nèi)存淘汰機(jī)制。例如店鋪類型的查詢緩存 高一致性需求:主動(dòng)更新,并以超時(shí)剔除作為兜底方

    2023年04月09日
    瀏覽(28)
  • Java緩存穿透、擊穿、雪崩解決方案

    在互聯(lián)網(wǎng)高并發(fā)的場景下,對于數(shù)據(jù)庫查詢頻率高的數(shù)據(jù),為了提高查詢效率,常常會采用緩存技術(shù)進(jìn)行優(yōu)化。然而,緩存技術(shù)也會帶來一些問題,比如緩存穿透、緩存擊穿和緩存雪崩等。 當(dāng)我們從緩存中查詢一個(gè)不存在的數(shù)據(jù)時(shí),請求就會穿透緩存直接查詢數(shù)據(jù)庫,這樣就

    2023年04月19日
    瀏覽(153)
  • 緩存擊穿、穿透、雪崩及常用解決方案

    緩存擊穿、穿透、雪崩及常用解決方案

    Redis是一種高性能的鍵值型數(shù)據(jù)庫,它可以用來實(shí)現(xiàn)緩存功能,提高應(yīng)用的響應(yīng)速度和承載能力。但是,使用Redis緩存也會遇到一些常見的問題,比如緩存擊穿、緩存穿透、緩存雪崩。這些問題都會影響緩存的效率和穩(wěn)定性,所以需要了解它們的原因和解決方案,保障Redis能夠

    2024年02月06日
    瀏覽(22)
  • Redis 如何解決緩存雪崩、緩存擊穿、緩存穿透難題

    Redis 如何解決緩存雪崩、緩存擊穿、緩存穿透難題

    Redis?作為一門熱門的緩存技術(shù),引入了緩存層,就會有緩存異常的三個(gè)問題,分別是緩存擊穿、緩存穿透、緩存雪崩。我們用本篇文章來講解下如何解決! 緩存擊穿 : 指的是緩存中的某個(gè)熱點(diǎn)數(shù)據(jù)過期了,但是此時(shí)大量的并發(fā)請求訪問這個(gè)key的值,此時(shí)因?yàn)榫彺孢^期無法從

    2024年02月14日
    瀏覽(21)
  • redis緩存穿透、緩存擊穿、緩存雪崩及對應(yīng)解決方法

    緩存穿透、擊穿和雪崩是緩存使用中的常見問題,對它們的理解和相應(yīng)的解決方法對于維護(hù)系統(tǒng)性能和穩(wěn)定性至關(guān)重要。 定義 : 當(dāng)客戶端請求的數(shù)據(jù)在緩存中和數(shù)據(jù)庫中都不存在時(shí),該請求會直接打到數(shù)據(jù)庫上,這種情況稱為緩存穿透。如果持續(xù)請求這樣的數(shù)據(jù),會給數(shù)據(jù)

    2024年04月08日
    瀏覽(20)
  • [Redis]緩存穿透、緩存擊穿、緩存雪崩問題及解決方法

    緩存穿透就是指在高并發(fā)的情況下大量的請求去查詢一個(gè)不存在于緩存中的數(shù)據(jù),導(dǎo)致這些請求都直接訪問數(shù)據(jù)庫,給數(shù)據(jù)庫造成壓力。例如:我存儲在緩存中的key是數(shù)字類型(123),但是網(wǎng)絡(luò)攻擊者頻繁地用字符串(abc)去獲取緩存。導(dǎo)致永遠(yuǎn)都無法命中緩存,請求最終都

    2024年02月15日
    瀏覽(25)
  • Redis緩存穿透、擊穿、雪崩問題及其解決方法

    Redis緩存穿透、擊穿、雪崩問題及其解決方法

    緩存穿透 :緩存穿透是指客戶端請求的數(shù)據(jù)在緩存中和數(shù)據(jù)庫中都不存在,這樣緩存永遠(yuǎn)不會生效,這些請求都會打到數(shù)據(jù)庫。 常見的解決方案有兩種: 緩存空對象 優(yōu)點(diǎn):實(shí)現(xiàn)簡單,維護(hù)方便 缺點(diǎn): 額外的內(nèi)存消耗 可能造成短期的不一致 布隆過濾 優(yōu)點(diǎn):內(nèi)存占用較少,

    2024年02月02日
    瀏覽(17)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包