RDB (Redis DataBase)
在指定的時間間隔内将記憶體中的資料集快照寫入磁盤,也就是Snapshot快照,它恢複時是将快照檔案直接讀到記憶體裡。
Redis會單獨建立(fork)一個子程序來進行持久化,會先将資料寫入到一個臨時檔案中,待持久化過程都結束了,再用這個臨時檔案替換上次持久化好的檔案。整個過程中,主程序是不進行任何IO操作的,這就確定了極高的性能如果需要進行大規模資料的恢複,且對于資料恢複的完整性不是非常敏感,那RDB方式要比AOF方式更加的高效。RDB的缺點是最後一次持久化後的資料可能丢失。
AOF (Append Of File)
以日志的形式來記錄每個寫操作,将Redis執行過的所有寫指令記錄下來(讀操作不記錄),隻許追加檔案但不可以改寫檔案,Redis啟動之初會讀取該檔案重新建構資料,換言之,Redis重新開機的話就根據日志檔案的内容将寫指令從前到後執行一次以完成資料的恢複工作。
save N M。N 秒内 M 個鍵發生改變則自動觸發bgsave。
另外:手動儲存快照 save 和 bgsave
備份
1. 查詢rdb檔案的目錄。
2. 将 *.rdb 的檔案拷貝到其他目錄。
恢複
1. 正常關閉 Redis。
2. 把備份的檔案拷貝到工作目錄下。
3. 啟動Redis,備份資料會自動加載。
1. 節省磁盤空間
2. 恢複速度快
1. 雖然Redis在fork時使用了寫時拷貝技術,但是如果資料龐大時還是比較消耗性能。
2. 在備份周期在一定間隔時間做一次備份,是以如果Redis意外down掉的話,就會丢失最後一次快照後的所有修改。
AOF采用檔案追加方式,檔案會越來越大為避免出現此種情況,新增了重寫機制,當AOF檔案的大小超過所設定的門檻值時,Redis就會啟動AOF檔案的内容壓縮,隻保留可以恢複資料的最小指令集,可以使用指令重寫。
AOF檔案持續增長而過大時,會fork出一條新程序來将檔案重寫(也是先寫臨時檔案最後再rename),周遊新程序的記憶體中資料,每條記錄有一條的Set語句。
重寫aof檔案的操作,并沒有讀取舊的aof檔案,而是将整個記憶體中的資料庫内容用指令的方式重寫了一個新的aof檔案,這點和快照有點類似。
重寫雖然可以節約大量磁盤空間,減少恢複時間。但是每次重寫還是有一定的負擔的,是以設定Redis要滿足一定條件才會進行重寫。
系統載入時或者上次重寫完畢時,Redis會記錄此時AOF大小,設為base_size,如果Redis的
AOF目前大小 >= base_size + base_size * 100% (預設兩倍) 且 AOF目前大小 >= 64mb(預設) 的情況下,Redis會對AOF進行重寫。
1. AOF和RDB同時開啟,系統預設取AOF的資料。
2. AOF的備份機制和性能雖然和RDB不同,但是備份和恢複的操作同RDB一樣,都是拷貝備份檔案,需要恢複時再拷貝到Redis工作目錄下,啟動系統即加載。
3. AOF檔案的儲存路徑,同RDB的路徑一緻。
4. 如遇到AOF檔案損壞,可通過redis-check-aof進行恢複(基本不使用)。
1. 備份機制更穩健,丢失資料機率更低。
2. 可讀的日志文本,通過操作AOF穩健,可以處理誤操作。
1. 比起RDB占用更多的磁盤空間。
2. 恢複備份速度要慢。
3. 每次讀寫都同步的話,有一定的性能壓力。
1. 官方推薦兩個都啟用。
2. 如果對資料不敏感,可以選單獨用RDB。
3. 不建議單獨用 AOF,因為可能會出現Bug。
4. 如果隻是做純記憶體緩存,可以都不用。