天天看點

Redis淘汰删除政策

Redis淘汰删除政策

Redis中通過maxmemory參數來設定記憶體的使用上限,當Redis使用記憶體達到設定的最大值的時候,會根據配置檔案中的政策選取要删除的key來删除,進而給新的鍵值留出空間;

6種淘汰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