tft每日頭條

 > 生活

 > 什麼情況引起redis緩存穿透

什麼情況引起redis緩存穿透

生活 更新时间:2024-11-16 03:20:13

什麼情況引起redis緩存穿透?一:redis雪崩redis雪崩是指redis在某個時間大量失效,突然造成數據庫訪問壓力急劇增大,像雪崩一樣,redis雪崩危害巨大,甚至有可能服務器宕機,給公司造成巨大的經濟損失,下面我們就來說一說關于什麼情況引起redis緩存穿透?我們一起去了解并探讨一下這個問題吧!

什麼情況引起redis緩存穿透(擊穿和雪崩以及解決方案)1

什麼情況引起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每日頭條,我们将持续为您更新最新资讯!

查看全部

相关生活资讯推荐

热门生活资讯推荐

网友关注

Copyright 2023-2024 - www.tftnews.com All Rights Reserved