Redis淘汰刪除策略

Redis淘汰刪除策略

6種淘汰Key策略

Redis中經過maxmemory參數來設定內存的使用上限,當Redis使用內存達到設定的最大值的時候,會根據配置文件中的策略選取要刪除的key來刪除,從而給新的鍵值留出空間;服務器

目前Redis提供了6種的淘汰策略(默認的是noeviction):dom

  • volatile-lru,在設置了過時時間的鍵空間中,移除最近最少使用的key;性能

  • allkeys-lru,移除最近最少使用的key;優化

  • volatile-random,在設置了過時時間的鍵空間中,隨機移除一個key;spa

  • allkeys-random,隨機移除一個key;code

  • volatile-ttl,在設置了過時時間的鍵空間中,移除將要過時的key;進程

  • noeviction,當內存使用達到閥值的時候,全部引發申請內存的命令會報錯;內存

3種刪除過時鍵策略

前面咱們知道須要淘汰掉哪些過時Key,可是咱們應該怎麼去淘汰這些過時key呢?有3種刪除的操做策略:ci

定時刪除

在設置鍵的過時時間的同時,建立一個定時器,讓定時器在鍵的過時時間來臨時,當即執行對鍵的刪除操做;

定時刪除操做對於內存來講是友好的,內存不須要操做,而是經過使用定時器,能夠保證儘快的將過時鍵刪除,可是對於CPU來講不是友好的,若是過時鍵比較多的話,起的定時器也會比較多,刪除的這個操做會佔用到CPU的資源;

惰性刪除

聽任鍵過時無論,可是每次從鍵空間中獲取鍵是,都檢查取得的鍵的過時時間,若是過時的話,刪除便可;

惰性操做對於CPU來講是友好的,過時鍵只有在程序讀取時判斷是否過時才刪除掉,並且也只會刪除這一個過時鍵,可是對於內存來講是不友好的,若是多個鍵都已通過期了,而這些鍵又剛好沒有被訪問,那麼這部分的內存就都不會被釋放出來;

按期刪除

每隔一段時間,程序就對數據庫進行一次檢查,刪除掉過時鍵;

按期刪除是上面兩種方案的折中方案,每隔一段時間來刪除過時鍵,並經過限制刪除操做執行的時長和頻率來減小刪除操做對CPU時間的影響,除此以外,還有效的減小內存的浪費;可是該策略的難點在於間隔時長,這個須要根據自身業務狀況來進行設置;

目前,Redis採用的是惰性刪除+按期刪除的方案;

其餘模塊的淘汰處理

目前Redis提供了兩種持久化方式,分別是RDB和AOF;

RDB 快照持久化

建立

RDB是經過建立快照獲取內存中的數據在某一個時間點上的數據的副本;有兩個命令能夠建立RDB文件,分別是SAVEBGSAVE,二者的區別在因而否阻塞進程去建立RDB文件,這兩個命令都不會將數據空間中的過時鍵給保存到RDB文件中

載入

在啓動Redis服務器時,若是服務器開啓了RDB文件,那麼服務器就會對RDB文件進行載入,須要注意⚠️的是:

  • 若是當前服務器是Master,那麼過時鍵將會被忽略,不會載入到主服務器中;

  • 若是當前服務器是Slave,文件中全部鍵,不過是否過時都會被載入到從服務器中;

AOF 只追加持久化

寫入

數據庫中的過時鍵沒有被刪除時,其不會對AOF文件有任何的影響;當過時鍵被刪除之後,程序會向AOF文件追加一條DEL命令,顯示記錄該鍵已經被刪除;

重寫

AOF是將執行的寫命令添加到AOF文件的末尾來記錄數據的變化;爲了不文件被添加得愈來愈大,甚至有可能用完硬盤的全部空間,所以Redis提供了Rewrite的優化策略,分別是REWRITEAOFBGREWRITEAOF,兩個命令的區別也是在因而否阻塞主進程,這兩個命令都不會將數據空間中的過時鍵給保存到AOF文件中

主從復模式下對過時鍵的處理

一般在主從模式下,主服務器來讀取寫命令,從服務器用來讀取讀命令,分擔主服務器的壓力(與那種持久化模式無關),須要注意⚠️的是:

  • 若是當前服務器是Slave的話,若是有命令讀取當前過時鍵的話,不會惰性刪除,由於這會影響讀取的性能,所以不會刪除,而且返回過時鍵對應的值;除非是Master服務器同步告知Slave服務器須要刪除過時鍵纔會刪除;

  • 若是當前服務器是Master的話,當服務器經過策略得知某個鍵過時,則將該過時鍵給刪除,而且同步給其餘從服務器讓它們刪除掉該鍵;