Redis中的持久化

之前有簡單介紹過Redis的基本介紹,這裏詳細說下Redis的持久化機制

引言

Redis是內存數據庫,數據全部在內存裏,如果在未做持久化措施的情況下突然宕機,數據就會全部丟失。如果把Redis當做Memcached來看待,那麼也可以不用做持久化。然而我們有時候希望Redis不僅僅作爲緩存來使用,也希望Redis重啓後不必做預熱,那麼就需要用到Redis 的持久化機制。

三種持久化的模式

1.AOF:以追加的方式記錄Redis的寫操作,並在Redis重啓時進行重放(與MySQL的binlog日誌的原理是一樣的)。當AOF日誌過大時,redis支持日誌重寫。【這裏提供一個小知識點,在Redis中是先執行命令再記錄日誌到AOF,這也是Redis事務不支持回滾的原因:即使發生異常,沒有可以用來執行回滾操作的日誌。而傳統的數據庫例如MySQL都是先做日誌然後再做操作,所以能夠支持回滾】

AOF的原理:操作系統將寫操作首先記錄到內存緩衝區中,然後使用fsync函數將數據刷新到磁盤中。

AOF優點:如果不考慮性能,AOF可以最大限度保證數據完整性,可以設置每發生一次寫操作就調用一次fsync函數;更加靈活,可以使用不同的fsync策略,完全不使用fsync,每秒使用fsync(默認),以及每次查詢時使用fsync;

缺點:與下面的RDB方式相比,相同數據集大小AOF佔用空間更大;若調用fsync的頻率過快,性能會變差;

AOF文件損壞?AOF文件中可能有一條命令是不完整的,比如發生正在寫入的時候斷電的這種情況,redis支持重放這樣的AOF文件,他會在啓動日誌中記錄錯誤命令的行數,並在重放時對該行進行忽略。

2.RDB:也稱快照方式,配置每隔一段時間執行一次全量備份,Redis將數據集快照保存在磁盤上,保存在一個名爲dump.rdb的二進制文件中,也可以手動調用SAVE或BGSAVE命令。

RDB的原理:主進程調用fork函數生成一個子進程,子進程進行磁盤I/O操作,操作完成後替換舊的RDB文件

RDB優點:非常適合做備份與回滾到指定的時間點,例如我們可以每天晚上2點執行定時計劃全量備份一次Redis中的數據,以後我們進行恢復的時候可以將Redis恢復到指定的時間點的版本;與AOF相比使用RDB方式性能較高;與AOF相比Redis重啓的速度較快;當AOF文件變的過大時可以自動進行重寫(2.4版本以上,2.4以下版本需要手動調用)

RDB的缺點:相比AOF丟失的數據可能會更多,比如設置5分鐘備份一次快照,那麼最多會損失5分鐘的數據。

3.混合方式:RDB與AOF混合使用。將 RDB文件的內容和增量的 AOF 日誌文件存在一起。這裏的 AOF 日誌不再是全量的日誌,而是自持久化開始到持久化結束的這段時間發生的增量 AOF 日誌。

最後

Redis官方建議使用混合方式進行Redis的持久化。並且我們需要確保避免在RDB快照操作已經在進行時觸發AOF重寫,或者在AOF重寫過程中允許BGSAVE,防止兩個Redis後臺進程同時執行磁盤I/O。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章