千鋒教育2023版Java面試寶典Java面試200題(含美團(tuán)、字節(jié)、阿里大廠真

緩存擊穿
key對(duì)應(yīng)的數(shù)據(jù)存在,但在redis中過期,此時(shí)若有大量并發(fā)請(qǐng)求過來,發(fā)現(xiàn)緩存過期后會(huì)從mysql中加載數(shù)據(jù)并回設(shè)到緩存,導(dǎo)致mysql被壓垮
解決方案:
使用syn雙重檢驗(yàn)鎖,只允許單個(gè)線程去查詢數(shù)據(jù)庫(kù) 效率很低
采用定時(shí)器定時(shí)查詢緩存中的數(shù)據(jù),沒有就去數(shù)據(jù)庫(kù)里查,并存入緩存
使用互斥鎖,就是redis的事務(wù)隊(duì)列,就是使用事務(wù)阻塞請(qǐng)求,當(dāng)緩存中沒有數(shù)據(jù)也返回結(jié)果,返回null。然后去查詢數(shù)據(jù)庫(kù)將數(shù)據(jù)存入redis??蛻舳藭?huì)通過重試機(jī)制一直查詢r(jià)edis
使用springretry 去查詢r(jià)edis 看有沒有數(shù)據(jù) 如果沒有 則查詢數(shù)據(jù)庫(kù)給存入redis
緩存穿透
大量請(qǐng)求一些不存在的數(shù)據(jù) 就是請(qǐng)求一些不可能被響應(yīng)的數(shù)據(jù) 導(dǎo)致數(shù)據(jù)庫(kù)被壓垮
解決方案:對(duì)空值進(jìn)行緩存 設(shè)置白名單 使用布隆過濾器
將穿透的key存起來,返回空值,請(qǐng)求不會(huì)到達(dá)mysql 進(jìn)行接口防刷
緩存雪崩
redis中有大量的key失效了,此時(shí)過來大量并發(fā)請(qǐng)求。redis無(wú)法響應(yīng) 從而走mysql導(dǎo)致崩潰
解決方案:分散key過期的時(shí)間 不要讓大量key都在同一時(shí)間過期
做雙緩存,就是在redis里存兩次,客戶端第一次獲取key_1如果key_1返回null就從key_2獲取
采用熔斷降級(jí)等操作以及redis要保證高可用