Redis 持久化方案:RDB與AOF


 

 

關閉redis時,會將內存中的數據持久化到硬盤,同步數據;

啟動redis時,會從硬盤加載數據到內存。

 

平時也要將內存的數據同步到硬盤,redis提供了2種持久化方案:RDB、AOF

 

 

 


 

 

RDB

RDB是redis默認使用的持久化方案,隔一段時間同步一次,使用快照保存內存中的數據。

 

打開redis.conf,搜索rdb即可找到RDB相關配置:

 

RDB默認設置了3種策略,分別對應redis服務器key的更改頻率:

  • 如果900s(即15min)內,對redis中鍵值對的修改個數達到1,就同步數據到硬盤。對應修改很少的情況。
  • 如果300s(即5min)內,對redis中鍵值對的修改個數達到10,就同步數據到硬盤。對應修改小多的情況。
  • 如果60s(即1min)內,對redis中鍵值對的修改個數達到10000,就同步數據到硬盤。對應修改很多的情況。

 

 

默認會壓縮字符串,減小.rdb文件的體積,但會加大服務器開銷。

 

 

默認的數據庫文件名是dump.rdb

 

 

執行過程:

達到同步要求后,啟動一個子線程,將內存中的數據寫到一個臨時的.rdb文件中,完成后用臨時文件替換原來的.rdb文件。

 

 

 


 

 

 

AOF

把redis服務器執行的寫指令記錄到一個.aof文件中(相當於寫指令的日志),啟動redis服務器時,把.aof中的寫指令重新執行一遍,還原數據。

 

在redis.conf中搜索append即可找到AOF的配置:

默認是沒開啟AOF的,如果要使用AOF,將no改為yes即可。

默認的寫命令的日志文件名是appendonly.aof。

 

 

向.aof文件追加寫指令(同步)有3種策略:

  • always  每執行一條寫指令,都會在.aof中追加,開銷大、拉低服務器性能,但最安全,宕機就丟失1個寫指令
  • no:把寫指令放到緩沖區里,由操作系統決定什么時候寫到.aof中,資源開銷最小,但不安全,宕機緩沖區里的寫指令都會丟失
  • everysec:每秒在.aof中追加一次,一次性寫入這一秒內執行的所有寫指令。上面2種的折中,宕機丟失1s內的寫指令。

默認值everysec,不知道要使用哪種策略,使用默認的everysec即可。

 

 

 

AOF的執行過程:

每隔1s,啟動一個后台線程,將這段時間內的寫指令寫到.aof文件中。

.aof文件中存儲的是執行過的寫指令,不是內存中的數據。

redis服務器啟動時,把.aof中的寫指令重新執行一遍,還原數據。

 

 

AOF重寫:

.aof文件中的寫指令越來越多,文件越來越大,還原數據越來越慢。AOF會自動重寫.aof文件。

 

比如.aof文件中有2條寫指令:

hmset user name "chy" password "abcd"
hset user password "ABCD"

重寫合並為一條:

hmset user name "chy" password "ABCD"

password原來的值不用了,不必再去執行。這樣就減小了文件體積,少執行一條寫指令,還原|啟動也要快一些。

 

 

AOF重寫是是否不同步寫指令到.aof中,默認值no,要同步。

如果設置為yes,不同步,會丟失AOF重寫時執行的所有寫指令。

 

 

AOF會記錄上次重寫后.aof的文件大小,如果redis服務器啟動后還沒有過AOF重寫,則默認為redis服務器啟動時.aof的文件尺寸。

默認設置了2種重寫策略:

  • 如果當前.aof的尺寸,比上一次重寫后增加了百分之多少(默認是100,就翻了一倍),就自動執行AOF重寫
  • 如果當前.aof的尺寸,比上一次重寫后增加了多少(默認是64mb),就自動執行AOF重寫

如果增量的百分比設置為0,即禁用AOF的自動重寫。

 

 


 

 

在redis.conf中搜索dir:

.rdb文件、.aof文件都是保存在此目錄下的。

 

 


 

 

RDB、AOF的優缺點分析

可以把各個時間段的.rdb文件備份,這樣就有了數據庫各個時間段的數據備份,可以將數據還原到某個時間段,RDB方式十分適合做備份。

.aof中全是寫指令,鬼知道是哪個時間段執行的,不好還原到某個時間段,不適合做備份。

但AOF有一個好處:如果不小心使用flushall命令清空了所有數據,只要還沒有進行AOF重寫,就可以在.aof刪除flushall指令,重新啟動redis即可恢復數據。

 

RDB每次都是備份內存中的所有數據,有點吃資源、時間開銷大。

AOF每次只需要往.aof中寫入寫指令即可,資源消耗少,且以追加方式寫入,沒有文件尋址開銷,時間開銷小。

 

RDB每隔60|300|900秒才進行備份,如果期間機器出故障了,這幾十、幾百秒內的數據會全部丟失。

AOF一般是1秒寫一次指令,出故障丟失的數據極少,畢竟只有1秒,數據的一致性、完整性更高。

 

每次啟動redis服務器,AOF都要重新執行一遍寫指令來還原數據,啟動數據慢。

RDB直接將.rdb中的數據庫數據讀取到內存即可,啟動速度快。

 

 

RDB和AOF如何選擇

只使用RDB,可能會丟失很多數據

只使用AOF,不好做各個時間段的備份

一般是AOF、RDB結合使用,用AOF保證數據不丟失,用RDB做各個時間段的備份。

 

 


 

 

也可以手動同步數據:

dump key  #同步某個key,返回該key序列化之后的值

save  #同步內存中的所有數據
bgsave  #同上,只不過是在后台進行同步,bg即backgroud

 


免責聲明!

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



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