redis 持久化、過時策略和淘汰逐出策略

redis 目前支持的持久化方式

RDB持久化方式會在一個特定的間隔保存那個時間點的一個數據快照。
AOF持久化方式則會記錄每個服務器收到的寫操做。在服務啓動時,這些記錄的操做會逐條執行從而重建出原來的數據。寫操做命令記錄的格式跟Redis協議一致,以追加的方式進行保存。
Redis的持久化是能夠禁用的,就是說你可讓數據的生命週期只存在於服務器的運行時間裏。
兩種方式的持久化是能夠同時存在的,可是當Redis重啓時,AOF文件會被優先用於重建數據。web

RDB快照方式:

  1. SAVE 模式:保存快照的同時,會中止redis服務,直到快照落地,纔會從新開始提供服務。
  2. BGSAVE 模式:使用fork的方式拷貝redis內存,fork的同時會致使服務中止,可是間隔比較短,拷貝完內存後,redis從新提供服務,將內存數據落地,由於涉及到內存的拷貝,要求系統擁有和redis佔用內存相同大小的空閒內存。

快照缺點:
只能恢復最近一次的快照,有部分數據出現丟失。redis

aof方式:

每次寫入redis前,都會將操做寫入內存緩衝區,而後以必定的策略刷至磁盤,恢復redis經過日子回放。緩存

  1. always : Redis在每次有寫操做發生時都會同步到硬盤,這種方式會給IO帶來很大壓力,實際中寫入的速率要考慮硬盤的IO速率。
  2. everysec :Redis每1秒將日誌同步到硬盤,這種方式性能較好,但也意爲着若是Redis崩潰那麼將丟失1秒的數據。
  3. no : Redis不主動控制內存緩存區和硬盤的同步,而由操做系統來控制。這種方式不可控,通常不採用。

aof缺點:
隨着redis運行,持久化文件的體積會愈來愈大,redis恢復的時間越長。因此引入BGREWRITEAOF機制,相同key的操做和不斷重寫,減少文件體積,提升恢復速度。服務器

BGREWRITEAOF 機制:
aof 存放全部key的值,redis會以必定的策略對aof進行壓縮和rewrite,rewrite以後aof文件會保存keys的最後的狀態,清除掉以前冗餘的,來縮小這個文件。dom

過時策略:

  1. 定時過時:爲每一個設置過ttl的key都設置定時器,一旦到期立馬設置爲過時,缺點:cpu佔用高
  2. 惰性過時:只有在訪問key的時候纔會設置過時,缺點:極端狀況下內存浪費嚴重,沒法獲得有效利用
  3. 按期過時:每隔一段時間,掃描刪除部分過時的key

目前redis同時使用2,3兩種策略svg

淘汰策略

  1. noeviction:當內存不足以容納新寫入數據時,新寫入操做會報錯,不逐出。
  2. allkeys-lru:當內存不足以容納新寫入數據時,在鍵空間中,移除最近最少使用的key。
  3. allkeys-random:當內存不足以容納新寫入數據時,在鍵空間中,隨機移除某個key。
  4. volatile-lru:當內存不足以容納新寫入數據時,在設置了過時時間的鍵空間中,移除最近最少使用的key。
  5. volatile-random:當內存不足以容納新寫入數據時,在設置了過時時間的鍵空間中,隨機移除某個key。
  6. volatile-ttl:當內存不足以容納新寫入數據時,在設置了過時時間的鍵空間中,有更早過時時間的key優先移除。

ps:淘汰策略和過時策略互不干擾。性能