由於redis是內存數據庫,它將本身的數據庫狀態儲存在內存裏面,若是服務器進程退出,服務器的數據庫狀態就會消失不見。爲了解決這個問題,redis提供了rdb持久化,這個功能就是將redis在內存的數據庫狀態存到磁盤裏。redis
redis有兩個命令用於建立RDB文件,分別是SAVE 和 BGSAVE.數據庫
SAVE命令會阻塞當前服務器進程,知道RDB文件建立完成爲止,期間redis服務器不接受任何其餘命令;服務器
BGSAVE命令不會阻塞當前服務器進程,而是經過fork一個子進程,由這個子進程來建立RDB文件,服務器進程繼續執行命令。blog
RDB文件載入並無命令去執行,它是在每次服務器啓動的時候,只要檢測到RDB文件的存在,就會去載入。進程
須要注意的是,若是服務器開啓了AOF持久化,優先用AOF文件來加載,以下圖所示:內存
前面提到過,當save命令執行時,redis服務器會被阻塞,因此當save命令正在執行時,客戶端發送的全部命令請求都會被拒絕。只有服務器在執行完save命令,從新開始接受命令請求以後,客戶端it
發送的命令纔會被處理。配置
而bgsave命令在執行時,redis服務器還會繼續處理客戶端的命令請求,可是在bgsave命令執行期間,服務器處理save,bgsave,bgrewriteaof三個命令的方式和平時會有點不一樣。請求
1.bgsave命令執行期間,客戶端發送的save命令會被拒絕im
2.bgsave命令執行期間,客戶端發送的bgsave命令會被拒絕
3.最後bgrewriteaof和bgsave不能同時執行,若是bgrewriteaof正在執行,客戶端發送的bgsave命令會被服務器拒絕,若是basave正在執行,那麼客戶端發送的BGREWRITEAOF命令會被延遲到BGSAVE命令執行完畢以後執行。
服務器在載入rdb文件期間,會一直處於阻塞狀態,直到載入工做完成爲止。
redis容許用戶經過設置服務器配置的save選項,讓服務器每一個一段時間自動執行一次BGSAVE命令。好比:save 900 1save 300 10save 60 10000