Redis淘汰刪除策略


Redis淘汰刪除策略

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文件,分別是SAVEBGSAVE,兩者的區別在於是否阻塞進程去創建RDB文件,這兩個命令都不會將數據空間中的過期鍵給保存到RDB文件中

載入

在啟動Redis服務器時,如果服務器開啟了RDB文件,那么服務器就會對RDB文件進行載入,需要注意⚠️的是:

  • 如果當前服務器是Master,那么過期鍵將會被忽略,不會載入到主服務器中;

  • 如果當前服務器是Slave,文件中所有鍵,不過是否過期都會被載入到從服務器中;

AOF 只追加持久化

寫入

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

重寫

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

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

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

  • 如果當前服務器是Slave的話,如果有命令讀取當前過期鍵的話,不會惰性刪除,因為這會影響讀取的性能,因此不會刪除,並且返回過期鍵對應的值;除非是Master服務器同步告知Slave服務器需要刪除過期鍵才會刪除;

  • 如果當前服務器是Master的話,當服務器通過策略得知某個鍵過期,則將該過期鍵給刪除,並且同步給其他從服務器讓它們刪除掉該鍵;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM