1. 緩存穿透:一般的緩存系統(tǒng),都是按照key去緩存查詢(xún),如果不存在對(duì)用的value,就應(yīng)該去后端系統(tǒng)查找(比如DB數(shù)據(jù)庫(kù))。一些惡意的請(qǐng)求會(huì)故意查詢(xún)不存在的key,請(qǐng)求量很大,就會(huì)對(duì)后端系統(tǒng)造成很大的壓力。這就叫做緩存穿透。
2. 怎么解決? 對(duì)查詢(xún)結(jié)果為空的情況也進(jìn)行緩存,緩存時(shí)間設(shè)置短一點(diǎn),或者該key對(duì)應(yīng)的數(shù)據(jù)insert之后清理緩存。 對(duì)一定不存在的key進(jìn)行過(guò)濾。可以把所有的可能存在的key放到一個(gè)大的Bitmap中,查詢(xún)時(shí)通過(guò)該Bitmap過(guò)濾。
3. 緩存雪崩:當(dāng)緩存服務(wù)器重啟或者大量緩存集中在某一時(shí)間段失效,這樣在失效的時(shí)候,會(huì)給后端系統(tǒng)帶來(lái)很大的壓力,導(dǎo)致系統(tǒng)崩潰。
4. 如何解決? 在緩存失效后,通過(guò)加鎖或者隊(duì)列來(lái)控制讀數(shù)據(jù)庫(kù)寫(xiě)緩存的線程數(shù)量。比如對(duì)某個(gè)key只允許一個(gè)線程查詢(xún)數(shù)據(jù)和寫(xiě)緩存,其它線程等待; 做二級(jí)緩存; 不同的key,設(shè)置不同的過(guò)期時(shí)間,讓緩存失效的時(shí)間盡量均勻;