資料內(nèi)容:
AOF(append-only file)
快照功能并不是非常耐久(durable): 如果 Redis 因?yàn)槟承┰蚨斐晒收贤C(jī), 那么服務(wù)器將丟失
最近寫(xiě)入、且仍未保存到快照中的那些數(shù)據(jù)。從 1.1 版本開(kāi)始, Redis 增加了一種完全耐久的持久化方
式: AOF 持久化,將修改的每一條指令記錄進(jìn)文件appendonly.aof中(先寫(xiě)入os cache,每隔一段時(shí)間
fsync到磁盤(pán))
比如執(zhí)行命令“set zhuge 666”,aof文件里會(huì)記錄如下數(shù)據(jù)
1 *32 $3
3 set
4 $5
5 zhuge
6 $3
7 666
這是一種resp協(xié)議格式數(shù)據(jù),星號(hào)后面的數(shù)字代表命令有多少個(gè)參數(shù),$號(hào)后面的數(shù)字代表這個(gè)參數(shù)有幾
個(gè)字符
注意,如果執(zhí)行帶過(guò)期時(shí)間的set命令,aof文件里記錄的是并不是執(zhí)行的原始命令,而是記錄key過(guò)期的
時(shí)間戳
比如執(zhí)行“set tuling 888 ex 1000”,對(duì)應(yīng)aof文件里記錄如下
1 *3
2 $3
3 set
4 $6
5 tuling
6 $3
7 888
8 *3
9 $9
10 PEXPIREAT
11 $6
12 tuling
13 $13
14 1604249786301
你可以通過(guò)修改配置文件來(lái)打開(kāi) AOF 功能:
1 # appendonly yes
從現(xiàn)在開(kāi)始, 每當(dāng) Redis 執(zhí)行一個(gè)改變數(shù)據(jù)集的命令時(shí)(比如 SET), 這個(gè)命令就會(huì)被追加到 AOF 文
件的末尾。
這樣的話, 當(dāng) Redis 重新啟動(dòng)時(shí), 程序就可以通過(guò)重新執(zhí)行 AOF 文件中的命令來(lái)達(dá)到重建數(shù)據(jù)集的目
的。
你可以配置 Redis 多久才將數(shù)據(jù) fsync 到磁盤(pán)一次。
有三個(gè)選項(xiàng):
1 appendfsync always:每次有新命令追加到 AOF 文件時(shí)就執(zhí)行一次 fsync ,非常慢,也非常安全。
2 appendfsync everysec:每秒 fsync 一次,足夠快,并且在故障時(shí)只會(huì)丟失 1 秒鐘的數(shù)據(jù)。
3 appendfsync no:從不 fsync ,將數(shù)據(jù)交給操作系統(tǒng)來(lái)處理。更快,也更不安全的選擇。
推薦(并且也是默認(rèn))的措施為每秒 fsync 一次, 這種 fsync 策略可以兼顧速度和安全性。
AOF重寫(xiě)
AOF文件里可能有太多沒(méi)用指令,所以AOF會(huì)定期根據(jù)內(nèi)存的最新數(shù)據(jù)生成aof文件
例如,執(zhí)行了如下幾條命令:
1 127.0.0.1:6379> incr readcount
2 (integer) 13 127.0.0.1:6379> incr readcount
4 (integer) 2
5 127.0.0.1:6379> incr readcount
6 (integer) 3
7 127.0.0.1:6379> incr readcount
8 (integer) 4
9 127.0.0.1:6379> incr readcount
10 (integer) 5
重寫(xiě)后AOF文件里變成
1 *3
2 $3
3 SET
4 $2
5 readcount
6 $1
7 5