Redis 緩存穿透、緩存雪崩和緩存擊穿

1.緩存穿透

緩存穿透是指緩存和數據庫中都沒有的數據,而用戶不斷髮起請求,如發起爲id爲“-1”的數據或id爲特別大不存在的數據。這時的用戶很可能是攻擊者,攻擊會導致數據庫壓力過大。

解決:緩存空對象、布隆過濾器、mvc攔截器

2.緩存雪崩

緩存雪崩是指在我們設置緩存時key採用了相同的過期時間,導致緩存在某一時刻同時失效,請求全部轉發到DB,DB瞬時壓力過重雪崩。

解決方案:

規避雪崩:緩存數據的過期時間設置隨機,防止同一時間大量數據過期現象發生。
如果緩存數據庫是分佈式部署,將熱點數據均勻分佈在不同緩存數據庫中。
設置熱點數據永遠不過期。
出現雪崩:降級 熔斷
事前:儘量保證整個 redis 集羣的高可用性,發現機器宕機儘快補上。選擇合適的內存淘汰策略。
事中:本地ehcache緩存 + hystrix限流&降級,避免MySQL崩掉
事後:利用 redis 持久化機制保存的數據儘快恢復緩存

3.緩存擊穿

緩存雪崩和緩存擊穿不同的是:

緩存擊穿 指 併發查同一條數據。緩存擊穿是指緩存中沒有但數據庫中有的數據(一般是緩存時間到期),這時由於併發用戶特別多,同時讀緩存沒讀到數據,又同時去數據庫去取數據,引起數據庫壓力瞬間增大,造成過大壓力
緩存雪崩是不同數據都過期了,很多數據都查不到從而查數據庫。
解決方案:

設置熱點數據永遠不過期。
加互斥鎖:業界比較常用的做法,是使用mutex。簡單地來說,就是在緩存失效的時候(判斷拿出來的值爲空),不是立即去load db去數據庫加載,而是先使用緩存工具的某些帶成功操作返回值的操作(比如Redis的SETNX或者Memcache的ADD)去set一個mutex key,當操作返回成功時,再進行load db的操作並回設緩存;否則,就重試整個get緩存的方法。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章