首頁技術(shù)文章正文

為什么會(huì)形成緩存雪崩?緩存雪崩解決方案

更新時(shí)間:2023-08-24 來源:黑馬程序員 瀏覽量:

IT培訓(xùn)班

什么是緩存雪崩

緩存雪崩是緩存中大量key失效后當(dāng)高并發(fā)到來時(shí)導(dǎo)致大量請求到數(shù)據(jù)庫,瞬間耗盡數(shù)據(jù)庫資源,導(dǎo)致數(shù)據(jù)庫無法使用。

造成緩存雪崩問題的原因是是大量key擁有了相同的過期時(shí)間,比如對課程信息設(shè)置緩存過期時(shí)間為10分鐘,在大量請求同時(shí)查詢大量的課程信息時(shí),此時(shí)就會(huì)有大量的課程存在相同的過期時(shí)間,一旦失效將同時(shí)失效,造成雪崩問題。

解決緩存雪崩

1、使用同步鎖控制查詢數(shù)據(jù)庫的線程

使用同步鎖控制查詢數(shù)據(jù)庫的線程,只允許有一個(gè)線程去查詢數(shù)據(jù)庫,查詢得到數(shù)據(jù)后存入緩存。

Java
synchronized(obj){
  //查詢數(shù)據(jù)庫
  //存入緩存
}

2、對同一類型信息的key設(shè)置不同的過期時(shí)間

通常對一類信息的key設(shè)置的過期時(shí)間是相同的,這里可以在原有固定時(shí)間的基礎(chǔ)上加上一個(gè)隨機(jī)時(shí)間使它們的過期時(shí)間都不相同。示例代碼如下:

Java
   //設(shè)置過期時(shí)間300秒
  redisTemplate.opsForValue().set("course:" + courseId, 
JSON.toJSONString(coursePublish),300+new Random().nextInt(100), 
TimeUnit.SECONDS);

3、緩存預(yù)熱

不用等到請求到來再去查詢數(shù)據(jù)庫存入緩存,可以提前將數(shù)據(jù)存入緩存。使用緩存預(yù)熱機(jī)制通常有專門的后臺程序去將數(shù)據(jù)庫的數(shù)據(jù)同步到緩存。


分享到:
在線咨詢 我要報(bào)名
和我們在線交談!