9.redis總結

穿透

緩存穿透是指查詢一個一定不存在的數據,由於緩存是不命中時學啊喲從數據庫查詢,查不到數據則不寫入緩存,這將導致這個不存在的數據每次請求都要到數據庫查詢,造成緩存穿透。

**解決辦法:**持久層查詢不到就緩存空結果,查詢時先判斷緩存中是否exist (key),如果有直接返回空,沒有查詢後返回

**注意:**insret時需要清除查詢的key,否則幾遍DB中有值也查詢不到(當然也可以設置空緩存的過期時間)

redis key是否存在?
        如果不存在
            查詢mysql數據庫,
            存入redsi斌返回
        如果存在
        查詢redis並返回

雪崩

雪崩:緩存大量失效的時候,引發大量查詢數據庫

解決辦法:

  • 用鎖/分佈式鎖或者隊列串行訪問

  • 緩存失效時間均勻分佈

    如果緩存幾種在一段時間內失效,發生打量的緩存穿透,所有的查詢都落在數據庫上,造成了緩存雪崩。

    這個沒有完美的解決辦法,但可以分析用戶行爲,儘量讓失效時間點均勻分佈,大多數系統設計者考慮用加鎖或者隊列的方式保證緩存的單線程(進程)寫,從而避免失效時大量的併發請求落到底層的存儲系統上。

1.加鎖排隊,限流-限流算法

在緩存失效後,通過加鎖或者隊列來控制數據庫寫緩存的數量。

2.數據預熱

可以通過魂村的reload機制,預先去更新緩存,在即將發生大併發訪問前手動觸發加載緩存不同的key,設置不同的過期時間,讓緩存失效的時間點儘量均勻

擊穿

至於緩存擊穿嘛,這個跟緩存雪崩有點像,但是又有一點不一樣,緩存雪崩是因爲大面積的緩存失效,打崩了DB,而緩存擊穿不同的是緩存擊穿是指一個Key非常熱點,在不停的扛着大併發,大併發集中對這一個點進行訪問,當這個Key在失效的瞬間,持續的大併發就穿破緩存,直接請求數據庫,就像在一個完好無損的桶上鑿開了一個洞。

解決方案:
緩存穿透我會在接口層增加校驗,比如用戶鑑權校驗,參數做校驗,不合法的參數直接代碼Return,比如:id 做基礎校驗,id <=0的直接攔截等。

熱點key

  1. 熱key:某個key訪問非常頻繁,當key失效的時候有大量線程來構建緩存,導致負載增加,系統崩潰

解決辦法:

  1. 使用鎖,單機使用synchronize,lock等,分佈式用分佈式鎖、
  2. 緩存過期時間不設置
  3. 在value中設置一個比過期時間t0小的過期時間值t1,當t1過期的時候,延長t1並做更新緩存操作
  4. 設置標籤緩存,標籤緩存設置過期時間,標籤緩存過期後,需要異步更新實際緩存
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章