前言
Redis是基於內存操作的單線程緩存中間件。
一 RDB快照(snapshot)
在默認情況下,Redis將內存數據庫快照保存在dump.rdb二進制文件中,
Redis服務重新啓動時根據dump.rdb文件重寫Redis內存。
dump.rdb文件默認在redis安裝目錄下面。
可以在redis.conf中對redis快照頻率進行設置。
1、save設置語法
save <seconds> <changes>
語法含義:
N秒內至少有M個變動,則自動保存一次數據快照。
比如,save 10 1,即10秒內,發生至少一次變動,則自動保存一次數據快照。
2、redis.conf修改配置
配置修改後要記得重啓redis服務,讓配置生效。
3、實例驗證
把dump.rdb文件刪掉,redis-cli連接客戶端,然後進行簡單set操作。
然後在redis安裝目錄可以看到新生成的dump.rdb文件。
dump.rdb文件內容爲二進制。
如果我們再把dump.rdb文件清掉,殺掉redis進程,重新啓動redis,我們會發現剛纔set的key1在redis裏面
沒有了,因爲dump.rdb被清掉了,redis重啓時就恢復不了數據,所以redis重啓後找不到key1。
反之,則能找到key1。
二 AOF(append only file)
rdb快照是達到條件之後進行dump.rdb備份,如果Redis因爲某些原因造成故障停機,服務將會丟失最近
寫入且仍未保存到快照中的那些數據。Redis針對這種丟失,從1.1版本開始增加了aof持久化方式。
1、aof持久化
aof持久化方式是將redis操作的每一條寫數據指令(比如set)記錄到appendonly.aof(默認文件名)文件中,
當服務重啓的時候,將appendonly.aof中的指令逐條執行恢復數據到redis內存。
2、aof配置
redis.conf中將appendonly no,修改爲appendonly yes,
也可以修改文件名,一般建議不用修改文件名,然後重啓redis服務。
服務重啓後,可以看到appendonly.aof文件。
3、實例驗證
redis-cli連接客戶端,然後進行簡單set操作。
查看appendonly.aof文件,可以看到操作的命令存到aof文件中。
然後在進行一個簡單的get操作。
再次查看appendonfly.aof文件,get命令並沒有存入appendonly.aof中,
證明了redis的aof持久化存儲的只是redis的寫操作命令,不會存讀操作命令。
我們可以通過重啓服務來驗證是否恢復Redis內存,如果擔心dump.rdb文件影響,
先刪掉dump.rdb文件再重啓。
4、aof高級配置
可以配置Redis多久纔將數據fsync到磁盤一次。
1)每次有新命令追加到AOF文件時就執行一次fsync:非常慢,但是非常安全,數據一般不會丟。
2)每秒fsync一次:足夠快(和使用 RDB 持久化差不多),並且在故障時只會丟失1秒鐘的數據。
3)從不fsync :將數據交給操作系統來處理。更快,也更不安全的選擇。
推薦(並且也是默認)的措施爲每秒fsync一次, 這種fsync策略可以兼顧速度和安全性。
三 RDB和AOF優缺點
rdb持久化:故障數據丟失比aof嚴重,但是服務重啓恢復數據快;
aof持久化:故障數據丟失較rdb少,但是服務啓動時恢復數據慢,因爲要把aof文件中指令執行一遍。
使用rdb還是aof持久化,在於你的業務場景對數據丟失承受能力和服務啓動時數據恢復快慢來決定。
但是,普通要求下,建議使用rdb快照備份。
四 混合持久化
重啓Redis時,我們很少使用rdb來恢復內存狀態,因爲會丟失大量數據。我們通常使用AOF日誌重寫,
但是AOF重寫性能相對rdb來說要慢很多,這樣在Redis實例很大的情況下,啓動需要花費很長的時間。
Redis 4.0 爲了解決這個問題,帶來了一個新的持久化選項——混合持久化。
1、混合持久化
AOF在進行文件重寫(aof文件裏可能有太多沒用指令,所以aof會定期根據內存的最新數據生成aof文件)
時將重寫這一刻之前的內存rdb快照文件的內容和增量的AOF修改內存數據的命令日誌文件存在一起,
都寫入新的aof文件,新的文件一開始不叫appendonly.aof,等到重寫完新的AOF文件纔會進行改名,
原子的覆蓋原有的AOF文件,完成新舊兩個AOF文件的替換。
混合持久化文件結構:
2、混合持久化配置
開啓混合持久化:
aof-use-rdb-preamble yes
重啓Redis服務。
3、bgrewriteaof重寫AOF
AOF根據配置規則在後臺自動重寫aof文件,也可以人爲執行命令bgrewriteaof重寫AOF。 於是在Redis重啓的時候,
可以先加載rdb的內容,然後再執行aof指令部分達到Redis數據重放的目的,重啓效率因此大幅得到提升。
4、實例驗證
通過bgrewriteaof手動重寫aof。
查看appendonly.aof文件內容,看到rdb格式的二進制文件。
再執行一條set命令。
然後再看appendonly.aof文件內容。
從文件格式可以看到,混合持久化appendonly.aof文件由rdb格式和aof指令格式兩大部分組成。
Redis在重啓時,先重寫rdb到內存,然後在重寫aof到內存,重啓效率高,還能減少數據的丟失。