redis是一個基于內(nèi)存的緩存程序,即redis是使用內(nèi)存進(jìn)行緩存數(shù)據(jù)傍药,但是可以將內(nèi)存中的數(shù)據(jù)按照一定的策略保存到磁盤上活箕,實(shí)現(xiàn)數(shù)據(jù)持久存儲,redis支持兩種不同方式的數(shù)據(jù)持久保存機(jī)制涯冠,分別是RDB和AOF炉奴。
RDB模式
基于時間的快照,值保留當(dāng)前最新的一次快照蛇更,優(yōu)點(diǎn)是執(zhí)行速度比較快盆佣,缺點(diǎn)是可能會丟失從上次快照到當(dāng)前快照未完成之間的數(shù)據(jù)。
RDB快照的執(zhí)行過程
RDB快照的實(shí)現(xiàn)過程械荷,redis從主進(jìn)程fork出一個子進(jìn)程共耍,使用寫時復(fù)制機(jī)制,子進(jìn)程將內(nèi)存的數(shù)據(jù)保存為一個臨時文件吨瞎,比如dump.rdb.tmp痹兜,當(dāng)所有的數(shù)據(jù)保存完成之后在講上一次保存的RDB文件替換掉,然后關(guān)閉子進(jìn)程颤诀,這樣可以保存沒錯做RDB快照的時候保存的數(shù)據(jù)都是完整的字旭,因?yàn)橹苯犹鎿Q了舊的RDB文件的過程中可能出現(xiàn)服務(wù)器宕機(jī),斷電等問題導(dǎo)致RDB文件還沒有保存完整崖叫,導(dǎo)致數(shù)據(jù)丟失的情況遗淳,建議使用自動備份工具或者腳本將每次生成的RDB文件在進(jìn)行備份,最大化保存歷史數(shù)據(jù)心傀。
RDB模式的優(yōu)缺點(diǎn)
1)RDB快照保存了某個時間點(diǎn)的數(shù)據(jù)屈暗,可以通過腳本執(zhí)行bgsave(非阻塞)或者save(阻塞)命令自定義時間點(diǎn)備份,同時保留多個備份脂男,當(dāng)出現(xiàn)故障時恢復(fù)到不同時間點(diǎn)的數(shù)據(jù)养叛。
2)能最大化IO性能,父進(jìn)程在保存RDB文件的時候唯一要做的是fork出一個子進(jìn)程宰翅,而后的任務(wù)都會由子進(jìn)程完成弃甥,父進(jìn)程無須任何的IO操作。
3)RDB在數(shù)據(jù)較大的情況下恢復(fù)速度比AOF快汁讼,比如幾個G甚至更大淆攻。
AOF模式:
AOF模式持久化數(shù)據(jù)過程
按照緩沖區(qū)的數(shù)據(jù)記錄加入順序阔墩,依次操作添加到指定的日志文件中,優(yōu)點(diǎn)是數(shù)據(jù)安全性搞瓶珊,缺點(diǎn)是重復(fù)的記錄也會全部記錄啸箫。
AOF和RDB一樣使用了寫時復(fù)制機(jī)制,AOF默認(rèn)為沒秒鐘fsync依次艰毒,即將執(zhí)行的命令保存到AOF文件中,即使redis服務(wù)器發(fā)生故障也只是丟失1秒鐘之內(nèi)的數(shù)據(jù)搜囱,也可以根據(jù)實(shí)際情況設(shè)置不同的fsync策略丑瞧,或設(shè)置每次執(zhí)行命令的時候執(zhí)行fsync,fsync會在后臺執(zhí)行線程蜀肘,所有主線程可以繼續(xù)處理用的正常請求而不會受到寫入AOF文件的IO影響绊汹。
AOF模式的優(yōu)缺點(diǎn)
AOF的持久存儲文件大小大于RDB格式文件。
根據(jù)定義的fsync策略(fsync是同步內(nèi)存中的redis所有已經(jīng)修改的文件到存儲設(shè)備)默認(rèn)是appendfsync everysec即每秒執(zhí)行一次fsync扮宠。