加緩存
如果你平時(shí)都用一些ORM工具很可能下邊這些問(wèn)題你不會(huì)直接遇到,不過(guò)這些問(wèn)題都是在你加緩存之前需要著實(shí)想清楚的。算是一些通用的套路浓体。我們逐條來(lái)看一下。
緩存穿透
? ? ? 緩存穿透是說(shuō)訪問(wèn)一個(gè)緩存中沒(méi)有的數(shù)據(jù)辈讶,但是這個(gè)數(shù)據(jù)數(shù)據(jù)庫(kù)中也不存在汹碱。普通思路下我們沒(méi)有從數(shù)據(jù)庫(kù)中拿到數(shù)據(jù)是不會(huì)觸發(fā)加緩存操作的。這時(shí)如果是有人惡意攻擊荞估,大量的訪問(wèn)就會(huì)透過(guò)緩存直接打到數(shù)據(jù)庫(kù)咳促,對(duì)后端服務(wù)和數(shù)據(jù)庫(kù)做成巨大的壓力甚至宕機(jī)稚新。
解決方案:
緩存空對(duì)象。如果緩存未命中跪腹,而數(shù)據(jù)庫(kù)中也沒(méi)有這個(gè)對(duì)象褂删,則可以緩存一個(gè)空對(duì)象到緩存。如果使用Redis冲茸,這種key需設(shè)置一個(gè)較短的時(shí)間屯阀,以防內(nèi)存浪費(fèi)。
緩存預(yù)測(cè)轴术。預(yù)測(cè)key是否存在难衰。如果緩存的量不大可以使用hash來(lái)判斷,如果量大可以使用布隆過(guò)濾器來(lái)做判斷逗栽。
緩存并發(fā)
?緩存并發(fā)這個(gè)場(chǎng)景很容易解釋?zhuān)?/b>多個(gè)客戶端同時(shí)訪問(wèn)一個(gè)沒(méi)有在cache中的數(shù)據(jù)盖袭,這時(shí)每個(gè)客戶端都會(huì)執(zhí)行從DB加載數(shù)據(jù)set到緩存,就會(huì)造成緩存并發(fā)彼宠。
解決方案:
緩存預(yù)熱鳄虱。提前把所有預(yù)期的熱數(shù)據(jù)加到緩存。定位熱數(shù)據(jù)還是比較復(fù)雜的事情凭峡,需要根據(jù)自己的服務(wù)訪問(wèn)情況去評(píng)估拙已。這個(gè)方案只能減輕緩存并發(fā)的發(fā)生次數(shù)不能全部抵制。
緩存加鎖摧冀。?如果多個(gè)客戶端訪問(wèn)不存在的緩存時(shí)倍踪,在執(zhí)行加載數(shù)據(jù)并set緩存這個(gè)邏輯之前先加鎖,只能讓一個(gè)客戶端執(zhí)行這段邏輯索昂。
緩存防雪崩
? ? ? 緩存雪崩是緩存服務(wù)暫時(shí)不能提供服務(wù)建车,導(dǎo)致所有的請(qǐng)求都直接訪問(wèn)DB。
解決方案:
構(gòu)建高可用的緩存系統(tǒng)楼镐。目前常用的緩存系統(tǒng)Redis和Memcache都支持高可用的部署方式,所以部署的時(shí)候不防先考慮是否要以高可用的集群方式部署往枷。
限流框产。Netflix的Hystrix是非常不錯(cuò)的工具,在用緩存時(shí)不妨搭配它來(lái)使用错洁。