Redis過期策略、記憶體淘汰策略、持久化策略
一、持久化策略
1.基本概念
Redis的資料是存在記憶體中的,若redis宕機,資料就會全部丟失
(1)RDB快照,是一次全量備份,快照是記憶體資料的二進位制序列化形式,儲存上非常緊湊;
(2)AOF日誌,是連續的增量備份,AOF日誌記錄的是記憶體資料修改的指令記錄文字,當資料庫重啟時要載入AOF日誌進行指令重放,所以需要定期進行AOF重寫,對日誌進行瘦身。
2.怎麼進行備份的
(1)RDB通過Redis主程序fork子程序,讓子程序執行磁碟 IO 操作來進行 RDB 持久化,記錄的是資料;
(2)AOF日誌只記錄對記憶體進行修改的指令記錄,記錄的是指令。
3.要選擇哪種策略?
(1)只用RDB: RDB是隔一段時間進行備份,容易丟失很多資料;
(2)只用AOF: AOF沒有RDB恢復快且恢復複雜;
(3)Redis4.0使用混合持久化:將RDB檔案的內容和增量的AOF日誌儲存在一起。增量日誌指:自持久化開始到持久化結束的這段時間發生的增量 AOF 日誌。當在redis重啟時,先載入 rdb 的內容,然後再重放增量 AOF 日誌。替代之前的 AOF 全量檔案重放。
二、記憶體淘汰策略
1.noeviction :預設淘汰策略,不淘汰,如果記憶體已滿,新增資料是報錯。//eviction逐出
2.allkeys-lru:在所有鍵中,選取最近最少使用
3.volatile-lru:在設定了過期時間的所有鍵中,選取最近最少使用的資料拋棄。//Least Recently Used
4.allkeys-random: 在所有鍵中,隨機拋棄。
5.volatile-random: 在設定了過期時間的所有鍵,隨機拋棄。//volatile不穩定,易變的
6.volatile-ttl:在設定了過期時間的所有鍵,拋棄存活時間最短的資料。//time to live 生存時間
三、定期策略
1.定期刪除:Redis會將每個設定過期時間的key放入到一個獨立的字典,其會定期遍歷這個字典來刪除到期的key。
2.定期刪除策略(集中處理)
(1)預設每秒進行10次過期掃描(100ms一次),這種過期掃描採用了一種簡單的貪心策略,並不會遍歷過期字典中所有的key。
從過期字典中隨機 20 個 key;
刪除這 20 個 key 中已經過期的 key;
如果過期的 key 比率超過 1/4,那就重複步驟 1;
3.惰性刪除(零散處理)
是在客戶端訪問這個 key 的時候,redis 對 key 的過期時間進行檢查,如果過期了就立即刪除,不會給你返回任何東西。
4.為什麼採用定期刪除+惰性刪除的策略?
(1)只採用定期刪除,會導致很多過期的key並沒有被刪掉。
假設redis裡放了10萬個key,都設定了過期時間,你每隔幾百毫秒,就檢查10萬個key,那redis基本上就死了,cpu負載會很高的,消耗在你的檢查過期key上了。
(2)另外採用惰性刪除,保證過期的key一定會被刪除。
在你獲取某個key的時候,redis會檢查一下 ,這個key如果設定了過期時間那麼是否過期了?如果過期了此時就會刪除,不會給你返回任何東西。