1. 程式人生 > >Redis 持久化的兩種方式

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重寫。