由于Redis 的資料都存盤在記憶體里,為了避免行程退出導致丟失資料,Redis 引入了持久化機制,Redis 的持久化有RDB、AOF兩種機制,
一、RDB
RDB持久化也叫做快照持久化,就是把當前的資料生成快照保存到硬碟,是一種全量備份,它可以通過手動觸發和自動觸發,
手動觸發
save命令和bgsave命令都可以可以手動觸發RDB,不同的是save命令會阻塞當前Redis服務器, 直到RDB程序完成為止,而bgsave命令(fork操作)會創建一個子行程負責RDB持久化,此后父行程不再受到影響(Copy On Write 機制),可以繼續回應請求,因此我們在進行RDB持久化時應該使用bgsave命令,save命令已經被廢棄,
自動觸發
save m n 表示在m秒內資料存在n次修改時, 自動觸發bgsave,
默認情況下Redis 使用的就是自動觸發機制,打開redis.windows-service.conf檔案(windows下,服務安裝方式)

Redis 默認給我們配置了三個條件,當任何一個條件滿足時,就會執行bgsave,
RDB檔案
默認情況下我們會在 Redis 目錄下看到一個名為dump.rdb的檔案,這就是RDB持久化生成的檔案,我們也可以通過如下命令更改存盤路徑和檔案名稱,
config set dir {newDir} 設定存盤路徑
config set dbfilename {newFileName} 設定存盤檔案名稱默認情況下Redis采用LZF演算法對生成的RDB檔案做壓縮處理, 壓縮后的檔案遠遠小于記憶體大小, 可以通過命令 config set rdbcompression {yes|no} 進行開啟或關閉,
優缺點
從上面可以看到RBD保存的是某個時間節點的資料,比較適合定期備份,無法做到實時持久化,
RDB檔案使用特定二進制格式保存資料, 由于Redis有多個格式的RDB版本, 存在各個版本格式不兼容的問題,
Redis 加載 RDB 恢復資料遠遠快于 AOF 的方式,
二、AOF
AOF持久化的原理是把Redis 每次的寫命令(對記憶體進行修改)記錄到單獨的檔案日志檔案中,重啟時再重新執行AOF檔案中的命令達來恢復資料,它解決了RDB方式的實時性問題,
默認情況下AOF不開啟,需要在組態檔中設定appendonly yes來開啟,AOF檔案名通過appendfilename配置設定,默認檔案名是appendonly.aof,保存路勁同RDB持久化方式一致,通過dir配置設定,
AOF的作業流程操作:命令寫入(append)、檔案同步(sync)、檔案重寫(rewrite)、重啟加載(load),

命令寫入(append)
所有的寫入命令會追加到aof_buf(緩沖區) 中,Redis可以提供多種緩沖區同步硬碟的策略, 在性能和安全性方面做出平衡,
檔案同步(sync)
AOF緩沖區根據對應的策略向硬碟做同步操作,
Redis提供了多種AOF緩沖區同步檔案策略, 由引數appendfsync控制,
always:命令寫入aof_buf后立即呼叫系統fsync操作同步到AOF檔案,fsync完成后執行緒回傳,
no:命令寫入aof_buf后呼叫系統write操作,不對AOF檔案做fsync同步;同步由作業系統負責,通常同步周期為30秒,
everysec:命令寫入aof_buf后呼叫系統write操作,write完成后執行緒回傳;fsync同步檔案操作由專門的執行緒每秒呼叫一次,
可以看到always配置資料安全性高但性能非常慢,no配置性能高但資料不安全,而everysec配置可以做到兼顧性能和資料安全性,它是Redis 的默認配置,
檔案重寫(rewrite)
隨著 AOF 檔案越來越大, 需要定期對 AOF 檔案進行重寫, 達到壓縮的目的,
AOF 檔案重寫就是把 Redis 當前行程內的資料轉化為寫命令同步到新 AOF 檔案里,再將操作期間發生的增量 AOF 日志追加到這個檔案中,最后替換掉原 AOF 檔案,
AOF重寫程序可以手動觸發和自動觸發:
·手動觸發: bgrewriteaof 命令,
·自動觸發: 有兩個引數
auto-aof-rewrite-min-size:運行AOF重寫時檔案最小體積,
auto-aof-rewrite-percentage:當前AOF檔案空間(aof_current_size) 和上一次重寫后AOF檔案空間(aof_base_size) 的比值,
默認組態檔如下

意思是當AOF檔案的體積大于64MB,并且AOF檔案的體積比上一次重寫之后的體積大了至少一倍(100%)的時候,Redis將執行 bgrewriteaof 命令,
重啟加載(load)
當 Redis 服務器重啟時, 可以加載 AOF 檔案進行資料恢復,
當 AOF 持久化開啟且存在 AOF 檔案時, 優先加載 AOF 檔案,AOF關倍訓者 AOF 檔案不存在時, 加載 RDB 檔案,
Redis 4.0 混合持久化
一般來說我們使用AOF 方式保證資料的安全性,但是當 AOF 檔案很大時,Redis 啟動將要花費很長時間,RDB 檔案加載到時很快,但是存在丟失資料的情況,因此Redis 4.0 引入了混合持久化的機制,它既可兼顧資料安全,又可提高 Redis 的重啟效率,
混合持久化同樣也是通過 bgrewriteaof 命令完成的,不同的是當開啟混合持久化時,會先將記憶體中的資料以 RDB 方式寫入 AOF 檔案,然后在將重寫緩沖區的增量命令以 AOF 方式寫入到檔案,最后用新檔案替換舊的的 AOF 檔案,新的 AOF 檔案前一部分是 RDB 格式的全量資料后一部分是AOF格式的增量資料(通常這部分 AOF 日志會很小),Redis 重啟時,會先加載 RDB 內容再加載剩余的 AOF ,這樣就可以替代之前的 AOF 全量檔案重放,提高重啟效率,
混合持久化默認關閉的,可以通過修改組態檔aof-use-rdb-preamble或命令 config set aof-use-rdb-preamble {yes|no} 開啟或關閉,
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/12714.html
標籤:NoSQL
下一篇:Redis底層函式詳解
