redis提供了兩種持久化的機制 RDB和AOF機制
RDB(redis Database):RDB保存某一個時間點之前的快照資料,
AOF(Append-Only File):指所有的命令列記錄以redis命令請求協議的格式完全持久化存盤保存為AOF檔案
混合持久化(4.0版本以后):指進行AOF重寫時子行程將當前時間點的資料快照保存為RDB檔案格式,而后將父行程累計命令保存為AOF格式,
RDB快照有兩種觸發方式
1:為通過配置引數,如下:
通過一定的時間周日內看,命令執行的個數,超過閾值立即執行快照生成
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的安全性
關注我的技術公眾號,每周都有優質技術文章推送,
微信掃一掃下方二維碼即可關注:
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/174435.html
標籤:其它
上一篇:常用Oracle SQL集錦

