JAVA面試題之緩存擊穿、緩存穿透、緩存雪崩的三者區(qū)別_第1頁
JAVA面試題之緩存擊穿、緩存穿透、緩存雪崩的三者區(qū)別_第2頁
JAVA面試題之緩存擊穿、緩存穿透、緩存雪崩的三者區(qū)別_第3頁
JAVA面試題之緩存擊穿、緩存穿透、緩存雪崩的三者區(qū)別_第4頁
JAVA面試題之緩存擊穿、緩存穿透、緩存雪崩的三者區(qū)別_第5頁
全文預(yù)覽已結(jié)束

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

第JAVA面試題之緩存擊穿、緩存穿透、緩存雪崩的三者區(qū)別目錄調(diào)用鏈路緩存擊穿含義:解決方案:緩存穿透含義:解決方案:緩存雪崩含義:解決方案:前端發(fā)起一個(gè)請求,經(jīng)歷過三次握手后連接到服務(wù)器,想要獲取相應(yīng)的數(shù)據(jù),那么服務(wù)器接入了緩存中間件后,從接收到Request到最后的Response,到底是怎樣的一個(gè)流程呢?以下探討忽略掉參數(shù)校驗(yàn)等邏輯,直接講最核心的鏈路。

調(diào)用鏈路

一個(gè)請求Request過來,服務(wù)器首先和緩存中間件建立連接,傳輸對應(yīng)key到緩存中間件中獲取相對應(yīng)的數(shù)據(jù),服務(wù)器拿到返回的結(jié)果后,判斷返回的結(jié)果是否有數(shù)據(jù),如果有數(shù)據(jù),則返回從緩存中拿到的結(jié)果。如果緩存中間件中沒有數(shù)據(jù),則建立數(shù)據(jù)庫連接,訪問數(shù)據(jù)庫服務(wù)器,按照相應(yīng)邏輯拿到返回結(jié)果,判斷結(jié)果中是否有數(shù)據(jù),如果有則返回對應(yīng)數(shù)據(jù),如果沒有則按照業(yè)務(wù)場景要求,返回對應(yīng)結(jié)果(一般為null或者new一個(gè)空對象)。

緩存擊穿

含義:

什么是緩存擊穿?通俗的講指的是緩存中沒有數(shù)據(jù),但數(shù)據(jù)庫中有數(shù)據(jù)的場景。那為什么緩存中會(huì)沒有數(shù)據(jù)呢?一般是由于設(shè)置了緩存時(shí)間導(dǎo)致緩存過期,所以沒有數(shù)據(jù)。那緩存找不到數(shù)據(jù)去數(shù)據(jù)庫查詢就好了呀,為啥又叫擊穿?是因?yàn)橐樵冞@個(gè)key對應(yīng)的數(shù)據(jù)是一個(gè)熱點(diǎn)數(shù)據(jù),并發(fā)訪問的量大,同時(shí)去查詢數(shù)據(jù)庫,導(dǎo)致數(shù)據(jù)庫壓力驟增,嚴(yán)重會(huì)打崩數(shù)據(jù)庫。

解決方案:

1、如果是不改變的數(shù)據(jù),如一些常量值,則可以設(shè)置對應(yīng)熱點(diǎn)key永不過期。

2、加上互斥鎖,防止同一臺(tái)服務(wù)器同一時(shí)間有多個(gè)連接訪問數(shù)據(jù)庫。

//偽代碼

publicclassMain{

//雙重檢測鎖

publicstaticStringgetHotData(Stringkey){

//先從緩存中間件獲取對應(yīng)熱點(diǎn)key數(shù)據(jù)

Stringresponse=redis.get(key);

//緩存沒有數(shù)據(jù)

if(Objects.isNull(response)){

//保證一臺(tái)服務(wù)器同一時(shí)間只有一個(gè)線程訪問

synchronized(Main.class){

//假設(shè)A線程訪問進(jìn)synchronized里,線程B,C阻塞在synchronsized外面

//線程A退出synchronized后,線程B和C應(yīng)該從redis中拿而不是再訪問數(shù)據(jù)庫

response=redis.get(key);

//訪問數(shù)據(jù)庫拿到數(shù)據(jù)后寫進(jìn)redis中

if(Objects.isNull(response)){

response=loadDataFromMySQL(key);

redis.set(key,response);

returnresponse;

}

3、加上分布式鎖,全局保證只有一個(gè)線程訪問數(shù)據(jù)庫。

//偽代碼

publicclassMain{

//分布式唯一key

publicstaticStringgetHotData(Stringkey,inttryTime)throwsInterruptedException{

if(tryTime=4){

return"";

//先從緩存中間件獲取對應(yīng)熱點(diǎn)key數(shù)據(jù)

Stringresponse=redis.get(key);

//緩存沒有數(shù)據(jù)

if(Objects.isNull(response)){

//保證整個(gè)服務(wù)集群同一時(shí)間只有一個(gè)線程訪問

if(redis.tryLock()){

try{

//訪問數(shù)據(jù)庫拿到數(shù)據(jù)后寫進(jìn)redis中

if(Objects.isNull(response)){

response=loadDataFromMySQL(key);

redis.set(key,response);

}finally{

redis.unlock();

}else{

TimeUnit.MILLISECONDS.sleep(100);

getHotData(key,tryTime+1);

returnresponse;

}

緩存穿透

緩存穿透指的是緩存中間件和數(shù)據(jù)庫都沒有對應(yīng)的數(shù)據(jù),但是不斷接收到請求獲取該key的數(shù)據(jù),導(dǎo)致數(shù)據(jù)庫壓力過大,甚至崩潰。

解決方案:

1、訪問數(shù)據(jù)庫也拿不到數(shù)據(jù)后,可以按照具體業(yè)務(wù)要求,在緩存層加上一個(gè)該key的值,設(shè)置一個(gè)過期時(shí)間,比如10s或者1min等。那為什么不設(shè)不過期呢?第一個(gè)是說因?yàn)樵搆ey可能有對應(yīng)的業(yè)務(wù)含義,有可能只是該時(shí)間點(diǎn)還沒有數(shù)據(jù),所以不能設(shè)置不過期;第二個(gè)是說如果真的是惡意訪問,那么可能過一段時(shí)間就沒有類似請求,那么我們沒有必要一直把該數(shù)據(jù)留在緩存里。

2、增加校驗(yàn),如果是不符合預(yù)期的請求可以直接過濾,比如說緩存中存放了用戶信息,對應(yīng)的緩存key是和id有關(guān)系,那么如果你的id都是大于等于0的,對于小于0的id可以直接做過濾。

@Controller

publicclassController{

@RequestMapping(value="/test")

publicStringprintHello(Integerid){

if(Objects.isNull(id)||id0){

returnnull;

//處理對應(yīng)邏輯

}

緩存雪崩

緩存雪崩指的是在同一個(gè)時(shí)間點(diǎn),緩存中的大批量數(shù)據(jù)過期,并且還都是熱點(diǎn)數(shù)據(jù),導(dǎo)致同一時(shí)間并發(fā)壓力都打到了數(shù)據(jù)庫中,導(dǎo)致數(shù)據(jù)庫壓力驟增,甚至宕機(jī)。有的人就會(huì)問了,這和緩存擊穿不是一個(gè)意思嗎?緩存擊穿指的是并發(fā)查詢某條熱點(diǎn)key數(shù)據(jù),緩存雪崩指的是大批量。出現(xiàn)場景之一是在某些核心頁面,該頁面的內(nèi)容都放入了緩存,并且都設(shè)置了同樣的緩存時(shí)間。

解決方案:

1、最簡單的就是設(shè)置熱點(diǎn)數(shù)據(jù)不過期,但要結(jié)合對應(yīng)業(yè)務(wù)場景來看。

2、

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論