關閉redis時,會將內存中的數據持久化到硬盤,同步數據;
啟動redis時,會從硬盤加載數據到內存。
平時也要將內存的數據同步到硬盤,redis提供了2種持久化方案:RDB、AOF
RDB
RDB是redis默認使用的持久化方案,隔一段時間同步一次,使用快照保存內存中的數據。
打開redis.conf,搜索rdb即可找到RDB相關配置:
RDB默認設置了3種策略,分別對應redis服務器key的更改頻率:
- 如果900s(即15min)內,對redis中鍵值對的修改個數達到1,就同步數據到硬盤。對應修改很少的情況。
- 如果300s(即5min)內,對redis中鍵值對的修改個數達到10,就同步數據到硬盤。對應修改小多的情況。
- 如果60s(即1min)內,對redis中鍵值對的修改個數達到10000,就同步數據到硬盤。對應修改很多的情況。
默認會壓縮字符串,減小.rdb文件的體積,但會加大服務器開銷。
默認的數據庫文件名是dump.rdb
執行過程:
達到同步要求后,啟動一個子線程,將內存中的數據寫到一個臨時的.rdb文件中,完成后用臨時文件替換原來的.rdb文件。
AOF
把redis服務器執行的寫指令記錄到一個.aof文件中(相當於寫指令的日志),啟動redis服務器時,把.aof中的寫指令重新執行一遍,還原數據。
在redis.conf中搜索append即可找到AOF的配置:
默認是沒開啟AOF的,如果要使用AOF,將no改為yes即可。
默認的寫命令的日志文件名是appendonly.aof。
向.aof文件追加寫指令(同步)有3種策略:
- always 每執行一條寫指令,都會在.aof中追加,開銷大、拉低服務器性能,但最安全,宕機就丟失1個寫指令
- no:把寫指令放到緩沖區里,由操作系統決定什么時候寫到.aof中,資源開銷最小,但不安全,宕機緩沖區里的寫指令都會丟失
- everysec:每秒在.aof中追加一次,一次性寫入這一秒內執行的所有寫指令。上面2種的折中,宕機丟失1s內的寫指令。
默認值everysec,不知道要使用哪種策略,使用默認的everysec即可。
AOF的執行過程:
每隔1s,啟動一個后台線程,將這段時間內的寫指令寫到.aof文件中。
.aof文件中存儲的是執行過的寫指令,不是內存中的數據。
redis服務器啟動時,把.aof中的寫指令重新執行一遍,還原數據。
AOF重寫:
.aof文件中的寫指令越來越多,文件越來越大,還原數據越來越慢。AOF會自動重寫.aof文件。
比如.aof文件中有2條寫指令:
hmset user name "chy" password "abcd"
hset user password "ABCD"
重寫合並為一條:
hmset user name "chy" password "ABCD"
password原來的值不用了,不必再去執行。這樣就減小了文件體積,少執行一條寫指令,還原|啟動也要快一些。
AOF重寫是是否不同步寫指令到.aof中,默認值no,要同步。
如果設置為yes,不同步,會丟失AOF重寫時執行的所有寫指令。
AOF會記錄上次重寫后.aof的文件大小,如果redis服務器啟動后還沒有過AOF重寫,則默認為redis服務器啟動時.aof的文件尺寸。
默認設置了2種重寫策略:
- 如果當前.aof的尺寸,比上一次重寫后增加了百分之多少(默認是100,就翻了一倍),就自動執行AOF重寫
- 如果當前.aof的尺寸,比上一次重寫后增加了多少(默認是64mb),就自動執行AOF重寫
如果增量的百分比設置為0,即禁用AOF的自動重寫。
在redis.conf中搜索dir:
.rdb文件、.aof文件都是保存在此目錄下的。
RDB、AOF的優缺點分析
可以把各個時間段的.rdb文件備份,這樣就有了數據庫各個時間段的數據備份,可以將數據還原到某個時間段,RDB方式十分適合做備份。
.aof中全是寫指令,鬼知道是哪個時間段執行的,不好還原到某個時間段,不適合做備份。
但AOF有一個好處:如果不小心使用flushall命令清空了所有數據,只要還沒有進行AOF重寫,就可以在.aof刪除flushall指令,重新啟動redis即可恢復數據。
RDB每次都是備份內存中的所有數據,有點吃資源、時間開銷大。
AOF每次只需要往.aof中寫入寫指令即可,資源消耗少,且以追加方式寫入,沒有文件尋址開銷,時間開銷小。
RDB每隔60|300|900秒才進行備份,如果期間機器出故障了,這幾十、幾百秒內的數據會全部丟失。
AOF一般是1秒寫一次指令,出故障丟失的數據極少,畢竟只有1秒,數據的一致性、完整性更高。
每次啟動redis服務器,AOF都要重新執行一遍寫指令來還原數據,啟動數據慢。
RDB直接將.rdb中的數據庫數據讀取到內存即可,啟動速度快。
RDB和AOF如何選擇
只使用RDB,可能會丟失很多數據
只使用AOF,不好做各個時間段的備份
一般是AOF、RDB結合使用,用AOF保證數據不丟失,用RDB做各個時間段的備份。
也可以手動同步數據:
dump key #同步某個key,返回該key序列化之后的值
save #同步內存中的所有數據
bgsave #同上,只不過是在后台進行同步,bg即backgroud