1. 程式人生 > >Redis過期策略以及記憶體淘汰機制

Redis過期策略以及記憶體淘汰機制

過期鍵刪除策略
我們都知道,刪除鍵的目的,就是釋放記憶體佔用。那麼,當一個鍵過期了,Redis 什麼時候會去刪除她呢?

定時刪除
設定鍵的過期時間時,建立一個 Timer ,當過期時間到臨時,立刻刪除鍵。
記憶體友好型策略,一旦鍵過期,就會被刪除,並釋放所佔用的記憶體,Cpu 不友好,當一批數量比較多的鍵過期時,正好遇上Cpu 緊張的時段,這時候需要的是Cpu處理能力,而不是記憶體,顯然 Cpu 時間用在刪除過期鍵上,會對伺服器的響應時間和吞吐量造成影響。另外當前 Redis 時間事件(無序連結串列O(N))無法高效處理大量時間事件,所以定時刪除並不是一種好的定時刪除策略。
惰性刪除
不管過期的鍵,在這種策略下,當鍵在鍵空間中被取出時,首先檢查取出的鍵是否過期,若過期刪除該鍵,否則,返回該鍵。
很明顯,惰性刪除依賴過期鍵的被動訪問,對於記憶體不友好,如果一些鍵長期沒有被訪問,會造成記憶體洩露(垃圾資料佔用記憶體)。我們知道,Redis是依賴記憶體的,所以惰性刪除也不是一個好的策略。
定期刪除
由定時刪除演算法,定期的去檢查一定的資料庫,刪除一定的過期鍵。 
通過合理的刪除操作執行的時長和頻率,達到合理的刪除過期鍵。

redis.conf 中的過期淘汰配置
# MAXMEMORY POLICY: how Redis will select what to remove when maxmemory
# is reached. You can select among five behaviors:
#最大記憶體策略:當到達最大使用記憶體時,你可以在下面5種行為中選擇,Redis如何選擇淘汰資料庫鍵

#當記憶體不足以容納新寫入資料時

# volatile-lru -> remove the key with an expire set using an LRU algorithm
# volatile-lru :在設定了過期時間的鍵空間中,移除最近最少使用的key。這種情況一般是把 redis 既當快取,又做持久化儲存的時候才用。

# allkeys-lru -> remove any key according to the LRU algorithm
# allkeys-lru : 移除最近最少使用的key (推薦)

# volatile-random -> remove a random key with an expire set
# volatile-random : 在設定了過期時間的鍵空間中,隨機移除一個鍵,不推薦

# allkeys-random -> remove a random key, any key
# allkeys-random : 直接在鍵空間中隨機移除一個鍵,弄啥叻

# volatile-ttl -> remove the key with the nearest expire time (minor TTL)
# volatile-ttl : 在設定了過期時間的鍵空間中,有更早過期時間的key優先移除 不推薦

# noeviction -> don't expire at all, just return an error on write operations
# noeviction : 不做過鍵處理,只返回一個寫操作錯誤。 不推薦

# Note: with any of the above policies, Redis will return an error on write
#       operations, when there are no suitable keys for eviction.
# 上面所有的策略下,在沒有合適的淘汰刪除的鍵時,執行寫操作時,Redis 會返回一個錯誤。下面是寫入命令:
#       At the date of writing these commands are: set setnx setex append
#       incr decr rpush lpush rpushx lpushx linsert lset rpoplpush sadd
#       sinter sinterstore sunion sunionstore sdiff sdiffstore zadd zincrby
#       zunionstore zinterstore hset hsetnx hmset hincrby incrby decrby
#       getset mset msetnx exec sort

# 過期策略預設是:
# The default is:
# maxmemory-policy noeviction
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
其他模組對過期鍵的處理
生成RDB檔案時
執行 SAVE 或 BGSAVE 時 ,資料庫鍵空間中的過期鍵不會被儲存在RDB檔案中

載入RDB檔案時
Master 載入RDB時,檔案中的未過期的鍵會被正常載入,過期鍵則會被忽略。
Slave 載入 RDB 時,檔案中的所有鍵都會被載入,當同步進行時,會和Master 保持一致。
AOF 檔案寫入時
資料庫鍵空間的過期鍵的過期但並未被刪除釋放的狀態會被正常記錄到 AOF 檔案中,當過期鍵發生釋放刪除時,DEL 也會被同步到 AOF 檔案中去。

重新生成 AOF檔案時
執行 BGREWRITEAOF 時 ,資料庫鍵中過期的鍵不會被記錄到 AOF 檔案中

複製
Master 刪除 過期 Key 之後,會向所有 Slave 伺服器傳送一個 DEL命令,從伺服器收到之後,會刪除這些 Key。
Slave 在被動的讀取過期鍵時,不會做出操作,而是繼續返回該鍵,只有當Master 傳送 DEL 通知來,才會刪除過期鍵,這是統一、中心化的鍵刪除策略,保證主從伺服器的資料一致性。
--------------------- 
作者:leon_0204 
來源:CSDN 
原文:https://blog.csdn.net/qq_28018283/article/details/80764518 
版權宣告:本文為博主原創文章,轉載請附上博文連結!