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

緩存擊穿是指一個非常熱門的緩存key在緩存失效的瞬間,再次被請求,此時大量的請求都直接穿過緩存直接請求到了應(yīng)用服務(wù)。這時應(yīng)用服務(wù)可能會因為無法承受高并發(fā)的請求而崩潰,從而導(dǎo)致系統(tǒng)整體性能下降。
為了解決緩存擊穿問題,常見的解決方案有以下幾種:
- 限流降級:通過對緩存請求進(jìn)行限流或者降級操作,避免因為高并發(fā)導(dǎo)致應(yīng)用服務(wù)崩潰。
- 加鎖:使用互斥鎖或分布式鎖等機(jī)制,保證在緩存失效和被填充的時間段內(nèi),不會有兩個進(jìn)程同時訪問到數(shù)據(jù)庫,并且只有一個進(jìn)程能夠重新去加載數(shù)據(jù)。
- 預(yù)加載:提前加載熱門key或熱點數(shù)據(jù),或者使用預(yù)熱機(jī)制,在數(shù)據(jù)過期之前提前刷新緩存,確保數(shù)據(jù)的質(zhì)量和時效性。
- 使用布隆過濾器:使用布隆過濾器對緩存key進(jìn)行過濾,判斷緩存中是否存在該key,有效減少數(shù)據(jù)庫的訪問。
- 使用二級緩存:使用二級緩存機(jī)制,將熱點數(shù)據(jù)緩存在應(yīng)用內(nèi)存中,減少數(shù)據(jù)庫的訪問頻率,提高訪問效率。
緩存穿透如何解決
緩存穿透指查詢一個不存在的數(shù)據(jù),由于緩存中沒有該數(shù)據(jù),每次查詢都會穿透緩存請求到數(shù)據(jù)庫中,這樣會給數(shù)據(jù)庫帶來很大的壓力。
為了解決緩存穿透問題,常見的解決方案有以下幾種:
- 布隆過濾器:使用布隆過濾器可以有效地識別出不存在的數(shù)據(jù),從而減輕數(shù)據(jù)庫的負(fù)擔(dān)。如果緩存中存在對應(yīng)的key,則直接返回結(jié)果;如果不存在對應(yīng)的key,則直接返回缺省值。
- 緩存空對象:緩存空對象可以有效地從源頭上解決緩存穿透的問題。如果查詢的數(shù)據(jù)不存在數(shù)據(jù)庫中,則在緩存中先存儲一個空對象,這樣下次查詢緩存的時候就可以直接返回空對象,而不需要每次都進(jìn)行數(shù)據(jù)庫查詢。
- 設(shè)置超時時間:緩存中如果長時間無請求則失效,可以設(shè)置超時時間,避免緩存中的數(shù)據(jù)一直存在而不會被更新。
- 前綴和諧:給緩存key設(shè)置前綴,可以將查詢不存在的key攔截掉,從而避免請求數(shù)據(jù)庫,減輕數(shù)據(jù)庫的壓力。
- 限流控制:對請求進(jìn)行限流控制,可以有效地避免由于高并發(fā)而導(dǎo)致的緩存穿透問題??梢允褂孟蘖魉惴?,如令牌桶算法、漏桶算法等。
緩存雪崩問題
緩存雪崩
緩存雪崩
緩存雪崩如何解決
緩存雪崩指在同一時間內(nèi),緩存中大量的數(shù)據(jù)失效或者緩存服務(wù)器宕機(jī),導(dǎo)致請求直接打到了后端數(shù)據(jù)庫,后端數(shù)據(jù)庫無法承受如此大量的請求,從而導(dǎo)致整個系統(tǒng)崩潰。
為了解決緩存雪崩問題,常見的解決方案有以下幾種:
- 數(shù)據(jù)分布:將數(shù)據(jù)分布到不同的緩存機(jī)器上,避免單一緩存機(jī)器失效引起其他機(jī)器無法承受高并發(fā)的情況。
- 備份機(jī)制:設(shè)置緩存?zhèn)浞輽C(jī)制,當(dāng)緩存服務(wù)器宕機(jī)時,能夠自動切換到備份服務(wù)器上,避免單點故障導(dǎo)致的系統(tǒng)崩潰。
- 多級緩存:使用多級緩存機(jī)制,將緩存分為多個層級,不同層級的緩存時間不同,這樣可以有效地避免同時失效導(dǎo)致的雪崩問題。
- 預(yù)熱機(jī)制:在系統(tǒng)啟動的時候,對系統(tǒng)中可能出現(xiàn)熱點數(shù)據(jù)進(jìn)行預(yù)熱,這樣可以在系統(tǒng)運行時減少對后端數(shù)據(jù)庫的查詢,減少緩存雪崩的風(fēng)險。
- 限流降級:在高并發(fā)情況下,對請求進(jìn)行限流或者降級操作,避免由于請求過多,導(dǎo)致系統(tǒng)崩潰,從而保證了系統(tǒng)的可用性。
緩存擊穿是指一個非常熱門的緩存key在緩存失效的瞬間,再次被請求,此時大量的請求都直接穿過緩存直接請求到了應(yīng)用服務(wù)。這時應(yīng)用服務(wù)可能會因為無法承受高并發(fā)的請求而崩潰,從而導(dǎo)致系統(tǒng)整體性能下降。
為了解決緩存擊穿問題,常見的解決方案有以下幾種:
- 限流降級:通過對緩存請求進(jìn)行限流或者降級操作,避免因為高并發(fā)導(dǎo)致應(yīng)用服務(wù)崩潰。
- 加鎖:使用互斥鎖或分布式鎖等機(jī)制,保證在緩存失效和被填充的時間段內(nèi),不會有兩個進(jìn)程同時訪問到數(shù)據(jù)庫,并且只有一個進(jìn)程能夠重新去加載數(shù)據(jù)。
- 預(yù)加載:提前加載熱門key或熱點數(shù)據(jù),或者使用預(yù)熱機(jī)制,在數(shù)據(jù)過期之前提前刷新緩存,確保數(shù)據(jù)的質(zhì)量和時效性。
- 使用布隆過濾器:使用布隆過濾器對緩存key進(jìn)行過濾,判斷緩存中是否存在該key,有效減少數(shù)據(jù)庫的訪問。
- 使用二級緩存:使用二級緩存機(jī)制,將熱點數(shù)據(jù)緩存在應(yīng)用內(nèi)存中,減少數(shù)據(jù)庫的訪問頻率,提高訪問效率。
標(biāo)簽: