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