不合理使用緩存非但不能提高系統(tǒng)的性能,還會(huì)成為系統(tǒng)的累贅,甚至風(fēng)險(xiǎn)。
1、頻繁修改的數(shù)據(jù)
如果緩存中保存的是頻繁修改的數(shù)據(jù),就會(huì)出現(xiàn)數(shù)據(jù)寫入緩存后,應(yīng)用還來不及讀取緩存,數(shù)據(jù)就已經(jīng)失效,徒增系統(tǒng)負(fù)擔(dān)。一般來說,數(shù)據(jù)的讀寫比在2:1(寫入一次緩存,在數(shù)據(jù)更新前至少讀取兩次)以上,緩存才有意義。
2、沒有熱點(diǎn)的訪問
如果應(yīng)用系統(tǒng)訪問數(shù)據(jù)沒有熱點(diǎn),不遵循二八定律,那么緩存就沒有意義。
3、數(shù)據(jù)不一致與臟讀
一般會(huì)對(duì)緩存的數(shù)據(jù)設(shè)置失效時(shí)間,一旦超過失效時(shí)間,就要從數(shù)據(jù)庫中重新加載。因此要容忍一定時(shí)間的數(shù)據(jù)不一致,如賣家已經(jīng)編輯了商品屬性,但是需要過一段時(shí)間才能被買家看到。還有一種策略是數(shù)據(jù)更新立即更新緩存,不過這也會(huì)帶來更多系統(tǒng)開銷和事務(wù)一致性問題。
4、緩存可用性
緩存會(huì)承擔(dān)大部分?jǐn)?shù)據(jù)庫訪問壓力,數(shù)據(jù)庫已經(jīng)習(xí)慣了有緩存的日子,所以當(dāng)緩存服務(wù)崩潰時(shí),數(shù)據(jù)庫會(huì)因?yàn)橥耆荒艹惺苋绱舜髩毫Χ礄C(jī),導(dǎo)致網(wǎng)站不可用。這種情況被稱作緩存雪崩,發(fā)生這種故障,甚至不能簡單地重啟緩存服務(wù)器和數(shù)據(jù)庫服務(wù)器來恢復(fù)。
實(shí)踐中,有的網(wǎng)站通過緩存熱備份等手段提高緩存可用性:當(dāng)某臺(tái)緩存服務(wù)器宕機(jī)時(shí),將緩存訪問切換到熱備服務(wù)器上。但這種設(shè)計(jì)有違緩存的初衷,緩存根本就不應(yīng)該當(dāng)做一個(gè)可靠的數(shù)據(jù)源來使用。
通過分布式緩存服務(wù)器集群,將緩存數(shù)據(jù)分布到集群多臺(tái)服務(wù)器上可在一定程度上改善緩存的可用性。當(dāng)一臺(tái)緩存服務(wù)器宕機(jī)時(shí),只有部分緩存數(shù)據(jù)丟失,重新從數(shù)據(jù)庫加載這部分?jǐn)?shù)據(jù)不會(huì)產(chǎn)生很大的影響。
5、緩存預(yù)熱warm up
緩存中存放的是熱點(diǎn)數(shù)據(jù),熱點(diǎn)數(shù)據(jù)又是緩存系統(tǒng)利用LRU(最近最久未用算法)對(duì)不斷訪問的數(shù)據(jù)篩選淘汰出來,這個(gè)過程需要花費(fèi)較長的時(shí)間。新系統(tǒng)的緩存系統(tǒng)如果沒有任何數(shù)據(jù),在重建緩存數(shù)據(jù)的過程中,系統(tǒng)的性能和數(shù)據(jù)庫負(fù)載都不太好,那么最好在緩存系統(tǒng)啟動(dòng)時(shí)就把熱點(diǎn)數(shù)據(jù)加載好,這個(gè)緩存預(yù)加載手段叫緩存預(yù)熱。對(duì)于一些元數(shù)據(jù)如城市地名列表、類目信息,可以在啟動(dòng)時(shí)加載數(shù)據(jù)庫中全部數(shù)據(jù)到緩存進(jìn)行預(yù)熱。
6、避免緩存穿透
如果因?yàn)椴磺‘?dāng)?shù)臉I(yè)務(wù)、或者惡意攻擊持續(xù)高并發(fā)地請(qǐng)求某個(gè)不存在的數(shù)據(jù),由于緩存沒有保存該數(shù)據(jù),所有的請(qǐng)求都會(huì)落到數(shù)據(jù)庫上,會(huì)對(duì)數(shù)據(jù)庫造成壓力,甚至崩潰。一個(gè)簡單的對(duì)策是將不存在的數(shù)據(jù)也緩存起來(其value為null)。