緩存穿透

什么是緩存穿透?

一般的緩存系統(tǒng),都是按照key去緩存查詢(xún),如果不存在對(duì)應(yīng)的value,就應(yīng)該去后端系統(tǒng)查找(比如DB)。如果key對(duì)應(yīng)的value是一定不存在的,并且對(duì)該key并發(fā)請(qǐng)求量很大,就會(huì)對(duì)后端系統(tǒng)造成很大的壓力。這就叫做緩存穿透。

如何避免?

1:對(duì)查詢(xún)結(jié)果為空的情況也進(jìn)行緩存,緩存時(shí)間設(shè)置短一點(diǎn),或者該key對(duì)應(yīng)的數(shù)據(jù)insert了之后清理緩存。

2:對(duì)一定不存在的key進(jìn)行過(guò)濾??梢园阉械目赡艽嬖诘膋ey放到一個(gè)大的Bitmap中,查詢(xún)時(shí)通過(guò)該bitmap過(guò)濾。

緩存雪崩

什么是緩存雪崩?

當(dāng)緩存服務(wù)器重啟或者大量緩存集中在某一個(gè)時(shí)間段失效,這樣在失效的時(shí)候,也會(huì)給后端系統(tǒng)(比如DB)帶來(lái)很大壓力。

如何避免?

1:在緩存失效后,通過(guò)加鎖或者隊(duì)列來(lái)控制讀數(shù)據(jù)庫(kù)寫(xiě)緩存的線(xiàn)程數(shù)量。比如對(duì)某個(gè)key只允許一個(gè)線(xiàn)程查詢(xún)數(shù)據(jù)和寫(xiě)緩存,其他線(xiàn)程等待。

2:不同的key,設(shè)置不同的過(guò)期時(shí)間,讓緩存失效的時(shí)間點(diǎn)盡量均勻。

3:做二級(jí)緩存,A1為原始緩存,A2為拷貝緩存,A1失效時(shí),可以訪(fǎng)問(wèn)A2,A1緩存失效時(shí)間設(shè)置為短期,A2設(shè)置為長(zhǎng)期(此點(diǎn)為補(bǔ)充)。

分布式緩存系統(tǒng)

分布式緩存系統(tǒng)面臨的問(wèn)題

緩存一致性問(wèn)題

1:緩存系統(tǒng)與底層數(shù)據(jù)的一致性。這點(diǎn)在底層系統(tǒng)是“可讀可寫(xiě)”時(shí),寫(xiě)得尤為重要

2:有繼承關(guān)系的緩存之間的一致性。為了盡量提高緩存命中率,緩存也是分層:全局緩存,二級(jí)緩存。他們是存在繼承關(guān)系的。全局緩存可以有二級(jí)緩存來(lái)組成。

3:多個(gè)緩存副本之間的一致性。為了保證系統(tǒng)的高可用性,緩存系統(tǒng)背后往往會(huì)接兩套存儲(chǔ)系統(tǒng)(如memcache,redis等)

緩存穿透和緩存雪崩

緩存穿透以及雪崩在上面有一些講解

緩存數(shù)據(jù)的淘汰

緩存淘汰的策略有兩種: (1) 定時(shí)去清理過(guò)期的緩存。 (2)當(dāng)有用戶(hù)請(qǐng)求過(guò)來(lái)時(shí),再判斷這個(gè)請(qǐng)求所用到的緩存是否過(guò)期,過(guò)期的話(huà)就去底層系統(tǒng)得到新數(shù)據(jù)并更新緩存。

兩者各有優(yōu)劣,第一種的缺點(diǎn)是維護(hù)大量緩存的key是比較麻煩的,第二種的缺點(diǎn)就是每次用戶(hù)請(qǐng)求過(guò)來(lái)都要判斷緩存失效,邏輯相對(duì)比較復(fù)雜,具體用哪種方案,大家可以根據(jù)自己的應(yīng)用場(chǎng)景來(lái)權(quán)衡。

1. 預(yù)估失效時(shí)間 2. 版本號(hào)(必須單調(diào)遞增,時(shí)間戳是最好的選擇)3. 提供手動(dòng)清理緩存的接口。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容