<input id="ohw05"></input>
  • <table id="ohw05"><menu id="ohw05"></menu></table>
  • <var id="ohw05"></var>
  • <code id="ohw05"><cite id="ohw05"></cite></code>
    <label id="ohw05"></label>
    <var id="ohw05"></var>
  • 【Redis 系列】redis 學習十二,redis 緩存穿透,緩存擊穿,緩存雪崩

    雖然我們在使用 redis 緩存的時候非常的爽,它大大的提高了我們應用程序的性能和效率,尤其是數據查詢方面,咱們不用直接去持久化的數據庫中查詢數據,而是到內存中查詢數據即可

    事物總是有兩面的,用的爽的同時,也必須面對它帶來的問題,就是數據一致性的問題,這個問題,是一個權衡利弊的問題,咱們接著看

    redis 緩存和一些持久化的數據庫配合使用的時候,會出現一些高可用的問題,如:

    • 緩存穿透
    • 緩存擊穿
    • 緩存雪崩

    咱們能夠解決上述問題,那就解決了一部分服務器高可用的問題

    什么是緩存穿透

    咱們先學習一部分,關于底層原理和實際源碼分析,咱們之后再一起看

    緩存穿透,就是用戶想要查詢一個數據,在 redis 中查詢不到,即沒有在緩存中命中,那么就會直接去持久化的 mysql 中進行查詢,發現也沒有這個數據,那么本次查詢就失敗了

    當用戶巨多的時候,查詢緩存都沒有查詢到,那么這些全部都去查詢持久化的 mysql 數據庫,壓力全部打到 mysql 上面,這就是緩存穿透

    解決方案有一般有 2 種方式:

    • 使用布隆過濾器
    • 緩存空的對象

    使用布隆過濾器

    布隆過濾器是一種數據結構,對所有可能查詢到的參數都是以 hash 的方式存儲,會先在控制層進行校驗,不符合的話,則丟棄,這就避免了對底層存儲系統的壓力

    布隆過濾器部署在 redis 的前面,去攔截數據,減少對 redis 的沖擊,進而減小對 持久化層的沖擊

    緩存空的對象

    緩存空對象,就是當我們在持久化的數據庫中沒有查詢到我們期望的數據時,那么就返回一個空對象,并且將這個空對象緩存起來,再對其設置一個過期時間

    那么之后再有訪問這個對象的請求時,緩存直接訪問空對象即可,這就可以保護持久化數據層,減少對他的沖擊壓力

    通過上述緩存空對象的方式,貌似也能解決問題,但是使用持久下去,會發現 key 值對應的空對象越來越多,會出現下面 2 個問題:

    • 非常多的空對象被緩存起來,那么對應就很多的 key 占用 內存空間,占用資源,內存壓力直線上升
    • 如果空對象的過期時間到了,那么請求的壓力還是會打到持久化數據庫上面,這會影響數據的一致性業務

    什么是緩存擊穿

    出現緩存擊穿的情況是數據量太大,或者是緩存過期了

    當某個 key 在過期的瞬間,有大量的請求這個 key 的數據,這種數據是熱點數據,由于在緩存過期的瞬間,請求會同時訪問到持久化的數據庫來查詢數據,并且會將數據會寫到緩存中,此時就會導致數據庫瞬間的壓力過大,導致擊穿

    此處可以理解 擊穿和穿透的區別:

    擊穿,是一個 key 非常熱點,大量的訪問都打在這個 key 上面,在 key 失效的瞬間,所有請求打在數據庫上,就打出一個洞,擊穿了

    而穿透更多的是訪問的數據不存在的情況,大量的請求訪問的都是不存在的數據

    緩存擊穿的解決方案

    • 將熱點數據設置不過期,不設置過期時間,就不會出現熱點 key 過期的瞬間造成問題

    • 加上分布式鎖,保證對于每一個 key ,同時只有一個服務進行訪問,其他的服務沒有獲取到鎖,就不能訪問 redis 的這個 key,那么就需要等待獲取鎖

      這種方式,鎖的壓力就非常大了,訪問 redis 前先去訪問鎖,相當于鎖給 redis 擋了一層

    什么是緩存雪崩

    緩存雪崩就是在某一個時間段,緩存集中過期,或者 redis 宕機的情況會出現

    例如:

    在某些熱點活動中,會設置某些商品在一個固定的時間內過期,那么在 redis 里面,這個固定的時間點,大量的 key 過期,這就導致在這個時間段 緩存失效了,

    且大量的請求數據都打在了持久化數據庫上面了,這就很難受,在這種壓力波峰下,壓力全部打在持久化數據庫上,這會造成持久化數據庫宕機

    上述的情況,key 集中過期問題還不是非常的痛,最痛的是 redis 宕機了,自然周期性的形成的波峰壓力,咱們的持久化數據庫還是能夠頂得住壓力的,偏偏是在 redis 異常宕機,一掛掛一片,這就很有可能將后方的持久化數據庫全部打掛,這是毀滅性的壓垮

    緩存雪崩的解決方案:

    • 將 redis 做成高可用的

    搭建 redis 集群,異地多活,既然擔心 redis 會掛,那么我們就多準備一些 redis ,做成主備,或者異地多活

    • 限流降級

    就是在緩存失效的時候,通過鎖的方式來限制訪問數據順序,或者關掉一些不重要的服務,讓資源和性能全力提供給我們的主要服務

    • 做數據預熱

    數據預熱就是咱們在正式要上線之前,咱們就先將需要訪問的數據預先訪問一次,這樣就可以將大量要訪問數據庫的數據寫到緩存中

    這樣就可以在即將發生的高并發訪問數據前手動的觸發并加載不同的 key ,且會設置不同的過期時間,主要是可以將緩存失效的事情均衡一些,這樣就盡量避免掉大量的 key 集中過期的情況

    參考資料:

    redis_doc

    歡迎點贊,關注,收藏

    朋友們,你的支持和鼓勵,是我堅持分享,提高質量的動力

    好了,本次就到這里

    技術是開放的,我們的心態,更應是開放的。擁抱變化,向陽而生,努力向前行。

    我是小魔童哪吒,歡迎點贊關注收藏,下次見~

    posted @ 2022-04-17 16:02  小魔童哪吒  閱讀(15)  評論(0編輯  收藏  舉報
    国产美女a做受大片观看