Redis持久化機制
Redis 一共有 2 種持久化方式,分別是 RDB 和 AOF。redis
RDB持久化
RDB是Redis 默認的持久化方式。它所生成的 RDB 文件是一個壓縮的二進制文件,經過該文件能夠還原生成 RDB 文件時的數據庫狀態(數據庫狀態是指 Redis 服務器的非空數據庫以及他們鍵值對的統稱)數據庫
RDB 文件的建立
有兩個命令能夠生成 RDB 文件,一個是 SAVE、另外一個是 BGSAVE。 二者的區別在於:前者會阻塞 Redis 服務器進程,直到 RDB 文件建立完畢爲止。
而在服務器進程阻塞期間,服務器是不能處理任何命令請求的。 後者則不會阻塞服務器進程,由於是經過 fork 一個子進程,並讓其去建立 RDB 文件,而服務器進程(父進程)繼續則繼續處理命令請求。 當寫完數據庫狀態後,新 RDB 文件就會原子地替換舊的 RDB 文件。安全
在配置文件中服務器
save 900 1 #900秒內至少有1個key被更改就執行快照 save 300 10 #300內描述至少有10個key被更改就執行快照 save 60 10000 #60秒內至少有10000個key被更改就執行快照
RDB 文件的載入
RDB 文件的載入是在服務器啓動時自動執行的,因此沒有用於載入的命令,期間阻塞主進程。 只要沒有開啓 AOF 持久化功能,在啓動時檢測到有 RDB 文件,就會自動載入。 當服務器有開啓 AOF 持久化功能時,服務器將會優先使用 AOF 文件來還原數據庫狀態。緣由是 AOF 文件的更新頻率一般比 RDB 文件的更新頻率高。app
AOF 持久化
RDB 持久化經過保存數據庫狀態來持久化。而 AOF 與之不一樣,它是經過保存對數據庫的寫命令來記錄數據庫狀態。 好比執行了 set key 123,Redis 就會將這條寫命令保存到 AOF 文件中。 在服務器下次啓動時,就能夠經過載入和執行 AOF 文件中保存的命令,來還原服務器關閉前的數據庫狀態了。 整體流程和 RDB 持久化同樣 —— 都是建立一個 xxx 文件、在服務器下次啓動時就載入這個文件來還原數據函數
####AOF持久化實現spa
AOF 持久化功能的實現能夠分爲 3 個步驟:命令追加、文件寫入、文件同步 將寫命令追加到 AOF 緩衝區的末尾,接着緩衝區內容寫到 AOF 文件,最後 AOF 文件保存到磁盤。 既然 AOF 持久化是經過保存寫命令到文件的,那隨着時間的推移,這個 AOF 文件記錄的內容就愈來愈多,文件體積也就愈來愈大,對其進行數據還原的時間也就愈來愈久。code
在redis中AOF默認是關閉的,咱們須要修改配置文件來開啓AOF appendonly yes //是否開啓AOF持久化 appendfilename "appendonly.aof"//存儲的文件的名稱
####AOF 重寫進程
經過該功能來建立一個新的 AOF 文件來代替舊文件。而且兩個文件所保存的數據庫狀態同樣,但新文件不會包含任何冗餘命令,因此新文件要比舊文件小得多。 由於重寫涉及到大量 IO 操做,因此 Redis 是用子進程來實現這個功能的,不然將會阻塞主進程。該子進程擁有父進程的數據副本,能夠避免在使用鎖的狀況下,保證數據的安全性。 爲了解決數據庫狀態和重寫後的 AOF 文件,所保存的數據庫狀態不一致的問題。 Redis 設置了一個 AOF 重寫緩衝區。在子進程執行 AOF 重寫期間,主進程須要執行如下三個步驟:同步
- 執行客戶端的請求命令
- 將執行後的寫命令追加到 AOF 緩衝區
- 將執行後的寫命令追加到 AOF 重寫緩衝區
當子進程結束重寫後,會向主進程發送一個信號,主進程接收到以後會調用信號處理函數執行如下步驟:
- 將 AOF 重寫緩衝區內容寫入新的 AOF 文件中。此時新文件所保存的數據庫狀態就和當前數據庫狀態一致了
- 對新文件進行更名,原子地覆蓋現有 AOF 文件,完成新舊文件的替換。
當函數執行完成後,主進程就繼續處理客戶端命令。 所以,在整個 AOF 重寫過程當中,只有在執行信號處理函數時纔會阻塞主進程,其餘時候都不會阻塞。
###簡單總結一下
- RDB 持久化是 Redis 默認持久化方式,經過保存數據庫鍵值對來記錄狀態來持久化,由 SAVE 和 BGSAVE 命令來建立 RDB 文件。前者阻塞 Redis 主進程,後者不會。
- RDB 能夠在配置文件設置每隔多久時間來執行 BGSAVE 命令
- AOF 經過追加寫命令來保存當前數據庫狀態。其持久化功能的實現能夠分爲 3 個步驟:命令追加(到 AOF 緩衝區)、文件寫入(緩衝區內容寫到 AOF 文件)、文件同步(AOF 文件保存磁盤)
- 爲了解決 AOF 文件愈來愈大的問題,Redis 提供了 AOF 重寫功能,而且不會阻塞主進程。
- 爲了解決 AOF 重寫過程當中,新 AOF 文件所保存的數據庫狀態和當前數據庫狀態可能不一致的問題,Redis 引入了 AOF 重寫緩衝區,用於保存子進程在重寫 AOF 文件期間產生的新的寫命令。 ###持久化官方建議 若是你要想提供很高的數據保障性,那麼建議你同時使用兩種持久化方式。若是你能夠接受災難帶來的幾分鐘的數據丟失,那麼你能夠僅使用 RDB。