Redis-緩存讀寫問題


緩存處理流程

前台請求,后台先從緩存中取數據,取到直接返回結果,取不到時從數據庫中取,數據庫取到更新緩存,並返回結果,數據庫也沒取到,那直接返回空結果。

img

緩存穿透

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

解決辦法

  • 布隆過濾器:對所有可能查詢的參數以hash形式存儲,當用戶想要查詢的時候,使用布隆過濾器發現不在集合中,就直接丟棄,不再對持久層查詢。

    • 布隆過濾器核心思想:把一個集合的每一個元素按照某種 hash 算法計算 hash 值,然后將hash 值對定義的數據長度取模,得到的值即為存在數組的索引。並將該索引位置值從 0 改為 1 。然后去判斷一個元素是否在這個集合的時候,只需要對這個元素計算出數組的索引值,如果這個索引位置的值為 1 則證明該元素在集合內,反之則知道不在這個集合中。

    image-20200922150445120

    • 如上圖所示,A, B, C三個元素在一個集合里面,拿到一個 D 元素,然后計算它的hash值對應於數組的位置值為 1 則表示這個 D 元素也在ABC的集合里面;接着拿到元素E 同樣的計算,發現對應於數組中值為 0 則表示元素 E不在集合中。
  • 緩存空對象:當存儲層不命中后,即使返回的空對象也將其緩存起來,同時會設置一個過期時間,之后再訪問這個數據將會從緩存中獲取,保護了后端數據源

    • 如果空值能夠被緩存起來,這就意味着緩存需要更多的空間存儲更多的鍵,因為這當中可能會有很多的空值的鍵
    • 即使對空值設置了過期時間,還是會存在緩存層和存儲層的數據會有一段時間窗口的不一致,這對於需要保持一致性的業務會有影響。

緩存雪崩

緩存雪崩是指在某一個時間段,緩存集中過期失效。於是所有的請求都會達到存儲層,存儲層的調用量會暴增,造成存儲層也會掛掉的情況。不同數據集中過期了

image-20200922144245925

解決辦法

  • redis高可用
  • 限流降級:在緩存失效后,通過加鎖或者隊列來控制讀數據庫寫緩存的線程數量。
  • 數據預熱:數據加熱的含義就是在正式部署之前,我先把可能的數據先預先訪問一遍,這樣部分可能大量訪問的數據就會加載到緩存中。在即將發生大並發訪問前手動觸發加載緩存不同的key,設置不同的過期時間,讓緩存失效的時間點盡量均勻。
  • key設置隨機過期時間,避免多個緩存key在同一時間失效

緩存擊穿

緩存擊穿是指一個key非常熱點,在不停的扛着大並發,大並發集中對這一個點進行訪問,當這個key在失效的瞬間,持續的大並發就穿破緩存,直接請求數據庫,就像在一個屏障上鑿開了一個洞。並發查同一條數據

解決辦法

  • 設置熱點數據永遠不過期
  • 加互斥鎖


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM