從字面上理解,快取穿透就是執行程式擊穿了你的redis快取伺服器,去訪問mysql資料庫;
由於redis存在一定的命中概率,進來的請求發現redis中並沒有相關資料或者是沒有命中指定資料,會去資料庫查詢。
如果大量請求進來,直接去訪問資料庫服務查詢,資料庫伺服器cpu短時間內會超負載執行,致使資料庫服務宕機。
解決思路:
1、簡單:加synchronized關鍵字(同步鎖);
2、推薦:使用lock物件的trylock()方法(定時鎖);
快取在同一時間內大量鍵過期(失效),接著來的一大波請求瞬間都落在了資料庫中導致連線異常。
解決思路:
1、也是像解決快取穿透一樣加鎖排隊,實現同上;
2、建立備份快取,快取a和快取b,a設定超時時間,b不設值超時時間,先從a讀快取,a沒有讀b,並且更新a快取和b快取;
快取資料的淘汰
快取淘汰的策略有兩種: (1) 定時去清理過期的快取。 (2)當有使用者請求過來時,再判斷這個請求所用到的快取是否過期,過期的話就去底層系統得到新資料並更新快取。 兩者各有優劣,第一種的缺點是維護大量快取的key是比較麻煩的,第二種的缺點就是每次使用者請求過來都要判斷快取失效,邏輯相對比較複雜,具體用哪種方案,大家可以根據自己的應用場景來權衡。 1. 預估失效時間 2. 版本號(必須單調遞增,時間戳是最好的選擇)3. 提供手動清理快取的介面。
fifo演算法:first in first out,先進先出。原則:乙個資料最先進入快取中,則應該最早淘汰掉。也就是說,當快取滿的時候,應當把最先進入快取的資料給淘汰掉。
lfu演算法:least frequently used,最不經常使用演算法。
lru演算法:least recently used,近期最少使用演算法。
lru和lfu的區別:lfu演算法是根據在一段時間裡資料項被使用的次數選擇出最少使用的資料項,即根據使用次數的差異來決定。而lru是根據使用時間的差異來決定的
redis 過期策略 穿透 擊穿和雪崩問題
redis是用記憶體作快取,所以只是起到暫時儲存資料的作用,提高訪問速度和併發量,記憶體有限,所以需要制定過期策略,過期的資料清除騰出空間給新的資料 1.定期刪除 2.惰性刪除 惰性刪除的策略是每次獲取時會檢查key是否過期,過期就刪除不返回。但是同樣會有問題,如果大量key過期沒被定期刪除,並且也...
Redis淘汰策略
將 redis 用作快取時,如果記憶體空間用滿,就會自動驅逐老的資料。maxmemory用於指定 redis 能使用的最大記憶體。既可以在redis.conf檔案中設定,也可以在執行過程中通過 config set 命令動態修改 當記憶體使用達到最大限制時,如果需要儲存新資料,根據配置的策略 pol...
redis 淘汰策略
lru least recently used 演算法,如果資料最近被訪問過,那麼將來被剛問的機率也是很高的。lfu lfu 如果資料過去被訪問多次,那麼將來被剛問的機率也是更高。過期策略 1惰性刪除,當key被訪問時檢查改key的過期時間,若已過期刪除,已過期未被訪問的資料保持在記憶體中,小號記憶...