咱們都知道,Redis是一個鍵值對的數據庫服務器,服務器中包含着若干個非空的數據庫,每一個非空的數據庫中包含任意個鍵值對,它將本身的數據都存儲在內存中,若是咱們不採起措施將在內存中的數據保存到磁盤中的話,若是一旦出現服務器宕機的狀況下,服務器中的數據庫數據也會隨之而消失。這時候,Redis就提供了兩種Redis的持久化功能:RDB持久化和AOF持久化。數據庫
RDB經過保存數據庫中的鍵值對來記錄數據庫狀態的不一樣。服務器
RDB既能夠手動置頂,也能夠配置服務器選項進行按期執行,實現是將某個時間點上的Redis數據庫中的數據保存到一個RDB文件中,RDB文件是一個通過壓縮的二進制文件,經過該文件能夠還原生成時的Redis數據庫數據。網絡
通常的話,是有兩個Redis的命令能夠用於生成RDB文件,一個是SAVE,一個是BGSAVE。其中SAVE命令在執行是,會阻塞服務器進程,直到RDB文件建立成,在進程阻塞期間,服務器不能進行任何請求操做。另外一個BGSAVE命令的方式則是派生一個子進程,由子進程負責建立RDB文件,服務器進程繼續處理請求。建立RDB文件的實際工做由rdb.c/rdbSave函數來執行,兩種命令分別以不一樣的方式來調用函數執行。app
讀取RDB文件是在服務器啓動的時候自動完成的,只要再Redis服務器啓動的時候有檢測到RDB文件的存在,就會自耦東讀取RDB文件。函數
Redis服務器中維持着一個dirty技術區和一個lastsave屬性,用來判斷是否執行保存命令性能
BGSAVE能夠在不阻塞服務器進程的狀況下執行,因此咱們能夠配置服務器的save選項,讓服務器每間隔一段時間自動執行一次BGSAVE命令。服務器默認設置save選項以下:spa
1 save 900 1 2 save 300 10 3 save 60 10000
對應的意思是:線程
咱們能夠經過制定配置文件或者傳入啓動參數的方式來設置save選項code
一個默認沒間隔100毫秒就會執行一次的函數,它的任務之一就是檢查save選項所設置的保存條件是否知足,知足的狀況下,就執行BGSAVE命令。server
AOF持久化是經過保存Redis服務器所執行的命令來記錄數據庫狀態的,被寫入AOF的全部命令都是以Redis的請求協議格式來進行保存的。它的整個執行流程大體分爲三步:
讀取文件的執行點同時是在服務器啓動的時候。由於AOF文件中包含了重建數據庫的全部命令,因此服務器只要從新執行一遍AOF文件中保存的命令,就能夠還原數據庫保存以前的數據。Redis經過建立一個沒有網絡鏈接的僞客戶端來執行AOF中保存的寫命令。步驟爲:
咱們知道AOF文件中保存的是每一次執行的命令,隨着時間的進行,AOF文件的中的內容會愈來愈多,可是當Redis客戶端即執行了添加,也執行了刪除的語句以後,咱們能夠簡單的使用一個新的命令也可以達到數據庫中數據一致的狀態,這時候就講到了Redis的文件重寫功能。
服務器經過建立一個新的AOF文件來替代原有的AOF文件,新舊兩個文件保存相同的數據庫狀態,可是新的文件不會包含任何冗餘的命令,大大減少了AOF文件的體積。
AOF文件的重寫功能是經過讀取當前的數據庫狀態來執行的。並不會對原有的AOF文件進行任何的操做。具體的執行是經過調用aof_rewrite函數來執行的,而爲了不影響服務器的性能,這個也是單獨開闢線程來執行的,爲了不在執行重寫過程當中的數據不一致問題,Redis服務器還設置了一個重寫緩衝區來執行在重寫過程當中追加的命令
AOF文件的更新頻率高於RDB文件