rdb 和 aof


Redis 中 默認會開啟rdb 持久化方式,aof 默認不開啟,Redis 提供不同級別的持久化方式
rdb: 在指定的時間間隔對你的數據進行快照存儲
aof:記錄每次Redis服務寫操作,當Redis重啟時會重新執行這些命令來恢復數據。aof以Redis協議 將每次寫的命令追加到文件的末尾


查看redis.conf文件
aof 配置

[root@data-chain redis]# grep 'appendonly' redis.conf
appendonly no
# The name of the append only file (default: "appendonly.aof")
appendfilename "appendonly.aof"


rdb 配置

[root@data-chain redis]# grep 'save' redis.conf
#   save <seconds> <changes>
#   Will save the DB if both the given number of seconds and the given
#   In the example below the behaviour will be to save:
#   Note: you can disable saving completely by commenting out all "save" lines.
#   It is also possible to remove all the previously configured save
#   points by adding a save directive with a single empty string argument
#   save ""
save 900 1
save 300 10
save 60 10000



  • rdb優點

rdb是一個非常緊湊的文件,他保存了指定時間的數據集,適合做數據備份(比如可以每一小時保存過去24小時的數據;每一天保存過去30天的數據)
rdb在在保存rdb文件時,父進程會fork出一個子進程,所有的工作都由子進程來完成,父進程不需要做任何事情,所以rdb持久化方式可以最大化Redis性能


  • rdb缺點

rdb是在一定的時間段里保存數據,如果Redis服務器意外down機,這時候可能會造成數據丟失(比如 我是5分鍾保存一次數據,萬一服務器意外掛了,我可能就會丟失幾分鍾的數據)
rdb需要經常fork子進程保存數據集到磁盤上,如果redis數據巨大的話,整個過程會非常耗時

  • rdb測試

默認情況下redis啟用rdb方式,但是在啟動redis 還是要指定默認的配置文件(redis 默認的rdb時間比較久,為方便測試 所以改下rdb得快照時間,改成【save 1 1】:表示每秒有一個key改變)
啟動服務:

./redis-server ../redis.conf &


現在使用redis-cli 連接redis服務器,設置值

127.0.0.1:6379> set name zhangxs
OK

 
這時redis會打印出日志

[root@vm1 src]# 5897:M 14 Jul 11:31:01.938 * 1 changes in 1 seconds. Saving...
5897:M 14 Jul 11:31:01.939 * Background saving started by pid 5910
5910:C 14 Jul 11:31:01.943 * DB saved on disk
5910:C 14 Jul 11:31:01.943 * RDB: 6 MB of memory used by copy-on-write
5897:M 14 Jul 11:31:02.039 * Background saving terminated with success

然后殺掉redis進程,重啟服務,之前set的值 還是存在

  • aof優點

    • aof會讓你的redis 更加耐久,你可以使用不同的fsync策略(無fsync,每秒一次sync,每次寫入sync),默認情況下redis 是每秒一次sync,這樣redis性能還是非常好的,redis的主進程會盡量處理客戶端的請求,一旦出現故障,你最多丟失1秒的數據。
    • aof文件是一個只進行追加的日志文件,即便是因為磁盤滿了或者意外down機,也可以使用redis-check-aof 進行修復命令
    • 當aof文件體積過大時,redis 后台進程會自動對aof文件進行重寫,重寫后的文件包含重寫前文件最小的命令集合,整個過程是安全的
    • aof有序的保存了文件寫入的命令,它使用的redis協議,這個協議的可讀性很高。比如,如果我不小心執行了flshAll命令,只要你的aof文件沒有被重寫,你可以直接在aof文件的末尾刪除flushAll命令,然后重啟服務器。你的數據就會重新回到flushAll之前的數據集。

  • aof缺點

在相同的數據集下,aof文件的體積要大於rdb文件
根據所使用的sync的策略,aof寫入的速度可能要比rdb慢。一般情況下,每秒的sync的性能依然很高

至於使用哪種持久化方式,取決於自己的需求,一般情況下 兩種都會使用, rdb 可以方便的用來做定時數據備份

  • rdb的工作方式

redis會調用forks 生成一個子進程
子進程復制數據集到一個臨時的rdb文件中
當子進程完成對數據集的復制后,redis會用新的rdb文件,並刪除舊得rdb文件

  • aof 工作方式

打開aof方式,在redis.conf中配置

appendonly yes

 

  • aof 模式的三種選項
appendfsync always    //每次有寫入命令都會同步
appendfsync everysec  //每秒同步一次寫入命令
appendfsync no        //讓操作系統刷新輸出緩沖區。

 

 

  • Aof 工作方式

 

 

 

 

  • 從rdb模式 轉到aof 模式(Redis2.2之后可以在不重啟的情況下,從aof到rdb,並且rdb的數據還會同步到aof 中)

測試數據(當前還在rdb 持久化模式中):

127.0.0.1:6379> set fang cuixian
OK
127.0.0.1:6379> exit

 
開始步驟:
    • 備份最新的dump.rdb文件,並放到一個安全的地方(為了防止意外)
    • 使用命令:

[root@vm1 src]# redis-cli config set appendonly yes
OK
[root@vm1 src]# redis-cli config set save ""
OK

 這個是退出redis-cli客戶端后的命令,如果在redis-cli內,使用 config set appendonly yes和config set save ""

執行上面兩個命令后查看redis日志:

6044:M 14 Jul 12:22:49.893 * 1 changes in 1 seconds. Saving...
6044:M 14 Jul 12:22:49.895 * Background saving started by pid 6049
6049:C 14 Jul 12:22:49.900 * DB saved on disk
6049:C 14 Jul 12:22:49.901 * RDB: 6 MB of memory used by copy-on-write
6044:M 14 Jul 12:22:49.995 * Background saving terminated with success
6044:M 14 Jul 12:23:36.725 * Background append only file rewriting started by pid 6051
6044:M 14 Jul 12:23:36.767 * AOF rewrite child asks to stop sending diffs.
6051:C 14 Jul 12:23:36.767 * Parent agreed to stop sending diffs. Finalizing AOF...
6051:C 14 Jul 12:23:36.767 * Concatenating 0.00 MB of AOF diff received from parent.
6051:C 14 Jul 12:23:36.767 * SYNC append only file rewrite performed
6051:C 14 Jul 12:23:36.767 * AOF rewrite: 6 MB of memory used by copy-on-write
6044:M 14 Jul 12:23:36.843 * Background AOF rewrite terminated with success
6044:M 14 Jul 12:23:36.843 * Residual parent diff successfully flushed to the rewritten AOF (0.00 MB)
6044:M 14 Jul 12:23:36.843 * Background AOF rewrite finished successfully

 


可以看到aof同步 寫入成功。
    • 然后修改redis.conf文件,將appendonly 設置為yes,要不然重啟服務器后 又會使用之前的配置。
關閉 rdb模式,不關也可以,兩個持久化模式可以同時存在,一般情況下也是這樣,這里為了測試,所以關掉。

    • 然后殺死redis服務,再重新啟動Redis服務,進入redis-cli客戶端,查看剛才的測試數據,這個測試數據是在rdb模式下執行的。

[root@vm1 src]# redis-cli
127.0.0.1:6379> get fang
"cuixian"


可以看到在 在rdb模式下 寫的命令,在轉換為aof模式后,數據還在。

 

 

參考文檔:https://redis.io/topics/persistence


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM