柚子快報(bào)激活碼778899分享:數(shù)據(jù)庫 Redis的持久化
Redis的數(shù)據(jù)都是存儲(chǔ)在內(nèi)存中,為了數(shù)據(jù)的永久保存,需要把數(shù)據(jù)同步到硬盤上,這個(gè)過程就叫做持久化. Redis的持久化存在有兩種方式: rdb方式,aof方式,這兩種方式可以單獨(dú)使用,也可以綜合使用.
rdb持久化方式: 是在指定的時(shí)間間隔寫入硬盤 aof持久化方式:是以日志,記錄每一個(gè)操作,服務(wù)器啟動(dòng)后,根據(jù)日志來構(gòu)建數(shù)據(jù). 在線文檔: Redis persistence | Docs Redis支持兩種方式的持久化,一種是RDB方式(默認(rèn)),一種是AOF方式??梢詥为?dú)使用其中一種或?qū)⒍呓Y(jié)合使用。
1 redis持久化之RDB方式
RDB全稱Redis Database Backup file(Redis數(shù)據(jù)備份文件),也被叫做Redis數(shù)據(jù)快照(snapshot)。簡單來說就是把內(nèi)存中的所有數(shù)據(jù)都記錄到磁盤中。當(dāng)Redis實(shí)例故障重啟后,從磁盤讀取快照文件,恢復(fù)數(shù)據(jù)。快照文件稱為RDB文件,默認(rèn)是保存在當(dāng)前運(yùn)行目錄。
1.1 執(zhí)行時(shí)機(jī)
RDB持久化在四種情況下會(huì)執(zhí)行:
執(zhí)行save命令 執(zhí)行bgsave命令 Redis停機(jī)時(shí) 觸發(fā)RDB條件時(shí)
1.2 RDB原理
Redis會(huì)單獨(dú)創(chuàng)建(fork)一個(gè)子進(jìn)程來進(jìn)行持久化,會(huì)先將數(shù)據(jù)寫入到一個(gè)臨時(shí)文件中,待持久化過程都結(jié)束了,再用這個(gè)臨時(shí)文件替換上次持久化好的文件,整個(gè)過程中,主進(jìn)程是不進(jìn)行任何IO操作的,這就確保了極高的性能,如果需要進(jìn)行大規(guī)模的快照,且處于數(shù)據(jù)恢復(fù)的完整性不是非常敏感,那RDB方式要比AOF方式更加的高效.RDB的缺點(diǎn)就是最后一次持久化后的數(shù)據(jù)可能丟失.
具體流程如下:
1) redis 客戶端執(zhí)行 bgsave 命令或者自動(dòng)觸發(fā) bgsave 命令;
2) 主進(jìn)程判斷當(dāng)前是否已經(jīng)存在正在執(zhí)行的子進(jìn)程,如果存在,那么主進(jìn)程直接返回;
3) 如果不存在正在執(zhí)行的子進(jìn)程,那么就 fork 一個(gè)新的子進(jìn)程進(jìn)行持久化數(shù)據(jù),fork 過程是阻塞的,fork 操作完成后主進(jìn)程即可執(zhí)行其他操作;
4) 子進(jìn)程先將數(shù)據(jù)寫入到臨時(shí)的rdb文件中,待快照數(shù)據(jù)寫入完成后再原子替換舊的 rdb文件;
5) 同時(shí)發(fā)送信號(hào)給主進(jìn)程,通知主進(jìn)程 rdb 持久化完成,主進(jìn)程更新相關(guān)的統(tǒng)計(jì)信息
fork采用的是copy-on-write技術(shù):
當(dāng)主進(jìn)程執(zhí)行讀操作時(shí),訪問共享內(nèi)存; 當(dāng)主進(jìn)程執(zhí)行寫操作時(shí),則會(huì)拷貝一份數(shù)據(jù),執(zhí)行寫操作。
?
RDB方式是redis默認(rèn)支持的,總結(jié)如下:
整個(gè)過程中,主進(jìn)程是不進(jìn)行任何 IO 操作的,這就確保了極高的性能
2) 如果需要進(jìn)行大規(guī)模數(shù)據(jù)的恢復(fù),且對于數(shù)據(jù)恢復(fù)的完整性不是非常敏感,那 RDB 方式要比 AOF 方式更加的高效
3) RDB 的缺點(diǎn)是最后一次持久化后的數(shù)據(jù)可能丟失
?
2 redis持久化之AOF方式
AOF: 以日志的形式來記錄每個(gè)寫操作,將redis執(zhí)行過的所有寫指令記錄下來(不會(huì)記錄讀指令),只許追加文件但是不可以改寫文件,redis啟動(dòng)之初會(huì)讀取該文件(appendonly.aof)重新構(gòu)建數(shù)據(jù),換而言之:redis重啟的話就是根據(jù)日志文件的內(nèi)容將寫指令從頭到尾執(zhí)行一次,以完成數(shù)據(jù)的恢復(fù)工作.
?
解讀上圖
客戶端的請求寫命令會(huì)被 append 追加到 AOF 緩沖區(qū)內(nèi) AOF 緩沖區(qū)根據(jù) AOF 持久化策略[always,everysec,no]將操作 sync 同步到磁盤的 AOF 文件 中 AOF 文件大小超過重寫策略或手動(dòng)重寫時(shí),會(huì)對 AOF 文件 rewrite 重寫,壓縮 AOF 文件容量 Redis 服務(wù)重啟時(shí) ,會(huì)重新 load 加載 AOF 文件中的寫操作達(dá)到數(shù)據(jù)恢復(fù)的目的
AOF方式,以日志記錄每一個(gè)操作。Redis可以通過日志去還原數(shù)據(jù)。
優(yōu)勢: 安全性相對RDB方式高很多,它記錄了每一個(gè)操作
劣勢:效率相對于RDB方式低很多。
Redis默認(rèn)是關(guān)閉AOF方式的。 ?
2.1 aof重寫機(jī)制
因?yàn)槭怯涗浢?,AOF文件會(huì)比RDB文件大的多。而且AOF會(huì)記錄對同一個(gè)key的多次寫操作,但只有最后一次寫操作才有意義。通過執(zhí)行bgrewriteaof命令,可以讓AOF文件執(zhí)行重寫功能,用最少的命令達(dá)到相同效果。
如圖,AOF原本有三個(gè)命令,但是set num 123 和 set num 666都是對num的操作,第二次會(huì)覆蓋第一次的值,因此第一個(gè)命令記錄下來沒有意義。
所以重寫命令后,AOF文件內(nèi)容就是:mset name jack num 666
原理
AOF采用文件追加方式,文件會(huì)越來越大為避免出現(xiàn)此種情況,新增了重寫機(jī)制,當(dāng)AOF文件的大小超過所設(shè)定的閾值時(shí),Redis就會(huì)啟動(dòng)AOF文件的內(nèi)容壓縮,只保留可以恢復(fù)數(shù)據(jù)的最小指令集。 AOF文件持續(xù)增長而過大時(shí),會(huì)fork出一條新進(jìn)程來將文件重寫(也是先寫臨時(shí)文件最后再rename),遍歷新進(jìn)程的內(nèi)存中數(shù)據(jù),每條記錄有一條的Set語句。重寫aof文件的操作,并沒有讀取舊的aof文件,而是將整個(gè)內(nèi)存中的數(shù)據(jù)庫內(nèi)容用命令的方式重寫了一個(gè)新的aof文件,這點(diǎn)和快照有點(diǎn)類似
觸發(fā)條件
在 APPEND ONLY MODE模塊下有兩條默認(rèn)配置:
這兩條配置就是觸發(fā)重寫aof文件的條件,第一個(gè)表示文件大小達(dá)到前一次保存文件的一倍,第二個(gè)表示aof文件大小最少達(dá)到64MB,兩個(gè)條件必須同時(shí)滿足。
?
3 RDB與AOF對比
3.1 RDB
采用的是快照機(jī)制進(jìn)行的持久化
優(yōu)點(diǎn)
RDB 是一個(gè)非常緊湊(compact)的文件,它保存了 Redis 在某個(gè)時(shí)間點(diǎn)上的數(shù)據(jù)集。 這種文件非常適合用于進(jìn)行備份 ==RDB 在恢復(fù)大數(shù)據(jù)集時(shí)的速度比 AOF 的恢復(fù)速度要快(因?yàn)槠湮募華OF的小)== ==RDB的性能要比AOF更好==
缺點(diǎn)
==RDB的持久化不夠及時(shí)(一定時(shí)間間隔),可能會(huì)存在數(shù)據(jù)丟失,不便于數(shù)據(jù)庫的重構(gòu)(因?yàn)槭强煺盏哪骋粫r(shí)刻最終結(jié)果,不清楚數(shù)據(jù)的變化過程)== RDB持久化時(shí)如果文件過大可能會(huì)造成服務(wù)器的阻塞,停止客戶端請求
3.2 AOF
采用append模式,不斷的記錄數(shù)據(jù)的變化過程
優(yōu)點(diǎn)
==AOF的持久性更加的耐久(可以每秒 或 每次操作保存一次)== AOF 文件有序地保存了對數(shù)據(jù)庫執(zhí)行的所有寫入操作, 這些寫入操作以 Redis 協(xié)議的格式保存, 因此 AOF 文件的內(nèi)容非常容易被人讀懂, 對文件進(jìn)行分析(parse)也很輕松,數(shù)據(jù)幾乎不會(huì)丟失,便于數(shù)據(jù)庫的重構(gòu)。 AOF是增量操作
缺點(diǎn)
==對于相同的數(shù)據(jù)集來說,AOF 文件的體積通常要大于 RDB 文件的體積,而且AOF文件只會(huì)越來越大(即使是刪除命令也會(huì)被記錄)== ==根據(jù)所使用的 fsync 策略,AOF 的速度可能會(huì)慢于 RDB.== ?
3.3選擇
?
如果你非常關(guān)心你的數(shù)據(jù), 但仍然可以承受數(shù)分鐘以內(nèi)的數(shù)據(jù)丟失,選擇RDB 持久化。 如果對數(shù)據(jù)的完整性要求比較高, 選擇AOF 官方推薦兩個(gè)都啟用
RDB和AOF各有自己的優(yōu)缺點(diǎn),如果對數(shù)據(jù)安全性要求較高,在實(shí)際開發(fā)中往往會(huì)結(jié)合兩者來使用。
柚子快報(bào)激活碼778899分享:數(shù)據(jù)庫 Redis的持久化
相關(guān)鏈接
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場。
轉(zhuǎn)載請注明,如有侵權(quán),聯(lián)系刪除。