什麼情況引起redis緩存穿透?一:redis雪崩redis雪崩是指redis在某個時間大量失效,突然造成數據庫訪問壓力急劇增大,像雪崩一樣,redis雪崩危害巨大,甚至有可能服務器宕機,給公司造成巨大的經濟損失,下面我們就來說一說關于什麼情況引起redis緩存穿透?我們一起去了解并探讨一下這個問題吧!
一:redis雪崩
redis雪崩是指redis在某個時間大量失效,突然造成數據庫訪問壓力急劇增大,像雪崩一樣,redis雪崩危害巨大,甚至有可能服務器宕機,給公司造成巨大的經濟損失。
解決方案:設置超時時間的時候要設置随機值,不要設置固定值
* 緩存雪崩: key在同一時間失效,導緻大量請求去訪問數據庫
* 返回min 和max 之間的一個随機秒數
private Long getRandomExpirationTime(Integer min, Integer max) {
return RandomUtils.nextLong(min * 60 * 60, max * 60 * 60);
}
二: redis緩存穿透
緩存穿透是指緩存和數據庫中都沒有的數據,而用戶不斷發起請求。由于緩存是不命中時被動寫的,并且出于容錯考慮,如果從存儲層查不到數據則不寫入緩存,這将導緻這個不存在的數據每次請求都要到存儲層去查詢,失去了緩存的意義。
在流量大時,可能DB就挂掉了,要是有人利用不存在的key頻繁攻擊我們的應用,這就是漏洞。
如發起為id為“-1”的數據或id為特别大不存在的數據。這時的用戶很可能是攻擊者,攻擊會導緻數據庫壓力過大。
解決方案:
1.設置并發鎖,防止請求大量請求數據庫,如果獲取到鎖了,去數據庫查詢,如果沒有,說明有其他線程在查詢數據庫,那麼隻需要重試一下就好了
public String get(key) {
String value = redis.get(key);
if (value == null) { //代表緩存值過期
//設置3min的超時,防止del操作失敗的時候,下次緩存過期一直不能load db
if (redis.setnx(key_mutex, 1, 3 * 60) == 1) { //代表設置成功
value = db.get(key);
redis.set(key, value, expire_secs);
redis.del(key_mutex);
} else { //這個時候代表同時候的其他線程已經load db并回設到緩存了,這時候重試獲取緩存值即可
Thread.sleep(50);
get(key); //重試
}
} else {
return value;
}
}
2.設置攔截器,對于不存在得key,進行攔截
三:緩存擊穿
緩存擊穿是指緩存中沒有但數據庫中有的數據(一般是緩存時間到期),這時由于并發用戶特别多,同時讀緩存沒讀到數據,又同時去數據庫去取數據,引起數據庫壓力瞬間增大,造成過大壓力。
解決方案:
1.設置熱點數據永不過期
2.加互斥鎖
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!