RDB方式實際是將redis中的所有鍵值對保存為二進制文件舶赔,該文件可以還原為某一時刻特定的數(shù)據(jù)庫狀態(tài)。
SAVE命令會阻塞redis服務(wù)器進程谦秧,直到rdb文件創(chuàng)建完畢為止,在服務(wù)器進程阻塞期間撵溃,服務(wù)器不能處理任何命令請求疚鲤,而bgsave命令會派生出一個子進程,由子進程創(chuàng)建rdb文件缘挑。
可以通過設(shè)置save選項設(shè)置bgsave執(zhí)行的條件集歇,redis的周期性操作函數(shù)serverCron會每隔100毫秒檢查save條件是否滿足,一旦滿足就執(zhí)行bgsave语淘。
AOF持久化是通過保存redis服務(wù)器所執(zhí)行的寫命令來記錄數(shù)據(jù)庫狀態(tài)的诲宇。服務(wù)器只要讀入并重新執(zhí)行一遍AOF文件里保存的所有寫命令,就可以還原數(shù)據(jù)庫惶翻。
AOF持久化的實現(xiàn):1. 命令追加到緩沖區(qū)姑蓝;2. 當(dāng)事件循環(huán)到來時如果滿足寫入條件(服務(wù)器配置)則將緩沖區(qū)寫入aof文件。
隨著時間推移redis執(zhí)行的寫命令會越來越多吕粗,aof文件會越來越大纺荧,redis通過aof重寫機制避免aof文件急劇膨脹。aof重寫是通過子進程讀取數(shù)據(jù)庫狀態(tài)來實現(xiàn)的。在子進程進行aof重寫期間宙暇,新的寫命令保存在aof重寫緩沖區(qū)內(nèi)输枯,在aof重寫執(zhí)行完后將重寫緩沖區(qū)的內(nèi)容保存到新的aof文件中。
兩種備份方案的選擇:對于RDB持久化占贫,一方面是bgsave在進行fork操作時Redis主進程會阻塞桃熄,另一方面,子進程向硬盤寫數(shù)據(jù)也會帶來IO壓力型奥,但數(shù)據(jù)的完整性和一致性受備份條件影響可能較差蜻拨;而AOF持久化由于持續(xù)的寫入IO壓力更大,但數(shù)據(jù)的一致性和完整性較好桩引。