緩存穿透
什么是緩存穿透咆爽?
一般的緩存系統(tǒng)霞赫,都是按照key去緩存查詢腮介,如果不存在對(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ì)查詢結(jié)果為空的情況也進(jìn)行緩存抵代,緩存時(shí)間設(shè)置短一點(diǎn),或者該key對(duì)應(yīng)的數(shù)據(jù)insert了之后清理緩存忘嫉。
2:對(duì)一定不存在的key進(jìn)行過濾荤牍。可以把所有的可能存在的key放到一個(gè)大的Bitmap中庆冕,查詢時(shí)通過該bitmap過濾康吵。【感覺應(yīng)該用的不多吧】
緩存雪崩
什么是緩存雪崩访递?
當(dāng)緩存服務(wù)器重啟或者大量緩存集中在某一個(gè)時(shí)間段失效晦嵌,這樣在失效的時(shí)候,也會(huì)給后端系統(tǒng)(比如DB)帶來很大壓力拷姿。
如何避免惭载?
1:在緩存失效后,通過加鎖或者隊(duì)列來控制讀數(shù)據(jù)庫寫緩存的線程數(shù)量响巢。比如對(duì)某個(gè)key只允許一個(gè)線程查詢數(shù)據(jù)和寫緩存描滔,其他線程等待。
2:不同的key踪古,設(shè)置不同的過期時(shí)間伴挚,讓緩存失效的時(shí)間點(diǎn)盡量均勻。
3:做二級(jí)緩存灾炭,A1為原始緩存茎芋,A2為拷貝緩存,A1失效時(shí)蜈出,可以訪問A2田弥,A1緩存失效時(shí)間設(shè)置為短期,A2設(shè)置為長(zhǎng)期(此點(diǎn)為補(bǔ)充)
分布式緩存系統(tǒng)
分布式緩存系統(tǒng)面臨的問題
緩存一致性問題
1:緩存系統(tǒng)與底層數(shù)據(jù)的一致性铡原。這點(diǎn)在底層系統(tǒng)是“可讀可寫”時(shí)偷厦,寫得尤為重要
2:有繼承關(guān)系的緩存之間的一致性商叹。為了盡量提高緩存命中率,緩存也是分層:全局緩存只泼,二級(jí)緩存剖笙。他們是存在繼承關(guān)系的。全局緩存可以有二級(jí)緩存來組成请唱。
3:多個(gè)緩存副本之間的一致性弥咪。為了保證系統(tǒng)的高可用性,緩存系統(tǒng)背后往往會(huì)接兩套存儲(chǔ)系統(tǒng)(如memcache十绑,redis等)
緩存穿透和緩存雪崩
緩存數(shù)據(jù)的淘汰
緩存淘汰的策略有兩種:
1: 定時(shí)去清理過期的緩存聚至。
2:當(dāng)有用戶請(qǐng)求過來時(shí),再判斷這個(gè)請(qǐng)求所用到的緩存是否過期本橙,過期的話就去底層系統(tǒng)得到新數(shù)據(jù)并更新緩存扳躬。
兩者各有優(yōu)劣,第一種的缺點(diǎn)是維護(hù)大量緩存的key是比較麻煩的甚亭,第二種的缺點(diǎn)就是每次用戶請(qǐng)求過來都要判斷緩存失效贷币,邏輯相對(duì)比較復(fù)雜,具體用哪種方案亏狰,大家可以根據(jù)自己的應(yīng)用場(chǎng)景來權(quán)衡役纹。
- 預(yù)估失效時(shí)間
- 版本號(hào)(必須單調(diào)遞增,時(shí)間戳是最好的選擇)
- 提供手動(dòng)清理緩存的接口骚揍。