redis是用記憶體作快取,所以只是起到暫時儲存資料的作用,提高訪問速度和併發量,記憶體有限,所以需要制定過期策略,過期的資料清除騰出空間給新的資料
1.定期刪除
2.惰性刪除
惰性刪除的策略是每次獲取時會檢查key是否過期,過期就刪除不返回。
但是同樣會有問題,如果大量key過期沒被定期刪除,並且也沒被訪問而惰性刪除,就會造成記憶體不足,所以有了記憶體淘汰機制。
1.noeviction
不刪除key,當記憶體滿了就報錯。
2.volatile-lru
對於設定了過期的key中刪除最近最少使用的key。
3.volatile-ttl
對於設定了過期時間的key,刪除離當前時間最近的key。
4.volatile-random
對於設定了過期時間的key,隨機刪除key。
5.allkeys-random
對於全部的key進行隨機刪除。
6.allkeys-lru(推薦)
對於全部的key進行lru刪除。
雪崩問題
有一批熱點key在同一時間內過期,如果處於訪問高峰,有大批請求就會到達資料庫,造成資料庫宕機。
(可以通過設定過期時間為隨機值,一定程度上解決)
快取雪崩的事前事中事後的解決方案如下。
事前:redis 高可用,主從+哨兵,redis cluster,避免全盤崩潰。
事中:本地 ehcache 快取 + hystrix 限流&降級,避免 mysql ***。
事後:redis 持久化,一旦重啟,自動從磁碟上載入資料,快速恢復快取資料。
穿透問題
惡意攻擊,通過訪問乙個一定不存在的key,每次都把請求打到資料庫,造成資料庫宕機。
解決方案主要可以從兩個方面
在應用級別上將不可能存在的key過濾掉
無法過濾掉的key採用value=null的值寫入快取中來應對這個key的請求,同時這個key的有效期可以設定短一些。
擊穿問題
有乙個熱點key一直扛著高流量的訪問,一旦過期,所有請求就會打到資料庫上面,造成資料庫宕機。
例如電商的爆款
問題的解決方案如下
如果熱點key的資料更新不頻繁或者不會發生更新,可設定為永久key,或者每一次請求都重置key的有效期。
如果資料頻繁更新,可以使用定時執行緒或者資料庫更新後主動更新快取的策略來保證資料一致性。
Redis筆記12 快取穿透 快取擊穿 快取雪崩
使用者想要查詢乙個資料,發現redis記憶體資料庫沒有,也就是快取沒有命中,於是向持久層資料庫查詢。發現也沒有,於是本次查詢失敗。當使用者很多的時候,快取都沒有命中,於是都去請求了持久層資料庫。這會給持久層資料庫造成很大的壓力,這時候就相當於出現了快取穿透。比如,發起乙個id 1的資料庫查詢請求。布...
Redis 熱鍵問題,快取擊穿,快取穿透,快取雪崩
1.熱鍵問題 描述 熱鍵被大量客戶端訪問,導致大量網路流量集中在一台redis伺服器上,伺服器宕機。解決方法 將熱鍵分散到不同的redis伺服器上 2.快取擊穿 描述 熱鍵被大量客戶端訪問,熱鍵如果過期,可能導致大量網路流量打到 db 伺服器上,導致資料庫伺服器宕機 解決方法 對於熱鍵,訪問之前如果...
Redis穿透 擊穿和雪崩
概念 key對應的資料在資料來源並不存在,每次針對此key的請求從快取獲取不到,請求都會到資料來源,從而可能壓垮資料來源。比如用乙個不存在的使用者id獲取使用者資訊,不論快取還是資料庫都沒有,若黑客利用此漏洞進行攻擊可能壓垮資料庫。解決方案 乙個一定不存在快取及查詢不到的資料,由於快取是不命中時被動...