Redis有兩種持久化的方式:快照(RDB
文件)和追加式文件(AOF
文件):redis
fork()
產生子進程進行數據的持久化,若是數據比較大的話可能就會花費點時間,形成Redis中止服務幾毫秒。若是數據量很大且CPU性能不是很好的時候,中止服務的時間甚至會到1秒。默認Redis會把快照文件存儲爲當前目錄下一個名爲dump.rdb
的文件。要修改文件的存儲路徑和名稱,能夠經過修改配置文件redis.conf
實現:安全
# RDB文件名,默認爲dump.rdb。 dbfilename dump.rdb # 文件存放的目錄,AOF文件一樣存放在此目錄下。默認爲當前工做目錄。 dir ./
你能夠配置保存點,使Redis若是在每N秒後數據發生了M次改變就保存快照文件。例以下面這個保存點配置表示每60秒,若是數據發生了1000次以上的變更,Redis就會自動保存快照文件:服務器
save 60 1000
保存點能夠設置多個,Redis的配置文件就默認設置了3個保存點:app
# 格式爲:save <seconds> <changes> # 能夠設置多個。 save 900 1 #900秒後至少1個key有變更 save 300 10 #300秒後至少10個key有變更 save 60 10000 #60秒後至少10000個key有變更
若是想禁用快照保存的功能,能夠經過註釋掉全部"save"配置達到,或者在最後一條"save"配置後添加以下的配置:工具
save ""
默認狀況下,若是Redis在後臺生成快照的時候失敗,那麼就會中止接收數據,目的是讓用戶能知道數據沒有持久化成功。可是若是你有其餘的方式能夠監控到Redis及其持久化的狀態,那麼能夠把這個功能禁止掉。性能
stop-writes-on-bgsave-error yes
默認Redis會採用LZF
對數據進行壓縮。若是你想節省點CPU的性能,你能夠把壓縮功能禁用掉,可是數據集就會比沒壓縮的時候要打。命令行
rdbcompression yes
從版本5的RDB的開始,一個CRC64
的校驗碼會放在文件的末尾。這樣更能保證文件的完整性,可是在保存或者加載文件時會損失必定的性能(大概10%)。若是想追求更高的性能,能夠把它禁用掉,這樣文件在寫入校驗碼時會用0
替代,加載的時候看到0
就會直接跳過校驗。日誌
rdbchecksum yes
Redis提供了兩個命令用於手動生成快照。code
SAVE命令會使用同步的方式生成RDB快照文件,這意味着在這個過程當中會阻塞全部其餘客戶端的請求。所以不建議在生產環境使用這個命令,除非由於某種緣由須要去阻止Redis使用子進程進行後臺生成快照(例如調用fork(2)
出錯)。生命週期
BGSAVE命令使用後臺的方式保存RDB文件,調用此命令後,會馬上返回OK
返回碼。Redis會產生一個子進程進行處理並馬上恢復對客戶端的服務。在客戶端咱們可使用LASTSAVE命令查看操做是否成功。
127.0.0.1:6379> BGSAVE Background saving started 127.0.0.1:6379> LASTSAVE (integer) 1433936394
配置文件裏禁用了快照生成功能不影響
SAVE
和BGSAVE
命令的效果。
快照並非很可靠。若是你的電腦忽然宕機了,或者電源斷了,又或者不當心殺掉了進程,那麼最新的數據就會丟失。而AOF文件則提供了一種更爲可靠的持久化方式。每當Redis接受到會修改數據集的命令時,就會把命令追加到AOF文件裏,當你重啓Redis時,AOF裏的命令會被從新執行一次,重建數據。
redis-check-aof
這個工具很簡單的進行修復。FLUSHALL
命令把全部數據刷掉了,只要文件沒有被重寫,咱們能夠把服務停掉,把最後那條命令刪掉,而後重啓服務,這樣就能把被刷掉的數據恢復回來。把配置項appendonly
設爲yes
:
appendonly yes
# 文件存放目錄,與RDB共用。默認爲當前工做目錄。 dir ./ # 默認文件名爲appendonly.aof appendfilename "appendonly.aof"
你能夠配置Redis調用fsync的頻率,有三個選項:
推薦使用每秒fsync一次的方式(默認的方式),由於它速度快,安全性也不錯。相關配置以下:
# appendfsync always appendfsync everysec # appendfsync no
隨着寫操做的不斷增長,AOF文件會愈來愈大。例如你遞增一個計數器100次,那麼最終結果就是數據集裏的計數器的值爲最終的遞增結果,可是AOF文件裏卻會把這100次操做完整的記錄下來。而事實上要恢復這個記錄,只須要1個命令就好了,也就是說AOF文件裏那100條命令其實能夠精簡爲1條。因此Redis支持這樣一個功能:在不中斷服務的狀況下在後臺重建AOF文件。
工做原理以下:
咱們能夠經過配置設置日誌重寫的條件:
# Redis會記住自從上一次重寫後AOF文件的大小(若是自Redis啓動後還沒重寫過,則記住啓動時使用的AOF文件的大小)。 # 若是當前的文件大小比起記住的那個大小超過指定的百分比,則會觸發重寫。 # 同時須要設置一個文件大小最小值,只有大於這個值文件纔會重寫,以防文件很小,可是已經達到百分比的狀況。 auto-aof-rewrite-percentage 100 auto-aof-rewrite-min-size 64mb
要禁用自動的日誌重寫功能,咱們能夠把百分比設置爲0:
auto-aof-rewrite-percentage 0
Redis 2.4以上才能夠自動進行日誌重寫,以前的版本須要手動運行BGREWRITEAOF這個命令。
若是由於某些緣由(例如服務器崩潰)AOF文件損壞了,致使Redis加載不了,能夠經過如下方式進行修復:
使用redis-check-aof
命令修復原始的AOF文件:
$ redis-check-aof --fix
diff -u
命令看下兩個文件的差別。這裏只說Redis >= 2.2版本的方式:
dump.rdb
的文件,並把備份文件放在一個安全的地方。運行如下兩條命令:
$ redis-cli config set appendonly yes $ redis-cli config set save ""
確保數據跟切換前一致。
第二條命令是用來禁用RDB的持久化方式,可是這不是必須的,由於你能夠同時啓用兩種持久化方式。
記得對配置文件
redis.conf
進行編輯啓用AOF,由於命令行方式修改配置在重啓Redis後就會失效。