每當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文件重寫。bash
在redis.conf文件中網絡
appendonly no #寫成yes,打開AOF持久化
複製代碼
# appendfsync always
appendfsync everysec # 默認
# appendfsync no
複製代碼
aof文件目錄經過RDB文件目錄,他們共享同一個目錄app
dir ./
appendfilename "appendonly.aof"
複製代碼
經過config set dir {newDir}
動態修改dir配置ui
經過config set dbfilename {appendfilename}
動態修改AOF文件名稱spa
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-percentagecode
> bgrewriteaof
Background append only file rewriting started
複製代碼
Redis讀取AOF文件數據還原過程
本人深知水平有限,歡迎指正本文錯誤之處。