緩存穿透
? ? ? ? 緩存穿透是指緩存服務(wù)器和數(shù)據(jù)庫(kù)中都沒(méi)有符合條件的數(shù)據(jù)辆亏,例如查找id<0的用戶风秤,由于該類用戶不存在所以緩存中沒(méi)有對(duì)應(yīng)數(shù)據(jù),每次請(qǐng)求進(jìn)來(lái)都會(huì)從數(shù)據(jù)庫(kù)中進(jìn)行一次查詢扮叨;這類請(qǐng)求可能是潛在的攻擊者發(fā)起的缤弦,當(dāng)請(qǐng)求量很大時(shí)會(huì)導(dǎo)致數(shù)據(jù)庫(kù)壓力過(guò)大。
解決方案:
一彻磁、緩存服務(wù)器中允許存空值:例如當(dāng)首次查詢id=-2的用戶時(shí)碍沐,在緩存服務(wù)器中將null作為value存入,此后查詢?cè)撚脩魰r(shí)直接將緩存服務(wù)器中的null返回衷蜓;應(yīng)當(dāng)注意的是累提,為了查詢結(jié)果的正確性,在必要時(shí)要對(duì)null值進(jìn)行更新磁浇,例如斋陪,假設(shè)此前查詢id=999的用戶并不存在,緩存服務(wù)器中保存了999:null的一條記錄置吓,但是隨著用戶的新增鳍贾,如果此后創(chuàng)建了id=999的用戶,就需要對(duì)緩存服務(wù)器中的這條記錄進(jìn)行更新交洗。
二骑科、BloomFilter:大部分情況下,緩存穿透是很多惡意請(qǐng)求引起的构拳,這些請(qǐng)求可能隨機(jī)生成查詢條件進(jìn)行查詢咆爽,這些查詢條件對(duì)應(yīng)的數(shù)據(jù)在緩存服務(wù)器和數(shù)據(jù)庫(kù)中都沒(méi)有梁棠,就容易引起緩存穿透;因此斗埂,我們可以將查詢的數(shù)據(jù)條件哈希到一個(gè)足夠大的布隆過(guò)濾器中符糊,請(qǐng)求會(huì)首先被布隆過(guò)濾器攔截,一定不存在的數(shù)據(jù)就直接攔截返回了呛凶,從而降低對(duì)數(shù)據(jù)庫(kù)的壓力男娄。
緩存擊穿
? ? ? ? 緩存擊穿是緩存服務(wù)器中沒(méi)有但是數(shù)據(jù)庫(kù)中有的數(shù)據(jù)(例如當(dāng)該條緩存過(guò)期時(shí)),如果大并發(fā)量請(qǐng)求進(jìn)來(lái)漾稀,在緩存服務(wù)器中沒(méi)有此條數(shù)據(jù)模闲,這些請(qǐng)求同時(shí)去數(shù)據(jù)庫(kù)中進(jìn)行查找,造成數(shù)據(jù)庫(kù)瞬間壓力增大崭捍。
解決方案:
一尸折、異步更新:通過(guò)定時(shí)任務(wù)在緩存服務(wù)器中的數(shù)據(jù)未過(guò)期時(shí)對(duì)其進(jìn)行更新。
二殷蛇、互斥鎖:當(dāng)Redis中根據(jù)key獲得的value值為空時(shí)实夹,先鎖上,然后從數(shù)據(jù)庫(kù)加載粒梦,加載完畢亮航,釋放鎖。若其他線程也在請(qǐng)求該key時(shí)匀们,發(fā)現(xiàn)獲取鎖失敗塞赂,則先阻塞;采用互斥鎖實(shí)際上就是將并行變成串行昼蛀,會(huì)降低系統(tǒng)吞吐量宴猾。
緩存雪崩
? ??????緩存雪崩是指緩存中大量緩存同時(shí)過(guò)期,而查詢數(shù)據(jù)量巨大叼旋,引起數(shù)據(jù)庫(kù)壓力過(guò)大甚至宕機(jī)仇哆。和緩存擊穿不同的是,緩存擊穿指并發(fā)查同一條數(shù)據(jù)夫植,緩存雪崩是不同數(shù)據(jù)都過(guò)期了讹剔,很多數(shù)據(jù)都查不到從而查數(shù)據(jù)庫(kù)。
解決方案:
一详民、為緩存數(shù)據(jù)設(shè)置不同的過(guò)期時(shí)間延欠。
二、緩存服務(wù)器集群部署:采用集群部署沈跨,避免緩存服務(wù)器單點(diǎn)故障由捎。