save數據庫
bgsave安全
save 100 1 執行原理服務器
rdb文件結構網絡
od -cx dump.db 查看格式化的備份文件app
RDB文件用於保存和還原Redis服務器全部數據庫中的全部鍵值對數據。函數
SAVE命令由服務器遠程直接執行保存操做,因此該命令會阻塞服務器。性能
BGSAVE命令由子進程執行保存操做,因此該命令不會阻塞服務器。spa
服務器狀態中會保存全部用save選項設置的保存條件,當任意一個條件被知足時,服務器會自動執行BGSAVE命令。線程
RDB文件是一個通過壓縮的二進制文件,由多個部分組成。server
對於不一樣類型的鍵值對,RDB文件會使用不一樣的方式來保存他們。
AOF持久化:經過保存Redis服務器所執行的寫命令來記錄數據庫狀態
appendsysnc 三種選項設置 always、everysec、no
爲解決AOF文件體積膨脹,提供了AOF文件重寫功能。不須要對現有AOF文件進行任何分析等操做,經過讀取服務器當前的數據庫狀態來實現。
好比:list 多個add命令,讀取現有數據庫,合併爲一個add命令,同時爲了不輸入緩衝區溢出,重寫程序在處理列表、哈希表、集合、有序集合時,若是一個集合鍵超過了設定值,那麼會用多條add命令來記錄。
使用子進程執行的好處:
子程序執行AOF重寫程序, 不影響主進程處理客戶端請求;
子進程帶有服務器晉城的數據副本,使用子進程而不是線程,能夠在避免使用鎖的狀況,保證數據安全性;
爲避免數據不一致性問題,Redis服務器執行完一個寫命令後,會同時發送寫命令給AOF緩衝區和AOF重寫緩衝區。子進程重寫完成後,發送信號給父進程,父進程調用一個信號處理函數:將重寫緩衝區全部內容寫入新的AOF文件,這是新的文件與數據庫保持一致,徹底替換掉舊的AOF文件,這時候會阻塞父進程不處理任何命令。
AOF文件經過保存全部修改數據庫的寫入命令請求來記錄服務器到的數據庫狀態;
AOF文件中全部的命令都以Redis命令請求協議的格式保存;
命令請求會先保存到AOF緩衝區,以後在按期寫入並同步到AOF文件。
apendfsync選項的不一樣值對AOF持久化功能的安全性以及Redis服務器的性能有很大的影響;
服務器只要載入並從新執行保存在AOF文件中的命令,就能夠還原數據庫原本的狀態;
AOF重寫能夠產生一個新的AOF文件,這個新的AOF文件和原有的AOF文件所保存的數據庫狀態同樣,但體積更小;
AOF重寫是一個有歧義的名字,該功能是經過讀取數據庫中的鍵值對來實現的,程序無須對現有的AOF文件進行任何讀入、分析或者寫入操做;
在執行BGREWRITEAOF命令時,Redis服務器會維護一個AOF重寫緩衝區,該緩衝區會在子進程建立新AOF 文件期間,記錄服務器執行的全部寫命令。當子進程完成建立新AOF文件的工做以後,服務器會將重寫緩衝去中的全部內容追加到新AOF文件的末尾,新舊兩個AOF文件所保存的數據庫狀態一致。最後,服務器用新的AOF文件替換舊的AOF文件,以此來完成AOF文件重寫操做;
事件執行圖
Redis服務器是一個事件驅動程序,服務器處理的事件分爲時間事件和文件事件兩類;
文件事件處理器是基於Reactor模式實現的網絡通訊程序;
文件事件是對套接字操做的抽象:每次套接字可變爲可應答、可寫或者可讀時,相應的文件事件就會產生;
文件事件分爲AE_READABLE事件(讀事件)和AE_WRITABLE事件(寫事件)兩類;
時間事件分爲定時事件和週期性事件:定時事件只在指定的時間到達一次,而週期性事件則每隔一段時間到達一次;
服務器通常狀況下只執行serverCron函數一個時間事件,而且這個事件是週期性事件;
文件事件和時間事件之間是合做關係,服務器會輪流處理這兩種時間,而且處理事件的過程也不會進行搶佔;
時間事件的實際處理事件一般會比設定的到達時間晚一些;