Redis 持久化的兩種方式
一:RBD
RBD方式是通過快照(snapshotting)完成的,當符合一定的條件時redis會自動將記憶體中所有資料生成一份副本並儲存在硬碟上,這個過程即為快照。redis會在一下幾種情況下對資料進行快照:
- 根據配置規則自動進行快照
- 使用者執行save或者bgsave
- 執行flushall命令
- 執行復制操作
1 根據配置規則進行自動快照
redisyunxu允許使用者自定義快照,當符合條件時,redis會自動執行快照操作。配置命令如下:save m n
其中m為時間視窗,n為改動的鍵的個數。
例如:
save 900 1 (每900秒有一個或者一個以上的鍵被改動) save 300 10 (每300秒有至少十個鍵被修改) save 60 10000 (每60秒至少有10000個鍵被修改)
每條快照條件佔一行,並且以save開頭。同時可以存在多個條件,條件之間是或的關係。
2 使用者執行save或者bgsave命令
除了讓redis自動進行快照外,當進行伺服器重啟、手動遷移以及備份我們也需要手動快照來操作。redis提供了兩個命令來操作。
save
命令:快照執行過程中會阻塞所有來自客戶端的請求。當資料庫中的資料比較多時,這一過程會導致redis較長時間不響應,所以儘量避免在生產環境中使用這一命令。
bgsave
命令:在後臺非同步進行快照操作,快照的同時伺服器還可以繼續響應來自客戶端的請求。執行完該命令後,redis會立刻返回OK表示開始執行快照操作,如果想知道快照是否完成,可以通過lastsave命令來獲取最近一次成功執行快照的時間。
3 執行flushall命令
當執行flushall
命令時,redis會清除資料庫中的所有資料。需要注意的是,不論清空資料庫的過程是否觸發了自動快照條件,只要自動快照不為空,redis就會執行一次快照操作。當沒有定義自動快照條件時,執行 該命令則不會進行RDB快照檔案。
4 快照原理
redis會預設將快照檔案儲存在redis當前程序的工作目錄的dump.rdb檔案中,可以通過配置dir和dbfilename兩個引數分別指定快照檔案的儲存路徑和檔名。快照過程如下:
(1)redis 使用fork函式複製一份當前(父程序)的副本(子程序)。
(2)父程序繼續接收並處理客戶端發來的命令,而子程序將記憶體中的資料寫入硬碟的臨時檔案。
(3)當子程序寫完所有資料後會用該臨時檔案替換舊的RDB檔案,至此一次快照過程完成。
RDB方式持久化,一旦redis異常退出,就會丟失最後一次快照以後更改的所有資料。
二:AOF
AOF會將redis執行的煤一條命令都追加到硬碟檔案中,這一過程會降低redis的效能,但是大部分情況下都是可以接受的。預設情況下AOF是不開啟的,設定引數appendonly yes
。AOF檔案的儲存位置和RDB檔案位置相同,都是通過dir引數設定的,預設的檔名是appedonly.aof,可以通過appendfilename引數修改:
appendfilename appendonly.aof
AOF優化:希望redis優化AOF檔案,刪除重複的資料的無用命令,只保留有用的命令。配置引數:
auto-aof-rewrite-percentage 100
auto-aof-rewrite-pewrite-min-size 64mb
auto-aof-rewrite-percentage 引數的意義是目前的aof檔案大小超過上一次重寫的aof檔案大小的本分之多少再次進行重寫。auto-aof-rewrite-pewrite-min-size引數限制了允許重寫的最小檔案大小。
也可以使用bgrewriteaof
命令手動執行aof重寫。