Redis做快取時,擊穿 穿透 雪崩問題解決方案

2021-10-21 05:23:05 字數 1616 閱讀 8862

redis做快取使用,則必須對key做失效時間設定

失效策略一般選擇:lru、lfu

設定有過期時間的key中lru(最近最少使用)、lfu(最少使用)

過期後主動刪除

每秒呼叫10次,每次20個key,將過期的key刪除,過期的key超過25%時,則重複上面的過程,直到過期的key低於25%

本文主要是為新手介紹一些基礎概念,和常規解決思路

擊穿

概念:擊穿是,當redis中的乙個key失效後,同時有大量的請求用這個值,會導致這些請求都會壓到db中。

解決:因redis的單程序單例項當從redis中獲取到空後,向redis中用setnx的方式設定乙個帶有效期的key,只有第乙個執行的請求會成功,其餘的都會失敗。失敗的請求,都sleep進入休眠,然後遞迴呼叫從redis中獲取值的方法;成功的請求去db中獲取資料,同時還需要起乙個守護執行緒,當去db中獲取資料未完成時,守護執行緒需要去延遲redis中key的失效時間。當從db中成功獲取資料後,更新到redis中。熱點key不設定過期時間。

穿透

概念:穿透是,請求redis和後端db中不存在的值,白白浪費db的資源。

解決:使用布隆過濾器,可以有3種方式:

1, 可以將布隆演算法和記錄的陣列都放在server中;

2, 可以將布隆演算法放在server中,記錄的陣列放在redis的bitmap中;

3, 可以使用redis的布隆過濾器。

缺點:1,刪除db中的資料後,不能刪除布隆記錄陣列中的資料。可以考慮使用布穀鳥過濾器。

2,無效請求資料碰巧穿過了布隆過濾器的話,在db中查不到結果時,可以在redis中設定乙個空key。

雪崩

概念:雪崩是,redis中有大量的key同時失效,導致的db訪問壓力增加。

解決:過期時間分散,隨機過期時間;但是還有零點過期等問題,這時候可以使用擊穿的解決方案處理。可以提前拿到資料的話,可以採用預載入。熱點key不設定過期時間。

分布式鎖

還是上面擊穿的那一套方案,但是不完美,最終方案還得靠zookeeper、redisson。

redisson分布式鎖原理請檢視另一篇文件。

setnx的其他寫法

1、加鎖

加鎖實際上就是在redis中,給key鍵設定乙個值,為避免死鎖,並給定乙個過期時間。

set lock_key random_value nx px 5000

值得注意的是:

random_value 是客戶端生成的唯一的字串。

nx 代表只在鍵不存在時,才對鍵進行設定操作。

px 5000 設定鍵的過期時間為5000毫秒。

這樣,如果上面的命令執行成功,則證明客戶端獲取到了鎖。

2、解鎖

解鎖的過程就是將key鍵刪除。但也不能亂刪,不能說客戶端1的請求將客戶端2的鎖給刪除掉。這時候random_value的作用就體現出來。

為了保證解鎖操作的原子性,我們用lua指令碼完成這一操作。先判斷當前鎖的字串是否與傳入的值相等,是的話就刪除key,解鎖成功。

redis 快取擊穿 穿透 雪崩

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

Redis快取雪崩 擊穿 穿透

目錄 三 快取擊穿 四 快取穿透 這三個問題一旦發生,就會導致大量請求進入後台的資料庫,如果有大量併發同時到達資料庫,有可能會導致資料庫宕機,影響業務,也有可能會導致一系列連鎖反映,很可能導致業務長時間無法恢復。接下來本文詳細介紹這三個問題的發生場景以及對應的解決方案。雪崩是指大量請求無法在redi...

快取雪崩 擊穿 穿透

1 快取雪崩 是指在某乙個時間段,快取集中過期失效,或者是快取宕機,所有請求全部打到db上。應對辦法 分散快取過期時間,具體做法是分別設定不同的快取時間,比如加上隨機因子。2 快取擊穿 當某個熱點key失效時,高併發直接請求資料庫對資料庫伺服器造成壓垮性的壓力,比如爆款商品。應對辦法 1 熱點資料永...