1 ?緩存穿透橘忱,DB壓力增大
? ? 常用的k-v型緩存紫岩,當(dāng)查詢(xún)一個(gè)key而緩存中沒(méi)有value時(shí),就會(huì)去database中查詢(xún)吝镣,如果惡意查詢(xún)會(huì)導(dǎo)致db壓力增大堤器。
? ? 解決方法:
? ?1.空對(duì)象
? ? ? 碰到查詢(xún)結(jié)果為空的鍵,放一個(gè)空值在緩存中末贾,下次再訪問(wèn)就立刻知道這個(gè)鍵無(wú)效闸溃,不會(huì)再訪問(wèn)DB。
? ? ? 空對(duì)象存在的問(wèn)題:1.由于每個(gè)空k-v都會(huì)存在緩存中拱撵,所以空的查詢(xún)?cè)蕉嗷源ǎ彺嫘枨笤酱螅梢酝ㄟ^(guò)設(shè)置過(guò)期時(shí)間來(lái)解決這個(gè)問(wèn)題拴测。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?2.因?yàn)樵O(shè)置了過(guò)期時(shí)間乓旗,當(dāng)此時(shí)間段內(nèi)再次查詢(xún)緩存時(shí),就會(huì)直接返回空值集索,而此時(shí)間段內(nèi)DB數(shù)據(jù)更改了屿愚,數(shù)據(jù)就會(huì)不一致汇跨,可以用消息(kafka)來(lái)同步或者清除對(duì)應(yīng)的緩存。
? ?2.布隆過(guò)濾器
? ? ?(具體見(jiàn)下篇)
? ? ? 去重過(guò)濾妆距,把所有鍵值放到布隆過(guò)濾器中穷遂,布隆過(guò)濾器每個(gè)請(qǐng)求會(huì)返回“在集合內(nèi)(可能錯(cuò)誤)”和“不在集合內(nèi)(絕對(duì)不在集合內(nèi))”兩種情況,所以會(huì)過(guò)濾掉大部分空值的請(qǐng)求娱据,只有少量的空值請(qǐng)求會(huì)穿透蚪黑,減少了db的壓力。
2 ?緩存雪崩
首先緩存失效中剩,比如并發(fā)請(qǐng)求很多時(shí)忌穿,某一時(shí)間查詢(xún)很多數(shù)據(jù)放到緩存并且設(shè)置了過(guò)期時(shí)間,當(dāng)時(shí)間結(jié)束结啼,緩存大片失效伴网,后面的請(qǐng)求都會(huì)直接走向DB,一個(gè)簡(jiǎn)單的方法是均衡過(guò)期時(shí)間妆棒,使緩存失效的時(shí)間段平衡澡腾。
當(dāng)緩存服務(wù)重啟或者大量緩存集中在某一個(gè)時(shí)間段失效,這樣在失效的時(shí)候糕珊,后端系統(tǒng)(比如DB)帶來(lái)很大壓力动分。可以對(duì)線程加鎖或者直接用隊(duì)列查詢(xún)DB红选,減小DB的壓力澜公,缺點(diǎn)的增加了處理時(shí)間±撸可以做緩存服務(wù)器的主備坟乾,主緩存雪崩后走備用服務(wù)器,涉及到數(shù)據(jù)的一致性問(wèn)題蝶防。