前面說到redis的三大特性:緩存、分布式內存數據庫、持久化,所以今天將為大家介紹redis的兩種數據持久化技術RDB和AOF, 先介紹RDB吧。
一、RDB是什么?
1、RDB全稱redis database,在指定的時間間隔內將內存中的數據集快照寫入磁盤,也就是行話講的Snapshot快照,它恢復時 直接將快照文件直接讀到內存里;
2、Redis會單獨創建(fork)一個子進程來進行持久化,會先將數據寫入到一個臨時文件中,主進程是不進行任何IO操作的,它
就確保了極高的性能;如果需要進行大規模數據的恢復,且對於數據恢復的完整性不是非常敏感,那RDB方式比AOF方式更加
的高效。RDB的缺點是最后一次持久化后的數據可能丟失。
二、Fork
Fork的作用是復制一個與當前進程一樣的進程。新進程的所有數據(變量、環境變量、程序計數器等)數值都和原進程一 致,但是是一個全新的進程,並作為原進程的子進程。
三、RDB持久化數據在dump.rmb文件中。
四、配置位置
1、save sec changed
在一段時間(sec秒)內,數據修改的次數達到changed次觸發快照,可以寫多條。
補充:save “”表示不設置觸發條件 2、stop-writes-on-bgsave-error yes
在異步快照持久化數據是停止往redis內存寫入數據。
3、rdbcompression yes
對於儲存到磁盤的快照,是否啟用LZF算法進行壓縮存儲,yes則啟用,但會消耗一定CPU。
4、rdbchecksum yes
在存儲快照后,是否讓redis使用CRC64算法來進行數據校驗,但是會增加約10%的性能消耗。
5、dbfilename dump.rdb
設置快照存儲的位置。
6、dir ./
路徑。
五、如何觸發RDB快照
1、配置文件中默認的快照配置
2、命令save或者是bgsave
- save:save時只管保存,其他不管,全部堵塞;
- bgsave:redis會在后台異步進行快照操作,快照同時還可以響應客戶端請求。可以通過lastsave命令獲取最后一次成
功執行快照的時間。
3、執行flushall命令,也會產生dump.rdb文件,但里面是空的,無意義。
六、如何恢復數據
1、將備份文件dump.rdb移動到redis安裝目錄並啟動服務即可;
2、config get dir獲取目錄。
七、優勢
1、適合大規模的數據恢復;
2、對數據完整性和一致性要求不高。
八、劣勢
1、在一定間隔時間做一次備份,所以如果redis意外down掉的話,就會丟失最后一次快照后的所有修改;
2、Fork的時候,內存中的數據被克隆了一份,大致2倍的膨脹性需要考慮。
九、如何停止
動態所有停止rdb保存規則的方法:redis-cli config set save “”
十、小結
1、rdb是一個非常緊湊的文件;
2、rdb在保存rdb文件時父進程唯一需要做的就是fork出一個子進程,接下來的工作全部由子進程來做,父進程不需要再做
其他IO操作,所以rdb持久化方式可以最大化redis的性能;
3、與AOF相比,在恢復大的數據集的時候,rdb方式會更快些;
4、由於可能丟失最后一次快照的修改數據,所以數據丟失風險大;
5、rdb需要經常fork子進程來保存數據集到硬盤上,當數據集比較大的時候,fork的過程非常耗時,可能會導致redis在一些
毫秒級不能響應客戶端請求。
