默認狀況下 Redis 的數據都是保存在內存中,爲避免 Redis 進程意外退出而致使數據丟失的問題,Redis 提供了 RDB 和 AOF 兩種方式來實現數據的持久化存儲。git
RDB 機制是以指定的時間間隔將 Redis 中的數據生成快照並保存到硬盤中,它更適合於定時備份數據的應用場景。能夠經過手動或者自動的方式來觸發 RDB 機制:github
能夠經過如下兩種方式來手動觸發 RDB 機制:redis
除了手動使用命令觸發外,在某些場景下也會自動觸發 Redis 的 RDB 機制:算法
redis.conf
中配置了 save m n
,表示若是在 m 秒內存在了 n 次修改操做時,則自動觸發bgsave
;bgsave
,並將生成的 RDB 文件發送給從節點;debug reload
命令從新加載 Redis 時,會觸發save
操做;shutdown
命令時候,若是沒有啓用 AOF 持久化則默認採用bgsave
進行持久化。1. 文件目錄shell
RDB 文件默認保存在 Redis 的工做目錄下,默認文件名爲 dump.rdb
,能夠經過靜態或動態方式修改:數據庫
靜態配置:經過修改 redis.conf
中的工做目錄dir
和數據庫存儲文件名dbfilename
兩個配置;安全
動態修改:經過在命令行中執行如下命令:網絡
config set dir{newDir}
config set dbfilename{newFileName}
複製代碼
2. 壓縮算法app
Redis 默認採用 LZF 算法對生成的 RDB 文件作壓縮處理, 這樣能夠減小佔用空間和網絡傳輸的數據量,可是壓縮過程會耗費 CPU 的計算資源, 你能夠按照實際狀況,選擇是否啓用。能夠經過修改 redis.conf
中的 rdbcompression
配置或使用如下命令來進行動態修改:運維
config set rdbcompression{yes|no}
複製代碼
AOF 是 Redis 提供的另一種持久化的方式,它以獨立日誌的方式記錄每次寫入操做,重啓時再從新執行這些操做,從而達到恢復數據的命令。
開啓 AOF 機制後,全部的寫入命令都會追加到 aof_buf 緩衝區中,並按照指定的策略定時將緩衝區中的數據同步到磁盤上。 AOF 除了記錄每條命令外,還會在適當的時候 fork 出一個子進程對 AOF 文件進行重寫,在重寫過程當中,Redis 會將能夠合併的語句進行合併,將無效的語句進行刪除,從而減少 AOF 文件的體積,以便減小文件的佔用空間和方便在數據恢復時可以更快的進行加載。
Redis 提供了三種同步策略,用於控制 AOF 緩衝區同步數據到磁盤上的行爲,由參數appendfsync
控制:
可選配置 | 說明 |
---|---|
always | 命令寫入 aof_buf 後就調系統 fsync 操做同步到 AOF 文件 |
everysec | 命令寫入 aof_buf 後就調用系統的 write 操做,但 fsync 同步文件的操做則由專門線程每秒調用一次 |
no | 命令寫入 aof_buf 後就調用系統的 write 操做,不對 AOF 文件作 fsync 同步,同步操做由操做系統負責,一般同步週期最長爲30秒 |
write 和 fsync 操做說明:
Redis 默認的同步機制爲everysec
,此時可以兼顧性能和保證數據安全,在發生意外宕機的時,最多會丟失一秒的數據。
想要使用 AOF 功能,須要配置 appendonly
的值爲yes
,默認值爲no
。默認 AOF 的文件名爲 appendonly.aof
, 能夠經過修改appendfilename
的值進行修改,和 RDB 文件的保存位置同樣,默認保存在 Redis 的工做目錄下。
按照 Redis 官方的推薦,爲保證的數據安全性,能夠同時使用這兩種持久化機制,在 Redis 官方的長期計劃裏面,將來可能會將 AOF 和 RDB 統一爲單一持久化模型。須要注意的是,在這種狀況下,當 Redis 從新啓動時,Redis 將使用 AOF 文件重建數據集,由於它能夠保證數據的最少丟失。
更多文章,歡迎訪問 [全棧工程師手冊] ,GitHub 地址:github.com/heibaiying/…