Redis 擊穿 穿透 雪崩業務場景和解決方案

2021-10-24 17:40:31 字數 1757 閱讀 3020

擊穿

原因給key設定了過期時間(lru/lfu)

當key過期之後,資料被清理掉了。突然來了一批訪問這個key的。這是請求就會壓到資料庫上

key的過期導致的高併發訪問資料庫,給資料庫造成了壓力

如果過期之後,只有少量請求訪問這個key,達到資料庫不能成為擊穿。只有出現高併發的時候,對資料庫產生影響了才叫擊穿

解決方案

有併發時,阻止併發到達資料庫,但是redis中又沒有key

redis是單程序單例項的,讓訪問的請求當發現key不存在的時候,使用setnx()建立乙個key ,相當於向redis申請一把鎖。因為setnx()只有沒有這個key時,才會返回成功。所以一定只有乙個請求能獲得這把鎖。只有獲得鎖的請求才允許訪問資料庫

1.取key,發現沒有key

2.使用setnx()設定key,相當於申請鎖

失敗的,睡眠一會,甦醒之後重複1-2步。

如果第一步成功就能直接返回了,如果第一步失敗,再次嘗試setnx(),因為鎖還存在,所以依然不能成功,繼續進入睡眠

設定key成功的請求訪問資料庫

存在的問題

死鎖了,獲得鎖的執行緒掛掉了怎麼辦

設定鎖的過期時間

當第乙個掛掉後,鎖過期了,會有其他的請求拿到鎖。去訪問資料庫

獲得鎖的執行緒沒掛,但是阻塞了,因為設定的鎖過期時間不夠。第乙個獲得獲得還沒有取回資料,鎖就被釋放了,就會導致多個請求到達資料庫、可能會導致部分請求延遲,丟失。

第乙個從資料庫獲取到資料,返回了,沒有獲取到鎖的,甦醒之後取到key返回了

而其他獲取到鎖的請求,還在阻塞

解決方案

多執行緒,開啟乙個守護執行緒

**邏輯複雜度會提高一些

第乙個請求獲取到鎖之後,乙個執行緒去資料庫取資料,另乙個執行緒監控值是不是取回來了,如果沒有取回來,就更新鎖時間

業務場景:做快取使用時

原因指乙個key非常熱點,在不停地扛著大併發,大併發集中對這乙個點進行訪問,當這個key在失效的瞬間,持續的大併發就穿破快取,直接訪問資料庫查詢最新資料,並且寫會快取,造成壓力過大,容易導致伺服器宕機。

使用布隆過濾器,三種方式

在客戶端實現布隆的演算法,和儲存資料

則請求不到達redis,和資料庫

在客戶端中實現布隆過濾器的演算法,資料儲存在redis中。

redis整合布隆過濾器

缺點:布隆過濾器只能增加,不能刪除

當業務資料會出現刪除,修改的時候。使用布隆過濾器會出現問題

替代方案:布穀鳥過濾器

業務場景:做快取使用時

原因和擊穿比較像,同一時間大量的key值過期 redis宕機

產生雪崩的原因之一,比如雙十一,商品比較集中地放入了快取,假設快取時間乙個小時,那麼凌晨一點的時候,快取過期。商品查詢直接落到了資料庫,對於資料庫而言就會產生週期性的壓力波峰。於是所有的請求都會達到儲存層,儲存層的呼叫量會暴增,可能造成資料庫伺服器宕機,但是這種雪崩無非就是對資料庫產生週期性的壓力,比起這種集中過期,更致命的快取雪崩場景是,某個快取伺服器節點宕機或者斷網,這樣對資料庫伺服器造成的壓力是不可預知的。

解決方案

redis高可用:多增設幾台reids伺服器,搭建集群(異地多活)。

限流降級:在快取失敗後,通過加鎖或者佇列來控制讀資料庫寫快取的執行緒數量。比如對某個key只允許乙個執行緒查詢資料和寫快取,其他執行緒等待。

資料預熱:資料加熱的含義就是在正式部署之前,先把可能的資料先預先訪問一遍,這樣部分可能大量訪問的資料就會載入到快取中。在即將發生的大併發訪問前手動觸發載入快取不同的key,設定不同的過期時間,讓快取失效的時間點盡量均勻。

redis雪崩 擊穿 穿透

redis快取 快取流程 使用者訪問前台 前台訪問redis,若redis有使用者要訪問的資料就直接返回 如果沒有就訪問資料庫,如果查到了就把資料同步到redis,並返回給使用者 快取雪崩 場景,雙十一的時候 將很多資料放到redis進行快取,並設定快取的失效時間為三小時,當快取時間到達的一瞬間,大...

redis 快取擊穿 穿透 雪崩

一般的快取系統,都是按照key去快取查詢,如果不存在對應的value,就去後端系統查詢 比如db 一些惡意的請求會故意查詢不存在的key,請求量很大,就會對後端系統造成很大的壓力。這就叫做快取穿透。如何避免?1 對查詢結果為空的情況也進行快取,這樣,再次訪問時,快取層會直接返回空值。快取時間設定短一...

Redis中擊穿 穿透 雪崩

擊穿 當在高併發下,部分key過期失效 lru,lfu 大量資料擊穿redis直接到達db 解決方法 使用redis分布式鎖,如果redis中沒有找到這個key,就使用分布式鎖控制 redis分布式鎖 setnx 如果不存在,則設定成功,獲取鎖.設定過期時間,防止死鎖 多執行緒監控,防止因為執行執行...