Redis的持久化策略

Redis的持久化策略:

  咱們都知道,Redis是一個鍵值對的數據庫服務器,服務器中包含着若干個非空的數據庫,每一個非空的數據庫中包含任意個鍵值對,它將本身的數據都存儲在內存中,若是咱們不採起措施將在內存中的數據保存到磁盤中的話,若是一旦出現服務器宕機的狀況下,服務器中的數據庫數據也會隨之而消失。這時候,Redis就提供了兩種Redis的持久化功能:RDB持久化和AOF持久化。數據庫

1、RDB持久化功能

  RDB經過保存數據庫中的鍵值對來記錄數據庫狀態的不一樣。服務器

  RDB既能夠手動置頂,也能夠配置服務器選項進行按期執行,實現是將某個時間點上的Redis數據庫中的數據保存到一個RDB文件中,RDB文件是一個通過壓縮的二進制文件,經過該文件能夠還原生成時的Redis數據庫數據。網絡

  • 建立文件

  通常的話,是有兩個Redis的命令能夠用於生成RDB文件,一個是SAVE,一個是BGSAVE。其中SAVE命令在執行是,會阻塞服務器進程,直到RDB文件建立成,在進程阻塞期間,服務器不能進行任何請求操做。另外一個BGSAVE命令的方式則是派生一個子進程,由子進程負責建立RDB文件,服務器進程繼續處理請求。建立RDB文件的實際工做由rdb.c/rdbSave函數來執行,兩種命令分別以不一樣的方式來調用函數執行。app

  • 讀取文件

  讀取RDB文件是在服務器啓動的時候自動完成的,只要再Redis服務器啓動的時候有檢測到RDB文件的存在,就會自耦東讀取RDB文件。函數

  • 計數器(dirty)與最後一次修改(lastsave)屬性

  Redis服務器中維持着一個dirty技術區和一個lastsave屬性,用來判斷是否執行保存命令性能

    • dirty記錄着距離上一次執行SAVE或者BGSAVE命令以後服務器對數據庫進行的操做次數
    • lastsave屬性時一個時間戳,記錄着服務器上一次執行SAVE和BGSAVE命令的時間
  • 保存時間間隔

  BGSAVE能夠在不阻塞服務器進程的狀況下執行,因此咱們能夠配置服務器的save選項,讓服務器每間隔一段時間自動執行一次BGSAVE命令。服務器默認設置save選項以下:spa

1 save     900     1
2 save     300     10
3 save     60      10000

  對應的意思是:線程

    • 服務器在900秒以內,對數據庫進行了超過一次修改,就會執行BGSAVE命令
    • 服務器在300秒以內,對數據庫進行了超過10次修改,就會執行BGSAVE命令
    • 服務器在60秒以內,對數據庫進行了超過10000次修改,就會執行BGSAVE命令

  咱們能夠經過制定配置文件或者傳入啓動參數的方式來設置save選項code

  • serverCron函數

  一個默認沒間隔100毫秒就會執行一次的函數,它的任務之一就是檢查save選項所設置的保存條件是否知足,知足的狀況下,就執行BGSAVE命令。server

2、AOF持久化功能

  AOF持久化是經過保存Redis服務器所執行的命令來記錄數據庫狀態的,被寫入AOF的全部命令都是以Redis的請求協議格式來進行保存的。它的整個執行流程大體分爲三步:

    • 命令追加(append):當AOF持久化功能開啓的狀態下,服務器在執行完一個寫命令以後,會以協議格式將被執行的寫命令
    • 文件寫入:當服務器接收到命令時,會調用一個flushAppendOnlyFile函數,考慮是否將aof_buf緩衝區中的內容寫入和保存到AOF文件中。函數的持久化行爲由服務器配置的一個appendfsync選項的值來決定,下面是對應關係:
      • always:將aof_buf緩衝區的全部內容寫入並同步到AOF文件中
      • everysec:將aof_buf緩衝區的全部內容寫入AOF文件中,同時,若是距離上次同步行爲間隔一秒鐘,name將再次對AOF文件進行同步,服務器分配一個單獨的線程來執行這個操做,everysec是默認值
      • no:將aof_buf緩衝區的全部內容寫入AOF文件中,但不對AOF文件進行同步,具體的同步時間由系統來決定
    • 文件同步:上面的文件寫入只是文件被暫時的存儲在一個內存緩衝區中,等到緩衝區的空間被填滿,或者超過了必定的時間限制的時候,纔會將緩衝區的數據寫入到磁盤中,咱們將這個過程成爲文件的同步
  • 讀取文件

  讀取文件的執行點同時是在服務器啓動的時候。由於AOF文件中包含了重建數據庫的全部命令,因此服務器只要從新執行一遍AOF文件中保存的命令,就能夠還原數據庫保存以前的數據。Redis經過建立一個沒有網絡鏈接的僞客戶端來執行AOF中保存的寫命令。步驟爲:

    • 從AOF文件中分析並讀取一條寫命令
    • 使用爲客戶端執行被當初的命令
    • 重複執行前面兩個步驟,直到文件中全部的內容都被讀取完畢
  •  AOF文件重寫

  咱們知道AOF文件中保存的是每一次執行的命令,隨着時間的進行,AOF文件的中的內容會愈來愈多,可是當Redis客戶端即執行了添加,也執行了刪除的語句以後,咱們能夠簡單的使用一個新的命令也可以達到數據庫中數據一致的狀態,這時候就講到了Redis的文件重寫功能。

  服務器經過建立一個新的AOF文件來替代原有的AOF文件,新舊兩個文件保存相同的數據庫狀態,可是新的文件不會包含任何冗餘的命令,大大減少了AOF文件的體積。

  AOF文件的重寫功能是經過讀取當前的數據庫狀態來執行的。並不會對原有的AOF文件進行任何的操做。具體的執行是經過調用aof_rewrite函數來執行的,而爲了不影響服務器的性能,這個也是單獨開闢線程來執行的,爲了不在執行重寫過程當中的數據不一致問題,Redis服務器還設置了一個重寫緩衝區來執行在重寫過程當中追加的命令

3、補充

  AOF文件的更新頻率高於RDB文件

  • 只要服務器開啓了AOF持久化功能,服務器會有限使用AOF文件來還原數據庫狀態
  • 只有在AOF持久化功能處於關閉的狀況下,服務器纔會使用RDB文件來還原數據庫狀態
相關文章
相關標籤/搜索