Redis 持久化機制
很多時候我們總會碰到服務器掛掉或者不小心殺了進程、突然斷電之類的情況,那么怎么保證 Redis 掛掉之后再重啟數據可以進行恢復?於是就有了數據的持久化機制
實際上就是:只需要持久化數據也就是將內存中的數據寫入到硬盤里面。
就是:把內存中的數據存儲到硬盤中,方便數據的持續存在,也可以減少斷電造成的損失。
大部分原因是為了之后重用數據(比如重啟機器、機器故障之后恢復數據),或者是為了防止系統故障而將數據備份到一個遠程位置。
Redis 不同於 Memcached 的很重要一點就是,Redis 支持持久化,而且支持兩種不同的持久化操作。
如何持久化以及多長時間一次持久化
Redis 的一種持久化方式叫快照(snapshotting,RDB),另一種方式是只追加文件(append-only file,AOF)。
下面講下這兩種持久化方式。
快照(snapshotting)持久化(RDB)
1、Redis 可以通過創建快照來獲得存儲在內存里面的數據在某個時間點上的副本。
2、Redis 創建快照之后,可以對快照進行備份,可以將快照復制到其他服務器從而創建具有相同數據的服務器副本(Redis 主從結構,主要用來提高 Redis 性能),還可以將快照留在原地以便重啟服務器的時候使用。
快照持久化是 Redis 默認采用的持久化方式,在 redis.conf 配置文件中默認有此下配置:
save 900 1 #在900秒(15分鍾)之后,如果至少有1個key發生變化,Redis就會自動觸發BGSAVE命令創建快照。
save 300 10 #在300秒(5分鍾)之后,如果至少有10個key發生變化,Redis就會自動觸發BGSAVE命令創建快照。
save 60 10000 #在60秒(1分鍾)之后,如果至少有10000個key發生變化,Redis就會自動觸發BGSAVE命令創建快照。
AOF(append-only file)持久化
與快照持久化相比,AOF 持久化的實時性更好,因此已成為主流的持久化方案。
默認情況下 Redis 沒有開啟 AOF(append only file)方式的持久化,可以通過 appendonly 參數開啟:
appendonly yes
開啟 AOF 持久化后每執行一條會更改 Redis 中的數據的命令,Redis 就會將該命令寫入硬盤中的 AOF 文件。
AOF 文件的保存位置和 RDB 文件的位置相同,都是通過 dir 參數設置的,默認的文件名是 appendonly.aof。
在 Redis 的配置文件中存在三種不同的 AOF 持久化方式,它們分別是:
appendfsync always #每次有數據修改發生時都會寫入AOF文件,這樣會嚴重降低Redis的速度
appendfsync everysec #每秒鍾同步一次,顯示地將多個寫命令同步到硬盤
appendfsync no #讓操作系統決定何時進行同步
appendonly yes //啟用 aof 持久化方式
# appendfsync always //收到寫命令就立即寫入磁盤,最慢,但是保證完全的持久化
appendfsync everysec //每秒鍾寫入磁盤一次,在性能和持久化方面做了很好的折中
# appendfsync no //完全依賴 os,性能最好,持久化沒保證
aof 的方式也同時帶來了另一個問題。持久化文件會變的越來越大。
為了兼顧數據和寫入性能,用戶可以考慮 appendfsync everysec 選項 ,讓 Redis 每秒同步一次 AOF 文件,Redis 性能幾乎沒受到任何影響。
而且這樣即使出現系統崩潰,用戶最多只會丟失一秒之內產生的數據。當硬盤忙於執行寫入操作的時候,Redis 還會優雅的放慢自己的速度以便適應硬盤的最大寫入速度。
Redis 4.0 對於持久化機制的優化
Redis 4.0 開始支持 RDB 和 AOF 的混合持久化(默認關閉,可以通過配置項 aof-use-rdb-preamble 開啟)。
如果把混合持久化打開,AOF 重寫的時候就直接把 RDB 的內容寫到 AOF 文件開頭。
這樣做的好處是可以結合 RDB 和 AOF 的優點, 快速加載同時避免丟失過多的數據。
當然缺點也是有的,AOF 里面的 RDB 部分是壓縮格式不再是 AOF 格式,可讀性較差。
CATEGORIESREDIS