參考文章:https://blog.csdn.net/zeb_perfect/article/details/54135506
一搞隐、緩存穿透
重點在透,透過緩存远搪,直接讀取數(shù)據(jù)庫劣纲。什么場景下會出現(xiàn)這種情況呢?
查詢不存在的值谁鳍,是可能出現(xiàn)穿透的癞季。
這種情況大概率是攻擊者
解決方案:
1、緩存空值倘潜,但是一定要設(shè)置過期時間绷柒,且過期時間要短一些。
2涮因、布隆過濾器废睦。構(gòu)造全量數(shù)據(jù)的布隆過濾器,對于不存在的key养泡,有可能查詢出來為1嗜湃。但是查詢出來不為1的key奈应,是一定不存在的,可以直接過濾购披,無需查詢DB钥组。
二、緩存擊穿
重點在“擊”和“穿”今瀑,現(xiàn)象也是流量都打到DB上了。但是点把,它并不是查詢不存在的值引起的橘荠。而是由于某個key恰好失效了郎逃,這個時候恰好高并發(fā)請求過來哥童。這種情況一般出現(xiàn)在熱點key上,用戶又恰好同時訪問這個熱點key褒翰。導(dǎo)致贮懈,并發(fā)請求都打到DB上。
解決方案:
1优训、熱點key朵你,最好不要設(shè)置過期時間。由后臺線程異步定時刷新揣非,可能實時性差一點抡医,但是性能好。
2早敬、過期后忌傻,去數(shù)據(jù)拿數(shù)據(jù)的時候做一下控制。用分布式鎖控制下去DB拿相同key的請求搞监,這種解決方案只適用擊穿水孩,就是只能是同一個key,才能控制并發(fā)琐驴。
三俘种、緩存雪崩
重點在雪崩,意思是大量不同key棍矛,都打到DB上安疗。一般出現(xiàn)在大量key,在同一時間點過期够委,導(dǎo)致請求這些key同時打到DB上荐类。
這個時候,就不能像上面采用鎖在控制并發(fā)了茁帽。因為請求的是不同key玉罐,鎖不住屈嗤。
解決方案:
1、key的過期時間吊输,不要在同一個時間饶号,盡量隨機。
2季蚂、請求排隊茫船,相當(dāng)于削峰。缺點是實時性受影響扭屁。