Redis被稱為是記憶體資料庫,那是因為它會將其所有資料儲存在記憶體裡,因此Redis具有強勁的速度效能,但是,也正因為資料儲存在記憶體中,當Redis重啟後,所有儲存在記憶體的資料就會遺失。為了使得資料持久化,Redis提供了兩種方式:RDB方式和AOF方式。
一、RDB方式
#RDB方式的持久化是透過快照(snapshotting)完成的,當符合在一定條件時,Redis會自動將記憶體中所有的資料產生一份副本並儲存在硬碟中,這個過程被稱為「快照」。 “快照”,就類似於拍照,摁下快門那一刻,所定格的照片,就稱為“快照”。
Redis有4種狀況可以對資料進行快照: 時中使用「自動設定來」設定自動設定符號
##1221
使用者執行SAVE或BGSAVE指令;
執行FLUSHALL指令;
執行複製(replication)時。
二、AOF方式
透過RDB方式實現持久化,一旦Redis異常退出,就會遺失最後一次快照之後更改的所有資料。為了降低因進程中止導致的資料遺失風險,可以使用AOF方式實現資料持久化。
AOF持久化是以日誌的形式記錄伺服器所處理的每一個寫入、刪除操作,查詢操作不會記錄,以文字的方式記錄,檔案中可以看到詳細的操作記錄。
她的出現是為了彌補RDB的不足(資料的不一致性),所以它採用日誌的形式來記錄每個寫入操作,並追加到檔案中。 Redis 重啟的會根據日誌檔案的內容將寫入指令從前到後執行一次以完成資料的復原工作。
預設情況下,Redis是沒有開啟AOF方式的持久化,可以透過appendonly參數啟動:appendonly yes
開啟AOF持久化後,每執行一條會更改Redis中資料的命令,Redis就會將該命令寫入硬碟中的AOF格式的文件,即.aof格式檔案儲存的是一些redis指令。
這時候就要注意,當頻繁操作Redis中的資料時,AOF格式檔案所佔記憶體就會越來越大,而且會有很多沒用的指令,如連續執行set foo 1, set foo 2,set foo 3。
那麼前兩條指令是沒有意義的,Redis很強大,它會自動將沒有意義的指令刪除,也就是每當達到某個條件時,Redis就會自動重寫AOF文件,而這個條件可以在設定檔中設定。重寫的過程只和記憶體資料有關,和之前的AOF檔無關,這點跟RDB相似。
在同步硬碟資料資料時,由於作業系統的快取機制,資料並沒有真正寫入到硬碟中,而是進入到系統的硬碟快取。在預設的情況下,系統每個30秒會執行一次同步操作,在這30秒的過程中,如果系統異常退出,那麼會導致硬碟記憶體中的資料遺失。
Redis允許同時開啟RDB和AOF方式,既保證了資料安全,又使得備份作業十分容易。 AOF可以有效降低資料遺失的可能性,RDB可以使得資料備份容易達到。
以上是redis怎麼持久化數據的詳細內容。更多資訊請關注PHP中文網其他相關文章!