redis提供了兩種持久化的機制 RDB和AOF機制linux
RDB(redis Database):RDB保存某一個時間點以前的快照數據。redis
AOF(Append-Only File):指全部的命令行記錄以redis命令請求協議的格式徹底持久化存儲保存爲AOF文件緩存
混合持久化(4.0版本之後):指進行AOF重寫時子進程將當前時間點的數據快照保存爲RDB文件格式,然後將父進程累計命令保存爲AOF格式。安全
RDB快照有兩種觸發方式微信
1:爲經過配置參數,以下:app
經過必定的時間週日內看,命令執行的個數,超過閾值當即執行快照生成性能
save 900 1 //900秒內有1次更新 save 300 10 //30秒內有10次更新 save 60 10000 //60秒內有10000次更新
2:手動執行bgsave/save,手動觸發生成快照
直接執行save會阻塞主進程,bgsave的話會fork一個子進程完成快照操作系統
可是redis在發生RDB持久化的過程當中有幾個問題須要思考命令行
1.RDB快照過程當中Redis是否會中止對外服務線程
2.若是不回中止服務,那如何處理新的請求
接下來咱們看redis的
RDB持久化的具體過程
1:主進程會fork一個子進程
2:子進程會共享一部分主進程的數據空間,而且把共享的數據置爲read-only的狀態,在這個過程當中,子進程以rdb的協議來實行持久化
3:在持久化的過程當中是避免不了有新的數據寫入的,由於咱們有一部分的數據是共享的,兩個進程同時擁有一塊數據,確定會致使數據不一致的問題,
可是依賴於操做系統的fork機制,在修改的時候必定是修改部份內存頁的數據,這個時候會觸發對應內存頁的copyonwrite的操做,不會影響子進程完
成持久化,持久化結束後,主進程會對子進程進行回收
RDB的文件格式
redis的rdb文件是一個很是緊湊的格式
開頭的REDIS是固定的一個格式,redis在讀取持久化文件的時候發現不是以REDIS開頭的會報錯
0006是RDB_VERSION當前RDB協議的版本
AUX_FIELD_KEY_VALUE_PAIRS是一些輔助的字段
data則爲保存的數據,數據首先會選擇redis_db,db選擇以後就是鍵值對的數據,對應的鍵值對又會分爲設置過過時時間和未設置過時時間的數據
RDB持久化的優勢
1:二進制的數據很是緊湊,數據的恢復速度很是快
2:在持久化的過程當中,性能最大化,fork子進程來完成寫操做,讓主進程繼續處理命令,使用單獨子進程來進行持久化,保證了redis的高性能
RDB持久化的缺點
1:數據安全性低,RDB是間隔一段時間進行持久化,若是持久化之間redis發生了故障,會發生數據丟失
2:linux fork以後,kernel把父進程中全部的內存頁權限都設置readonly,而後子進程的地址空間指向父進程。當父子進程都只讀內存時,相安無事。當其中某個進程寫內存時,CPU硬件檢測到內存頁是read-only的,因而觸發頁異常終端(page-fault),陷入kernal的一箇中斷例程。中斷例程中,kernel的copyonwrite機制就會把觸發的異常頁複製一份,因而父子進程各自持有獨立的一份。若是這個時候有大量的寫入操做,會產生大量的分頁錯誤(頁異常中斷page-fault
),這樣就得耗費很多性能在複製上。
AOF持久化執行流程
經過appendonly yes開啓
Redis使用單線程響應命令,若是每次AOF文件命令都追加到磁盤,會極大的影響處理性能,因此Redis先寫入aof緩衝區,根據用戶配置的同步磁盤策略寫入aof文件中,能夠經過appendfsync參數配置同步策略:含義以下
appendfsync always #表示每次更新操做後手動調用fsync()將數據寫入到磁盤 appendfsync everysec #表示每秒同步一次(折中方案,默認值) appendfsync no #表述等操做系統進行數據緩存同步到磁盤(快速響應客戶端,不對AOF作數據同步,同步文件由操做系統負責,一般同步週期最長30S)
AOF重寫機制
隨着命令得不斷寫入AOF,文件會愈來愈大,爲了解決這個問題Redis引入了AOF重寫機制壓縮文件體積。AOF文件重寫是把Redis進程內的數據轉化爲寫命令同步到新AOF文件的過程,AOF重寫機制能夠經過手動觸發了自動觸發
手動觸發:bgreweuteaof命令
自動觸發:
auto-aof-rewrite-percentage 100 #表示當前AOF文件空間和上一次重寫後AOF文件空間的比值(100%) auto-aof-rewrite-min-size 64mb #表明AOF重寫時文件最小體積
AOF的優勢:數據安全,AOF持久化能夠配置appendfsync屬性,有always,每進行一次命令操做就記錄到aof文件中一次。
AOF的缺點:數據集比較大的時候,比RDB啓動效率低
混合持久化
能夠經過aof-use-rdb-preamble yes開啓
加載時,首先會識別AOF文件是否以REDIS字符串開頭,若是是,就按照RDB格式加載,加載完RDB後繼續按AOF格式加載剩餘部分。
混合式持久化方案兼顧了RDB的速度,和AOF的安全性
關注個人技術公衆號,每週都有優質技術文章推送。
微信掃一掃下方二維碼便可關注: