一呛梆、緩存處理流程
前臺(tái)請(qǐng)求锐涯,后臺(tái)先從緩存中取數(shù)據(jù),取到直接返回結(jié)果填物,取不到時(shí)從數(shù)據(jù)庫中取纹腌,數(shù)據(jù)庫取到更新緩存,并返回結(jié)果滞磺,數(shù)據(jù)庫也沒取到升薯,那直接返回空結(jié)果。
二击困、緩存穿透
描述:
緩存穿透是指緩存和數(shù)據(jù)庫中都沒有的數(shù)據(jù)涎劈,而用戶不斷發(fā)起請(qǐng)求广凸,如發(fā)起為id為“-1”的數(shù)據(jù)或id為特別大不存在的數(shù)據(jù)。這時(shí)的用戶很可能是攻擊者蛛枚,攻擊會(huì)導(dǎo)致數(shù)據(jù)庫壓力過大谅海。
解決方案:
1.接口層增加校驗(yàn),如用戶鑒權(quán)校驗(yàn)蹦浦,id做基礎(chǔ)校驗(yàn)扭吁,id<=0的直接攔截;
2.從緩存取不到的數(shù)據(jù)盲镶,在數(shù)據(jù)庫中也沒有取到侥袜,這時(shí)也可以將key-value對(duì)寫為key-null,緩存有效時(shí)間可以設(shè)置短點(diǎn)溉贿,如30秒(設(shè)置太長會(huì)導(dǎo)致正常情況也沒法使用)枫吧。這樣可以防止攻擊用戶反復(fù)用同一個(gè)id暴力攻擊。
三宇色、緩存擊穿
描述:
緩存擊穿是指緩存中沒有但數(shù)據(jù)庫中有的數(shù)據(jù)(一般是緩存時(shí)間到期)九杂,這時(shí)由于并發(fā)用戶特別多,同時(shí)讀緩存沒讀到數(shù)據(jù)代兵,又同時(shí)去數(shù)據(jù)庫去取數(shù)據(jù)尼酿,引起數(shù)據(jù)庫壓力瞬間增大爷狈,造成過大壓力植影。
解決方案:
設(shè)置熱點(diǎn)數(shù)據(jù)永遠(yuǎn)不過期。
加互斥鎖涎永,互斥鎖參考代碼如下:
說明:
1)緩存中有數(shù)據(jù)思币,直接走上述代碼13行后就返回結(jié)果了。
2)緩存中沒有數(shù)據(jù)羡微,第1個(gè)進(jìn)入的線程谷饿,獲取鎖并從數(shù)據(jù)庫去取數(shù)據(jù),沒釋放鎖之前妈倔,其他并行進(jìn)入的線程會(huì)等待100ms博投,再重新去緩存取數(shù)據(jù)。這樣就防止都去數(shù)據(jù)庫重復(fù)取數(shù)據(jù)盯蝴,重復(fù)往緩存中更新數(shù)據(jù)情況出現(xiàn)毅哗。
3)當(dāng)然這是簡(jiǎn)化處理,理論上如果能根據(jù)key值加鎖就更好了捧挺,就是線程A從數(shù)據(jù)庫取key1的數(shù)據(jù)并不妨礙線程B取key2的數(shù)據(jù)虑绵,上面代碼明顯做不到這點(diǎn)。
四闽烙、緩存雪崩
描述:
緩存雪崩是指緩存中數(shù)據(jù)大批量到過期時(shí)間翅睛,而查詢數(shù)據(jù)量巨大,引起數(shù)據(jù)庫壓力過大甚至down機(jī)。和緩存擊穿不同的是捕发,緩存擊穿指并發(fā)查同一條數(shù)據(jù)疏旨,緩存雪崩是不同數(shù)據(jù)都過期了,很多數(shù)據(jù)都查不到從而查數(shù)據(jù)庫扎酷。
解決方案:
1.緩存數(shù)據(jù)的過期時(shí)間設(shè)置隨機(jī)充石,防止同一時(shí)間大量數(shù)據(jù)過期現(xiàn)象發(fā)生。
2.如果緩存數(shù)據(jù)庫是分布式部署霞玄,將熱點(diǎn)數(shù)據(jù)均勻分布在不同搞得緩存數(shù)據(jù)庫中骤铃。
3.設(shè)置熱點(diǎn)數(shù)據(jù)永遠(yuǎn)不過期。
總結(jié):
緩存穿透是指緩存和數(shù)據(jù)庫都沒有數(shù)據(jù)的情況下發(fā)生坷剧。
緩存擊穿是指緩存中無惰爬,數(shù)據(jù)庫有,并發(fā)下大量用戶訪問同一id的數(shù)據(jù)惫企。
緩存雪崩是指緩存中大量key同時(shí)過期撕瞧,而查詢數(shù)據(jù)量大的情況下發(fā)生。