redis持久化分爲RDB和AOF兩種方式,根據我的的理解,即一次全量的持久化和屢次增量的持久化。linux
一、RDB方式redis
RDB持久化是經過快照完成的。當符合必定條件時Redis會將內存中的全部數據生成一個副本存儲在硬盤上,這個過程即爲「快照」。Redis一般會在如下幾種狀況下會對數據進行快照:數據庫
1)根據配置進行快照 緩存
上圖中的save 900 1/save 300 10/save 60 10000便是Redis的默認配置,含義是在900秒內有一個或一個以上的鍵值被更改則進行快照;300秒與60秒的配置相似。app
2)用戶執行save或bgsave命令函數
當執行save命令時,redis會同步進行快照操做,在執行的過程當中會阻塞全部來自客戶端的請求,若是數據了過大,則執行該命令後redis將會在一段時間內無響應,故不建議在生產環境執行該命令;bgsave命令與save命令不一樣,它在執行快照的過程當中仍能夠處理客戶端的請求,當想知道快照是否完成,能夠經過lastsave命令查詢最近一次完成快照的時間。code
3)執行flushall命令blog
當執行flushall命令時,Redis會清除數據庫中的因此數據,不管是否觸發了自動快照的條件。當沒有定義快照條件時,執行該命令不會進行快照。進程
4)執行復制時內存
這裏說的複製通常指主從數據庫同步數據的過程當中生成的快照,即master數據庫生成快照傳輸給slave數據庫。根據《Redis入門指南》,還有一種特殊狀況,須要說明。當linux系統執行fork函數時,會採用寫時複製策略,父子進程會共享同一內存數據,當父進程須要作寫操做時,纔會複製一份數據以保證子進程不受影響,所以,執行fork操做不會致使redis內存消耗翻倍,故須要確保linux容許應用程序申請超過可用內存(物理內存與交換分區)的空間,方法是在/etc/sysctl.conf文件中加入vm.overcommit_memory=1,而後重啓系統或者執行systcl vm.overcommit_memory=1確保設置生效。
內核參數overcommit_memory 它是 內存分配策略 可選值:0、一、2。 0, 表示內核將檢查是否有足夠的可用內存供應用進程使用;若是有足夠的可用內存,內存申請容許;不然,內存申請失敗,並把錯誤返回給應用進程。 1, 表示內核容許分配全部的物理內存,而無論當前的內存狀態如何。 2, 表示內核容許分配超過全部物理內存和交換空間總和的內存
功能。
二、AOF
redis默認不開啓AOF方式的持久化,能夠修改配置appendonly yes開啓。AOF文件保存位置是經過配置dir參數設置的,默認文件名是appendonly.aof,能夠經過修改appendfilename參數修改。由於aof會寫入每個命令操做,這會致使aof文件愈來愈大,當達到必定條件後,aof文件會進行重寫(如刪除被覆蓋的操做記錄),該配置能夠在配置文件中配置:
auto-aof-rewrite-percentage 100 auto-aof-rewrite-min-size 64mb
auto-aof-rewrite-percentage 100參數的含義是:噹噹前aof文件超過上一次重寫時的aof文件大小的100%時會重寫;若以前沒有衝寫過,則以啓動時的aof文件的大小爲依據。
auto-aof-rewrite-min-size 64mb參數限制了容許重寫的最小aof文件大小。
雖然每次更改數據庫內容時,aof都會將命令寫入硬盤,但實際上只是寫入硬盤緩存中,默認每30s執行一次同步操做,若這期間linux系統故障則會致使硬盤緩存中的數據丟失,在Redis中能夠經過設置參數來調整同步時機:
#appendsync always appendsync everysec #appendsync no
若是redis同時開啓了RDB與AOF持久化,則Redis重啓後默認以AOF恢復數據,由於AOF數據相比RDB可能會更完整些。