redis的持久化 rdb和aof

一、rdb(Redis DataBase)redis

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

Fork:fork的做用是複製一個與當前進程同樣的進程,新進程的全部數據(變量、環境變量、程序計數器等)數值都和原進程一致,可是是一個全新的進程,也稱爲原進程的子進程。數據庫

若是的內存中的數據量很是大的時候,rdb持久化的臨時文件就會很是大,幾乎是原文件的1倍,性能有所下降。tomcat

若是當寫操做要馬上持久化的時候,能夠執行命令:saveapp

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

flushall也會產生dump.rdb文件,清空全部數據庫的數據,並保存在dump.rdb文件中。性能

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

 

 

二、aof(Append Only File)3d

aof的持久化:blog

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文件大小。

相關文章
相關標籤/搜索