redis 緩存問題 以及解決方案

緩存穿透

描述: 查詢數據庫中不存在的數據,高併發的情況下,壓力集中在數據庫
解決方案:

  • 1) 將空值Null也放入數據庫,設置過期時間較短。
  • 2) 布隆過濾器

緩存雪崩

描述: 緩存中大量的key同時過期,導致請求直接到了數據庫。
解決方案:

  • 1) 分開緩存的時間,避免同時有大量的key過期。

緩存擊穿

描述: 某個key在即將過期時有大量的請求,當key過期時,所有的請求通過了緩存直接到達了數據庫
解決方案:

  • 1) 緩存加鎖,如果key不存在就加鎖,然後查詢數據庫,其他相同請求,如果發現有鎖則等待,等到解鎖在查詢數據。

數據庫與緩存一致性

描述:場景一:當更新數據時,如更新某商品的庫存,當前商品的庫存是100,現在要更新爲99,先更新數據庫更改成99,然後刪除緩存,發現刪除緩存失敗了,這意味着數據庫存的是99,而緩存是100,這導致數據庫和緩存不一致。
解決方案:

  • 1) 先刪緩存,刪緩存成功,再刪數據庫數據。緩存刪除失敗,則不刪數據庫。

描述:場景二:一個數據的修改還未提交到數據庫,但是緩存數據已經被刪除了。這個時候,如果有一個查詢過來,則舊數據又被加入到緩存了。在這個緩存過期之前,請求的都是舊數據
解決方案: 網上給出的解決方案:::遇到這種情況,可以用隊列的去解決這個問,創建幾個隊列,如20個,根據商品的ID去做hash值,然後對隊列個數取摸,當有數據更新請求時,先把它丟到隊列裏去,當更新完後在從隊列裏去除,如果在更新的過程中,遇到以上場景,先去緩存裏看下有沒有數據,如果沒有,可以先去隊列裏看是否有相同商品ID在做更新,如果有也把查詢的請求發送到隊列裏去,然後同步等待緩存更新完成。
這裏有一個優化點,如果發現隊列裏有一個查詢請求了,那麼就不要放新的查詢操作進去了,用一個while(true)循環去查詢緩存,循環個200MS左右,如果緩存裏還沒有則直接取數據庫的舊數據,一般情況下是可以取到的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章