redis rdb aof区别_Redis 持久化之 RDB 与 AOF 详解
走過路過不要錯(cuò)過
點(diǎn)擊藍(lán)字關(guān)注我們
文章出處:https://www.cnblogs.com/jojop/p/13941195.html
Redis 持久化
我們知道Redis的數(shù)據(jù)是全部存儲(chǔ)在內(nèi)存中的,如果機(jī)器突然GG,那么數(shù)據(jù)就會(huì)全部丟失,因此需要有持久化機(jī)制來保證數(shù)據(jù)不會(huì)因?yàn)殄礄C(jī)而丟失。Redis 為我們提供了兩種持久化方案,一種是基于快照,另外一種是基于 AOF 日志。接下來就來了解一下這兩種方案。
操作系統(tǒng)與磁盤
首先我們需要知道 Redis 數(shù)據(jù)庫在持久化中扮演了什么樣的角色,為此我們先來了解數(shù)據(jù)從 Redis 中到磁盤的這一過程:
客戶端向數(shù)據(jù)庫發(fā)起 write 指令(數(shù)據(jù)在客戶端的內(nèi)存中);
數(shù)據(jù)庫收到 write 指令和對(duì)應(yīng)的寫數(shù)據(jù)(數(shù)據(jù)在服務(wù)端內(nèi)存中);
數(shù)據(jù)庫調(diào)用將數(shù)據(jù)寫入磁盤的系統(tǒng)調(diào)用函數(shù)(數(shù)據(jù)在系統(tǒng)內(nèi)核緩沖區(qū));
操作系統(tǒng)將寫入緩沖區(qū)中的數(shù)據(jù)寫到磁盤控制器中(數(shù)據(jù)在磁盤緩沖區(qū)中);
磁盤控制器將磁盤緩沖區(qū)中的數(shù)據(jù)寫入磁盤的物理介質(zhì)中(數(shù)據(jù)真正寫入磁盤中)。
上面只是簡(jiǎn)要介紹了一下過程,畢竟真實(shí)的緩存級(jí)別只會(huì)比這更多。不過我們可以從上面了解到,數(shù)據(jù)庫在持久化的過程中主要應(yīng)該去實(shí)現(xiàn)步驟3,也就是將原本在內(nèi)存中的數(shù)據(jù)持久化到操作系統(tǒng)的內(nèi)核緩沖區(qū)中。至于下面的兩步,則是操作系統(tǒng)需要關(guān)心的事,數(shù)據(jù)庫無能為力。數(shù)據(jù)庫通常僅在必要的時(shí)候會(huì)去調(diào)用將數(shù)據(jù)從內(nèi)存寫入磁盤的系統(tǒng)調(diào)用。
持久化方案
對(duì)于上面我們所述的持久化過程,Redis 提供了以下幾種不同的持久化方案:
利用 RDB 持久化在指定的時(shí)間間隔生成數(shù)據(jù)集的時(shí)間點(diǎn)快照(point-in-time );
利用 AOF 持久化將服務(wù)器收到的所有寫操作命令記錄下來,并在服務(wù)器重新啟動(dòng)的時(shí)候,利用這些命令來恢復(fù)數(shù)據(jù)集。AOF 的命令使用的是與 Redis 本身協(xié)議的命令一致,通過追加的方式將數(shù)據(jù)寫入備份文件中,同時(shí)當(dāng)備份文件過大時(shí),Redis 也能對(duì)備份文件進(jìn)行重壓縮。
如果僅希望數(shù)據(jù)只在數(shù)據(jù)庫運(yùn)行時(shí)存在,那么還可以完全禁用掉持久化機(jī)制;
Redis還可以同時(shí)使用 AOF 持久化和 RDB 持久化。在這種情況下,當(dāng) AOF 重啟時(shí),會(huì)優(yōu)先使用 AOF 文件去恢復(fù)原始數(shù)據(jù)。因?yàn)?AOF 中保存的數(shù)據(jù)通常比 RDB 中保存的數(shù)據(jù)更加完整。
接下來就重點(diǎn)講解 RDB 持久化方案與 AOF 持久化方案之間的異同。
RDB 持久化
RDB(Redis Database)?通過快照的形式將數(shù)據(jù)保存到磁盤中。所謂快照,可以理解為在某一時(shí)間點(diǎn)將數(shù)據(jù)集拍照并保存下來。Redis 通過這種方式可以在指定的時(shí)間間隔或者執(zhí)行特定命令時(shí)將當(dāng)前系統(tǒng)中的數(shù)據(jù)保存?zhèn)浞?#xff0c;以二進(jìn)制的形式寫入磁盤中,默認(rèn)文件名為dump.rdb。
RDB 的觸發(fā)有三種機(jī)制,執(zhí)行save命令;執(zhí)行bgsave命令;在redis.config中配置自動(dòng)化。
save 觸發(fā)
Redis是單線程程序,這個(gè)線程要同時(shí)負(fù)責(zé)多個(gè)客戶端套接字的并發(fā)讀寫操作和內(nèi)存結(jié)構(gòu)的邏輯讀寫。而save命令會(huì)阻塞當(dāng)前的Redis服務(wù)器,在執(zhí)行該命令期間,Redis無法處理其他的命令,直到整個(gè)RDB過程完成為止,用一張圖描述以下:
當(dāng)這條指令執(zhí)行完畢,將RDB文件保存下來后,才能繼續(xù)去響應(yīng)請(qǐng)求。這種方式用于新機(jī)器上數(shù)據(jù)的備份還好,如果用在生產(chǎn)上,那么簡(jiǎn)直是災(zāi)難,數(shù)據(jù)量過于龐大,阻塞的時(shí)間點(diǎn)過長(zhǎng)。這種方式并不可取。
bgsave 觸發(fā)
為了不阻塞線上的業(yè)務(wù),那么Redis就必須一邊持久化,一邊響應(yīng)客戶端的請(qǐng)求。所以在執(zhí)行bgsave時(shí)可以通過fork一個(gè)子進(jìn)程,然后通過這個(gè)子進(jìn)程來處理接下來所有的保存工作,父進(jìn)程就可以繼續(xù)響應(yīng)請(qǐng)求而無需去關(guān)心I/O操作。
redis.config 配置
上述兩種方式都需要我們?cè)诳蛻舳酥腥?zhí)行save或者bgsave命令,在生產(chǎn)情況下我們更多地需要是自動(dòng)化的觸發(fā)機(jī)制,那么Redis就提供了這種機(jī)制,我們可以在redus.config中對(duì)持久化進(jìn)行配置:
Copy總結(jié)
以上是生活随笔為你收集整理的redis rdb aof区别_Redis 持久化之 RDB 与 AOF 详解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 新手谈SBUS接收与转换
- 下一篇: mysql自动备份发邮箱,定时任务自动备