更新時(shí)間:2023年08月25日17時(shí)21分 來(lái)源:傳智教育 瀏覽次數(shù):
緩存雪崩是緩存中大量key失效后當(dāng)高并發(fā)到來(lái)時(shí)導(dǎo)致大量請(qǐng)求到數(shù)據(jù)庫(kù),瞬間耗盡數(shù)據(jù)庫(kù)資源,導(dǎo)致數(shù)據(jù)庫(kù)無(wú)法使用。
造成緩存雪崩問(wèn)題的原因是是大量key擁有了相同的過(guò)期時(shí)間,比如對(duì)課程信息設(shè)置緩存過(guò)期時(shí)間為10分鐘,在大量請(qǐng)求同時(shí)查詢大量的課程信息時(shí),此時(shí)就會(huì)有大量的課程存在相同的過(guò)期時(shí)間,一旦失效將同時(shí)失效,造成雪崩問(wèn)題。
1、使用同步鎖控制查詢數(shù)據(jù)庫(kù)的線程
使用同步鎖控制查詢數(shù)據(jù)庫(kù)的線程,只允許有一個(gè)線程去查詢數(shù)據(jù)庫(kù),查詢得到數(shù)據(jù)后存入緩存。
Java synchronized(obj){ //查詢數(shù)據(jù)庫(kù) //存入緩存 }
2、對(duì)同一類型信息的key設(shè)置不同的過(guò)期時(shí)間
通常對(duì)一類信息的key設(shè)置的過(guò)期時(shí)間是相同的,這里可以在原有固定時(shí)間的基礎(chǔ)上加上一個(gè)隨機(jī)時(shí)間使它們的過(guò)期時(shí)間都不相同。示例代碼如下:
Java //設(shè)置過(guò)期時(shí)間300秒 redisTemplate.opsForValue().set("course:" + courseId, JSON.toJSONString(coursePublish),300+new Random().nextInt(100), TimeUnit.SECONDS);
3、緩存預(yù)熱
不用等到請(qǐng)求到來(lái)再去查詢數(shù)據(jù)庫(kù)存入緩存,可以提前將數(shù)據(jù)存入緩存。使用緩存預(yù)熱機(jī)制通常有專門(mén)的后臺(tái)程序去將數(shù)據(jù)庫(kù)的數(shù)據(jù)同步到緩存。
能否在不強(qiáng)制轉(zhuǎn)換時(shí)將一個(gè)double值賦值給long類型的變量?
2023-08-22Redis是單進(jìn)程單線程的?_java基礎(chǔ)知識(shí)點(diǎn)
2023-08-21Java中的編譯期常量是什么?使用它有什么風(fēng)險(xiǎn)?
2023-08-18如何調(diào)用wait()方法?使用if塊還是循環(huán)?為什么?
2023-08-18JRE、JDK、JVM及JIT之間有什么不同?_java基礎(chǔ)知識(shí)總結(jié)
2023-08-17Java中有沒(méi)有g(shù)oto?_java基礎(chǔ)知識(shí)點(diǎn)
2023-08-17北京校區(qū)