1. 程式人生 > 其它 >Redis(五)持久化

Redis(五)持久化

Redis持久化

Redis持久化指的是將redis中的資料寫入硬碟的過程。

1 RDB

簡介

在指定的時間間隔內,將記憶體中的資料集快照寫入磁碟,也就是snapshot,它恢復的時候是將快照檔案直接讀到記憶體。

怎麼樣進行的持久化?

RDB持久化採用了Linux常用的寫時複製技術

Redis會單獨建立(fork)一個子程序來進行持久化,會先將資料寫入到一個臨時檔案中,待持久化過程都結束了,再用這個持久化檔案替換上次持久化好的檔案dump.rdb,整個過程中主程序是不進行任何IO操作的,這樣一方面保證了主程序的效能不受影響,第二點是處於安全性考慮,防止持久化過程出現宕機導致資料不完整。

如果需要大規模的資料恢復,而且對於資料的完整性不是特別敏感,那麼RDB方式比AOF方式更加高效。

RDB唯一的缺點是最後一次持久化的資料可能會丟失。原因是父程序結束子程序也會被撤銷。

RDB配置
stop-writes-on-bgsave-error

yes:當Redis無法寫入硬碟時,直接關閉Redis的寫操作

rdbchecksum 完整性檢查

yes:儲存快照時,讓redis使用CRC64演算法來校驗

save 在指定時間內發生了指定的次數就會執行持久化操作
EDB的備份與恢復

將臨時檔案(路徑由redis.conf指定,預設在啟動路徑下生成)替換dump.rdb然後啟動redis即可。

2 AOF (Append Only File)

2.1 簡介

以日誌的形式來記錄每個寫操作(增量儲存),將Redis執行過的所有寫命令

記錄下來(讀操作不記錄),只許追加檔案不許改寫檔案,redis啟動之初會讀取該檔案重新構建資料,換言之,redis重啟的時候就會根據AOF檔案的內容從頭執行到結尾以完成資料的恢復工作。

如果同時開啟AOF和RDB,系統會預設獲取AOF的資料(資料不會存在丟失)

2.2 AOF配置
append only 是否開啟aof
appendfilename 生成的aof檔名
appendfsync 設定AOF同步頻率
  • always:始終同步,每次redis都會立刻寫入日誌,效能較差但資料完整性比較好

  • everysec:每秒同步一次,如果宕機則本秒資料可能會丟失

  • no:redis不主動進行同步,而是交給作業系統

2.3 redis修復
redis-check-aof -fix

aof檔案受損會導致redis啟動失敗,這時候可以使用該命令進行檔案修復

2.4 Rewrite壓縮

AOF採取檔案追加的方式,檔案會越來越大,為了避免此種情況,新增了重寫機制

觸發機制:當AOF檔案的大小設定超過了給定的閾值,Redis就會啟動檔案的內容壓縮,只保留可以恢復資料的最小指令集,可以使用命令bgrewriteaof

redis會記錄上次aof檔案的大小,預設是變為了上次檔案大小的兩倍並且大於64MB才會觸發重寫

auto-aof-rewrite-percentage : 設定重寫的基準值,預設為100%,即檔案達到原來的兩倍的時候才進行重寫

auto-aof-rewrite-min-size:設定重寫的基準值,預設為64MB

例如檔案70MB開始重寫,然後降到50,下次會從100MB開始重寫

重寫雖然可以節省大量的磁碟空間,減少回覆時間,但是還是有一定負擔的

重寫的原理:會fork一個子程序來將檔案重寫(也是先寫臨時檔案再rename),redis4.0版本後的重寫,就是把rdb的快照,以二進位制的形式附在aof的頭部,作為已有的歷史資料,替換掉原來的流水賬操作