如果我們想要redis僅僅作為純記憶體的快取來用,那麼可以禁止rdb和aof所有的持久化機制
如果同時使用rdb和aof兩種持久化機制,那麼在redis重啟的時候,會使用aof來重新構建資料,因為aof中的資料更加完整
(1)rdb會生成多個資料檔案,每個資料檔案都代表了某乙個時刻中redis的資料,這種多個資料檔案的方式,非常適合做冷備,可以將這種完整的資料檔案傳送到一些遠端的安全儲存上去,比如說amazon的s3雲服務上去,在國內可以是阿里雲的odps分布式儲存上,以預定好的備份策略來定期備份redis中的資料
(2)rdb對redis對外提供的讀寫服務,影響非常小,可以讓redis保持高效能,因為redis主程序只需要fork乙個子程序,讓子程序執行磁碟io操作來進行rdb持久化即可
(3)相對於aof持久化機制來說,直接基於rdb資料檔案來重啟和恢復redis程序,更加快速
(1)如果想要在redis故障時,盡可能少的丟失資料,那麼rdb沒有aof好。一般來說,rdb資料快照檔案,都是每隔5分鐘,或者更長時間生成一次,這個時候就得接受一旦redis程序宕機,那麼會丟失最近5分鐘的資料
(2)rdb每次在fork子程序來執行rdb快照資料檔案生成的時候,如果資料檔案特別大,可能會導致對客戶端提供的服務暫停數毫秒,或者甚至數秒
(1)aof可以更好的保護資料不丟失,一般aof會每隔1秒,通過乙個後台執行緒執行一次fsync操作,最多丟失1秒鐘的資料
(3)aof日誌檔案即使過大的時候,出現後台重寫操作,也不會影響客戶端的讀寫。因為在rewrite log的時候,會對其中的指導進行壓縮,建立出乙份需要恢復資料的最小日誌出來。再建立新日誌檔案的時候,老的日誌檔案還是照常寫入。當新的merge後的日誌檔案ready的時候,再交換新老日誌檔案即可。
(4)aof日誌檔案的命令通過非常可讀的方式進行記錄,這個特性非常適合做災難性的誤刪除的緊急恢復。比如某人不小心用flushall命令清空了所有資料,只要這個時候後台rewrite還沒有發生,那麼就可以立即拷貝aof檔案,將最後一條flushall命令給刪了,然後再將該aof檔案放回去,就可以通過恢復機制,自動恢復所有資料
(1)對於同乙份資料來說,aof日誌檔案通常比rdb資料快照檔案更大
(2)aof開啟後,支援的寫qps會比rdb支援的寫qps低,因為aof一般會配置成每秒fsync一次日誌檔案,當然,每秒一次fsync,效能也還是很高的
(3)以前aof發生過bug,就是通過aof記錄的日誌,進行資料恢復的時候,沒有恢復一模一樣的資料出來。所以說,類似aof這種較為複雜的基於命令日誌/merge/回放的方式,比基於rdb每次持久化乙份完整的資料快照檔案的方式,更加脆弱一些,容易有bug。不過aof就是為了避免rewrite過程導致的bug,因此每次rewrite並不是基於舊的指令日誌進行merge的,而是基於當時記憶體中的資料進行指令的重新構建,這樣健壯性會好很多。
(1)不要僅僅使用rdb,因為那樣會導致你丟失很多資料
(2)也不要僅僅使用aof,因為那樣有兩個問題,第一,你通過aof做冷備,沒有rdb做冷備,來的恢復速度更快; 第二,rdb每次簡單粗暴生成資料快照,更加健壯,可以避免aof這種複雜的備份和恢復機制的bug
(3)綜合使用aof和rdb兩種持久化機制,用aof來保證資料不丟失,作為資料恢復的第一選擇; 用rdb來做不同程度的冷備,在aof檔案都丟失或損壞不可用的時候,還可以使用rdb來進行快速的資料恢復
Redis 資料持久化
首先redis內部使用乙個redisobject物件來表示所有的key和value,redisobject最主要的資訊如上圖所示 type代表乙個value物件具體是何種資料型別,encoding是不同資料型別在redis內部的儲存方式,比如 type string代表value儲存的是乙個普通字串...
redis資料持久化RDBAOF
全稱 reids database 資料持久化方式之一 在指定時間間隔內,將記憶體中的資料集快照寫入硬碟。術語叫 snapshot 快照。恢復時,將快照檔案直接讀到記憶體裡。root host53 cd var lib redis 6379 root host53 6379 ls dump.rdb ...
Redis資料持久化 RDB AOF
一 redis持久化的兩種方式 記憶體快照,將資料庫中的key value以二進位制的方式存放在rdb檔案中,速度快,但是會丟失事務開始到結束的部分。資料增刪改的日誌,每條日誌插入到aof檔案末尾,資料齊全,但是檔案龐大,恢復慢。二 相輔相成 因為rdb是在指定時間 指定次數後才做快照,並非實時,可...