redis持久化兩種方式

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文件,這點和快照有點相似

相關文章
相關標籤/搜索