redis的持久化 rdb和aof


1、rdb(Redis DataBase)

當滿足條件時,redis單獨會fork(創建)一個新的線程,會先將內存中的數據寫入到一個臨時文件中,待持久化過程都結束了,再用這個臨時文件替換上次已經持久化好了的文件,整個過程中,主進程是不進行任何IO操作的,確保了極高的性能,此時的主進程還可以進行讀寫操作。rdb數據持久化的缺點是最后一次持久化的數據可能丟失,當在最后一次持久化的時間截點內還沒有持久化,此時機器宕機了或出故障了,那么最后一次的數據就沒有持久化到。

Fork:fork的作用是復制一個與當前進程一樣的進程,新進程的所有數據(變量、環境變量、程序計數器等)數值都和原進程一致,但是是一個全新的進程,也稱為原進程的子進程。

如果的內存中的數據量非常大的時候,rdb持久化的臨時文件就會非常大,幾乎是原文件的1倍,性能有所降低。

如果當寫操作要立刻持久化的時候,可以執行命令:save

save是全阻塞的,bgsave是異步的。

flushall也會產生dump.rdb文件,清空所有數據庫的數據,並保存在dump.rdb文件中。

shutdown也會產生dump.rdb文件,將內存中數據保存在dump.rdb文件中

 

 

2、aof(Append Only File)

aof的持久化:

aof是對redis的所有寫操作的命令將他保存在.aof文件中,包括flushall和flushdb命令也會。當你flushall后,shuntdown了之后重啟redis,keys *的數據是空的,因為.aof文件的最后一個寫操作的語句是flushall,即使前面做了很多寫操作,flushall后,前面的數據都沒了。

當aof和rdb同時存在時,會加載aof文件,假如aof文件的語法有誤,啟動redis是會報錯了,就如spring配置文件的bean錯了,tomcat也會啟動不了。rdb文件也是。

如果aof或rdb文件語法有誤,可以使用上面兩條命令來修復。

aof修復命令:redis-check-aof --fix appendonlly.aof

rdb修復命令:redis-check-rdb--fix dump.rdb

 

aof是采用文件追加方式,將所有的寫操作保存在aof文件中,當文件越來越大時,有可能存在相同的寫操作,這些相同的操作可以將他濃縮為一條操作,這樣可以減少aof文件的容量。

redis對aof新增了一種重寫機制,當aof文件大小超過所設定的閾值時,redis會啟動aof文件的內容壓縮,只保留可以恢復數據的最小指令集,可以使用命令bgrewriteaof。

rewrite的原理:主進程會fork出一條新的進程對文件重寫,遍歷新進程的內存數據,每條記錄有一條set語句。重寫aof文件的操作並沒有讀取舊的aof文件,而是將整個內存的數據內容用命令的方式重寫了一個新的aof文件。

觸發rewrite的機制:redis會記錄上一次重寫時aof文件的大小,默認配置是當aof文件大小是上次rewrite后大小的一倍且文件大於64mb時觸發。如果啟動redis后沒有發生重寫的,記錄aof文件的大小就啟動時加載的aof文件大小。


免責聲明!

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



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