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 熱點資料永...