Redis在.net中的使用(5)Redis持久化

龐順龍發表於2019-05-11

Redis在.net中的使用(5)Redis持久化

Redis跟Memcached都是記憶體資料庫,不過Redis也支援資料持久化,也就是說Redis可以將記憶體中的資料同步到磁碟來實現資料的持久化,以此來確保Redis的資料安全和準確。

1、Redis持久化的兩種方式

①、RDB(Redis DataBase),將儲存的資料快照的方式儲存到磁碟上。

②、AOF(Append Only File),將Redis執行過的所有資料寫指令記錄下來,通過write函式追加到AOF檔案的末尾,當下次redis重新啟動的時候,我們只要把這些寫指令從前到後再重複執行一遍,就可以實現資料恢復了。 

其實RDB和AOF兩種方式也可以同時使用,在這種情況下,如果redis重啟的話,則會優先採用AOF方式來進行資料恢復,這是因為AOF方式的資料恢復完整度更高,如果你沒有資料持久化的需求,也完全可以關閉RDB和AOF方式,Redis將變成一個純記憶體資料庫,就像Memcache一樣。

2、RDB

RDB(Redis DataBase),是將Redis某一時刻的資料持久化到磁碟中,是一種快照式的持久化方法,預設的檔名為dump.rdb。Redis在進行資料持久化的過程中,會先將資料寫入到一個臨時檔案中,待持久化過程都結束了,才會用這個臨時檔案替換上次持久化好的檔案,以確保資料完整可用。


save 300 10  #300秒內容如超過10個key被修改,則發起快照儲存


不過,由於快照方式是在一定間隔時間做一次的,如果對資料的完整性非常敏感,那麼RDB方式就不太適合你,因為即使你每2分鐘都持久化一次,當redis故障時,仍然會有近2分鐘的資料丟失。所以,redis還提供了另一種持久化方式,那就是AOF。

3、AOF

AOF(Append Only File),即只允許追加不允許改寫的檔案,Redis會將收到的每一個寫操作(如SET等)通過write函式追加到AOF檔案的末尾。預設的AOF持久化策略是每秒鐘fsync一次(把快取中的寫指令記錄到磁碟中)。

當Redis重啟時會通過重新執行檔案中儲存的寫命令來在記憶體中重建整個資料庫的內容。


appendonly yes           #啟用aof持久化方式
# appendfsync always    #每次收到寫命令就立即強制寫入磁碟,最慢的,但是保證完全的持久化,不推薦使用
appendfsync everysec     #每秒鐘強制寫入磁碟一次,在效能和持久化方面做了很好的折中,推薦
# appendfsync no       #完全依賴os,效能最好,持久化沒保證


但AOF方式是將所有的命令記錄下來,所以AOF檔案要比RDB檔案的體積大。而且,恢復速度也要慢於RDB方式。Redis提供了bgrewriteaof命令,會重新生成一個全新的AOF檔案,其中便包括了可以恢復現有資料的最少的命令集。需要注意到是重寫aof檔案的操作,並沒有讀取舊的aof檔案,而是將整個記憶體中的資料庫內容用命令的方式重寫了一個新的aof檔案,這點和快照有點類似。

4、如何選擇RDB和AOF

對於我們應該選擇RDB還是AOF,取決於具體的應用場景,官方的建議是兩個同時使用。這樣可以提供更可靠的持久化方案。

內容均為作者獨立觀點,不代表八零IT人立場,如涉及侵權,請及時告知。

相關文章