Redis持久化概述redis
Redis持久化分紅兩種方式:RDB(Redis DataBase)和AOF(Append Only File)數據庫
1:RDB是在不一樣的時間點,將Redis某一時刻的數據生成快照並存儲到磁盤上緩存
2:AOF是隻容許追加不容許改寫的文件,是將Redis執行過的全部寫指令記錄下來,在下次app
Redis從新啓動時,只要把這些寫指令從前到後再重複執行一遍,就能夠實現數據恢復了異步
3:RDB和AOF兩種方式能夠同時使用,在這種狀況下,若是Redis重啓的話,則會優先採用AOF函數
方式來進行數據恢復,這是由於AOF方式的數據恢復完整度更高工具
4:能夠關閉RDB和AOF,這樣的話,Redis將變成一個純內存數據庫,就像Memcache同樣性能
5:經過配置redis.conf中的appendonly爲yes就能夠打開AOF功能日誌
一,RDB進程
RDB方式,Redis會單首創建(fork)一個子進程來進行持久化,會先將數據寫入到
一個臨時文件中,待持久化過程都結束了,再用這個臨時文件替換上次持久化好的文件。
整個過程當中,主進程是不進行任何IO操做的,這就確保了極高的性能
若是須要進行大規模數據的恢復,且對於數據恢復的完整性不是很是敏感,那RDB方
式要比AOF方式更加的高效。RDB的缺點是最後一次持久化後的數據可能丟失。
RDB的問題
1:fork一個進程時,內存的數據也被複制了,即內存會是原來的兩倍
2:每次快照持久化都是將內存數據完整寫入到磁盤一次,並非增量的只同步髒數
據。若是數據量大的話,並且寫操做比較多,必然會引發大量的磁盤io操做,可
能會嚴重影響性能。
3:因爲快照方式是在必定間隔時間作一次的,因此若是redis意外down掉的話,就
會丟失最後一次快照後的全部修改。
觸發快照的狀況
1:根據配置規則進行自動快照
2:用戶執行save或bgsave命令
3:執行flushall命令
4:執行復制replication時
save命令
執行Save命令時,Redis會阻塞全部客戶端的請求,而後同步進行快照操做。
bgsave命令
執行bgsave命令時,Redis會在後臺異步進行快照操做,快照同時還能夠響應客戶端
請求。能夠經過lastsave命令獲取最後一次成功執行快照的時間。
n flushall命令
這個命令會致使Redis清除內存中的全部數據,若是定義了自動快照的條件,那麼無
論是否知足條件,都會進行一次快照操做;若是沒有定義自動快照的條件,那麼不會進行
快照
二,AOF
默認的AOF持久化策略是每秒鐘fsync一次,fsync是指把緩存中的寫指令記錄到磁盤
中,在這種狀況下,Redis仍能夠保持很高的性能。
固然因爲OS會在內核中緩存write作的修改,因此可能不是當即寫到磁盤上。這樣
aof方式的持久化也仍是有可能會丟失部分修改。不過能夠經過配置文件告訴Redis,想要
經過fsync函數強制os寫入到磁盤的時機。
AOF方式在同等數據規模的狀況下,AOF文件要比RDB文件的體積大,所以AOF方式的
恢復速度也要慢於RDB方式。
AOF日誌恢復
若是在追加日誌時,剛好遇到磁盤空間滿或斷電等狀況,致使日誌寫入不
完整,也沒有關係,Redis提供了redis-check-aof工具,能夠用來進行日誌修
復,基本步驟以下:
1:備份被寫壞的AOF文件
2:運行redis-check-aof –fix進行修復
3:用diff -u來看下兩個文件的差別,確認問題點
4:重啓redis,加載修復後的AOF文件
AOF重寫
AOF採用文件追加方式,這會致使AOF文件愈來愈大,爲此,Redis提供了
AOF文件重寫(rewrite)機制,即當AOF文件的大小超過所設定的閾值時,Redis
就會啓動AOF文件的內容壓縮,只保留能夠恢復數據的最小指令集。可使用命
令bgrewriteaof 。
AOF重寫的觸發機制
Redis是這樣工做的:Redis會記錄上次重寫時的AOF大小。假如自啓動至今尚未進
行太重寫,那麼啓動時AOF文件的大小會被做爲基準值,這個基準值會和當前的AOF大小進
行比較,若是當前AOF大小超出所設置的增加比例,則會觸發重寫。另外,你還須要設置一
個最小大小,是爲了防止在AOF很小時就觸發重寫
AOF重寫的基本原理
1:在重寫開始前,redis會建立一個「重寫子進程」,這個子進程會讀取現有的AOF文件,並
將其包含的指令進行分析壓縮並寫入到一個臨時文件中。
2:與此同時,主進程會將新接收到的寫指令一邊累積到內存緩衝區中,一邊繼續寫入到原有
的AOF文件中,這樣作是保證原有的AOF文件的可用性,避免在重寫過程當中出現意外。
3:當「重寫子進程」完成重寫工做後,它會給父進程發一個信號,父進程收到信號後就會將
內存中緩存的寫指令追加到新AOF文件中
4:當追加結束後,redis就會用新AOF文件來代替舊AOF文件,以後再有新的寫指令,就都會追
加到新的AOF文件中
5:重寫aof文件的操做,並無讀取舊的aof文件,而是將整個內存中的數據庫內容用命令的
方式重寫了一個新的aof文件,這點和快照有點相似