Redis淘汰删除策略
Redis淘汰刪除策略
Redis淘汰刪除策略6種淘汰Key策略3種刪除過期鍵策略定時刪除惰性刪除定期刪除其他模塊的淘汰處理RDB 快照持久化創建載入AOF 只追加持久化寫入重寫主從復模式下對過期鍵的處理
6種淘汰Key策略
Redis中通過maxmemory參數來設定內存的使用上限,當Redis使用內存達到設定的最大值的時候,會根據配置文件中的策略選取要刪除的key來刪除,從而給新的鍵值留出空間;
?
目前Redis提供了6種的淘汰策略(默認的是noeviction):
-
volatile-lru,在設置了過期時間的鍵空間中,移除最近最少使用的key;
-
allkeys-lru,移除最近最少使用的key;
-
volatile-random,在設置了過期時間的鍵空間中,隨機移除一個key;
-
allkeys-random,隨機移除一個key;
-
volatile-ttl,在設置了過期時間的鍵空間中,移除將要過期的key;
-
noeviction,當內存使用達到閥值的時候,所有引起申請內存的命令會報錯;
?
3種刪除過期鍵策略
?
前面我們知道需要淘汰掉哪些過期Key,但是我們應該怎么去淘汰這些過期key呢?有3種刪除的操作策略:
?
定時刪除
在設置鍵的過期時間的同時,創建一個定時器,讓定時器在鍵的過期時間來臨時,立即執行對鍵的刪除操作;
?
定時刪除操作對于內存來說是友好的,內存不需要操作,而是通過使用定時器,可以保證盡快的將過期鍵刪除,但是對于CPU來說不是友好的,如果過期鍵比較多的話,起的定時器也會比較多,刪除的這個操作會占用到CPU的資源;
?
惰性刪除
放任鍵過期不管,但是每次從鍵空間中獲取鍵是,都檢查取得的鍵的過期時間,如果過期的話,刪除即可;
?
惰性操作對于CPU來說是友好的,過期鍵只有在程序讀取時判斷是否過期才刪除掉,而且也只會刪除這一個過期鍵,但是對于內存來說是不友好的,如果多個鍵都已經過期了,而這些鍵又恰好沒有被訪問,那么這部分的內存就都不會被釋放出來;
?
定期刪除
每隔一段時間,程序就對數據庫進行一次檢查,刪除掉過期鍵;
?
定期刪除是上面兩種方案的折中方案,每隔一段時間來刪除過期鍵,并通過限制刪除操作執行的時長和頻率來減少刪除操作對CPU時間的影響,除此之外,還有效的減少內存的浪費;但是該策略的難點在于間隔時長,這個需要根據自身業務情況來進行設置;
?
目前,Redis采用的是惰性刪除+定期刪除的方案;
?
其他模塊的淘汰處理
目前Redis提供了兩種持久化方式,分別是RDB和AOF;
RDB 快照持久化
?
創建
RDB是通過創建快照獲取內存中的數據在某一個時間點上的數據的副本;有兩個命令可以創建RDB文件,分別是SAVE和BGSAVE,兩者的區別在于是否阻塞進程去創建RDB文件,這兩個命令都不會將數據空間中的過期鍵給保存到RDB文件中;
?
載入
在啟動Redis服務器時,如果服務器開啟了RDB文件,那么服務器就會對RDB文件進行載入,需要注意??的是:
-
如果當前服務器是Master,那么過期鍵將會被忽略,不會載入到主服務器中;
-
如果當前服務器是Slave,文件中所有鍵,不過是否過期都會被載入到從服務器中;
?
AOF 只追加持久化
?
寫入
數據庫中的過期鍵沒有被刪除時,其不會對AOF文件有任何的影響;當過期鍵被刪除以后,程序會向AOF文件追加一條DEL命令,顯示記錄該鍵已經被刪除;
?
重寫
AOF是將執行的寫命令添加到AOF文件的末尾來記錄數據的變化;為了避免文件被添加得越來越大,甚至有可能用完硬盤的所有空間,因此Redis提供了Rewrite的優化策略,分別是REWRITEAOF和BGREWRITEAOF,兩個命令的區別也是在于是否阻塞主進程,這兩個命令都不會將數據空間中的過期鍵給保存到AOF文件中;
?
主從復模式下對過期鍵的處理
?
通常在主從模式下,主服務器來讀取寫命令,從服務器用來讀取讀命令,分擔主服務器的壓力(與那種持久化模式無關),需要注意??的是:
-
如果當前服務器是Slave的話,如果有命令讀取當前過期鍵的話,不會惰性刪除,因為這會影響讀取的性能,因此不會刪除,并且返回過期鍵對應的值;除非是Master服務器同步告知Slave服務器需要刪除過期鍵才會刪除;
-
如果當前服務器是Master的話,當服務器通過策略得知某個鍵過期,則將該過期鍵給刪除,并且同步給其他從服務器讓它們刪除掉該鍵;
來源:https://www.cnblogs.com/George1994/p/10681090.html
總結
以上是生活随笔為你收集整理的Redis淘汰删除策略的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 商业保险是社会保障体系的什么
- 下一篇: 2-01基本顺序表与元素外置顺序表rec