每當Redis-Server接收到寫數據時,就把命令以文本形式追加到AOF文件裏,當重啓Redis服務時,AOF文件裏的命令會被從新執行一次,從新恢復數據。當AOF過大時將重寫AOF文件。redis
> lpush list 1 2 3 4 (integer) 4 127.0.0.1:6379> lrange list 0 -1 1) "4" 2) "3" 3) "2" 4) "1" 127.0.0.1:6379> lpop list "4" 127.0.0.1:6379> lrange list 0 -1 1) "3" 2) "2" 3) "1"
appendonly.aof文件中數據庫
*2 $6 SELECT $1 0 *6 $5 lpush $4 list $1 1 $1 2 $1 3 $1 4 *2 $4 lpop $4 list
能夠看到上面的示例中寫操做有lpush和lpop命令,在AOF文件中存在lpush和lpop。SELECT命令爲AOF程序自動加上的選擇數據庫。安全
AOF命令寫入的內容爲文本協議格式,如:命令lpush list 1 2 3 4 的文本形式爲"*6\r\n$5\r\nlpushr\n$4r\nlist\r\n$1\r\n1$1\r\n2$1\r\n3$1\r\n4\r\n"。將文本內容追加到aof_buf(緩衝區)中,AOF緩衝區根據相應的策略同步寫入AOF文件中,當AOF文件愈來愈大時,將AOF文件重寫。網絡
在redis.conf文件中app
appendonly no #寫成yes,打開AOF持久化
# appendfsync always appendfsync everysec # 默認 # appendfsync no
aof文件目錄經過RDB文件目錄,他們共享同一個目錄操作系統
dir ./ appendfilename "appendonly.aof"
經過config set dir {newDir}
動態修改dir配置code
經過config set dbfilename {appendfilename}
動態修改AOF文件名稱blog
AOF文件過大時,Redis將fork()一個子進程對內存數據進行比那裏逆化成Redis命令,序列化文本格式後寫入到新的AOF文件中。而後將重寫時發生的增量AOF文件追加到新的AOF文件中,最後替換舊的AOF文件。進程
auto-aof-rewrite-percentage 100 # 比上次重寫時文件增大了100%就重寫AOF文件 auto-aof-rewrite-min-size 64mb # AOF文件至少超過爲64M時重寫AOF文件
自動重寫必須知足:當前AOF文件大小 > auto-aof-rewrite-min-size &&(當前文件AOF文件大小減去上次重寫時AOF文件大小)除以 上次重寫時AOF文件大小 = auto-aof-rewrite-percentage內存
> bgrewriteaof Background append only file rewriting started
Redis讀取AOF文件數據還原過程
本人深知水平有限,歡迎指正本文錯誤之處。