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