一.是什么?
在指定的時間間隔內將內存中的數據集快照寫入磁盤,也就是行話講的Snapshot快照,它恢復時是將快照文件直接讀到內存里。
Redis會單獨創建(fork)一個子進程來進行持久化,會先將數據寫入到一個臨時文件中,待持久化過程都結束了,再用這個臨時文件替換上次持久化好的文件,整個過程中,主進程是不進行任何I/O操作的,這就確保了極高的性能。
如果需要進行大規模數據的恢復且對於數據恢復的完整性不是非常敏感,那RDB要比Redis另一種持久化方式AOF更加高效,RDB的缺點是最后一次持久化的數據可能丟失。
二.Fork?
Fork的作用是復制一個與當前進程一樣的進程,新進程的所有數據(變量、環境變量、程序計數器等)數值都和原進程一樣,但是是一個全新的進程,並作為原進程的子進程。
三.觸發方式?(默認RDB文件名稱:dump.rdb)
1.手動觸發
1).執行save命令后(save命令只管保存,會阻塞進程)
2).執行bgsave命令后(異步執行快照操作,對客戶端請求無影響,可通過lastsave命令獲取最后一次成功執行快照的時間)
3).執行flushall命令后(會產生空的dump.rdb文件,因此無意義)
4).執行shutdown命令后
2.自動觸發
配置 redis.conf 文件中 SNAPSHOTTING 下的屬性。
四.如何恢復快照中的數據?
將備份文件 (dump.rdb) 移動到 redis 安裝目錄並啟動服務即可,redis就會自動加載文件數據至內存了。Redis 服務器在載入 RDB 文件期間,會一直處於阻塞狀態,直到載入工作完成為止。
獲取 redis 的安裝目錄可以使用 config get dir 命令
五.如何停止RDB持久化
有些情況下,我們只想利用Redis的緩存功能,並不像使用 Redis 的持久化功能,那么這時候我們最好停掉 RDB 持久化來最大化Redis性能。
1).在redis.conf配置文件中,注釋掉所有的 save 行來停用RDB功能或者直接一個空字符串來實現停用:save ""
2).通過命令config set save "" 停用RDB功能。
六.總結
1.劣勢
1).RDB是在一定間隔時間做一次備份,所以如果Redis服務意外停止的話就會丟失最后一次快照的所有修改。
2).數據丟失的風險大,對數據完整性和一致性要求不高。
3).RDB方式數據沒辦法做到實時持久化/秒級持久化。因為bgsave每次運行都要執行fork操作創建子進程,屬於重量級操作(內存中的數據被克隆了一份,大致2倍的膨脹性需要考慮),當數據集比較大的時候,fork的過程是非常耗時的,頻繁執行成本過高(影響性能),可能會導致Redis在一些毫秒級不能響應客戶端請求。
4).RDB文件使用特定二進制格式保存,Redis版本演進過程中有多個格式的RDB版本,存在老版本Redis服務無法兼容新版RDB格式的問題(版本不兼容)
2.優勢
1).RDB是一個非常緊湊(compact)的文件,它保存了Redis在某個時間點上的數據集。這種文件非常適合用於進行備份和災難恢復。
2).RDB在恢復大數據集時的速度比 AOF 的恢復速度要快。
3).生成RDB文件的時候,Redis主進程會fork()一個子進程來處理所有保存工作,主進程不需要進行任何磁盤IO操作,所以RDB持久化方式可以最大化Redis性能。
