更新時間:2021-08-17 10:02:37 來源:動力節(jié)點(diǎn) 瀏覽1028次
Redis提供了兩種方式對數(shù)據(jù)進(jìn)行持久化,分別是RDB和AOF。
RDB持久化方式能夠在指定的時間間隔能對你的數(shù)據(jù)進(jìn)行快照存儲。
AOF持久化方式記錄每次對服務(wù)器寫的操作,當(dāng)服務(wù)器重啟的時候會重新執(zhí)行這些命令來恢復(fù)原始的數(shù)據(jù),AOF命令以redis協(xié)議追加保存每次寫的操作到文件末尾。Redis還能對AOF文件進(jìn)行后臺重寫,使得AOF文件的體積不至于過大。
如果你只希望你的數(shù)據(jù)在服務(wù)器運(yùn)行的時候存在,你也可以不使用任何持久化方式。
你也可以同時開啟兩種持久化方式,,在這種情況下,當(dāng)redis重啟的時候會優(yōu)先載入AOF文件來恢復(fù)原始的數(shù)據(jù),因?yàn)樵谕ǔG闆r下AOF文件保存的數(shù)據(jù)集要比RDB文件保存的數(shù)據(jù)集要完整。
Redis默認(rèn)開啟RDB的存儲方式。
The filename where to dump the DB
dbfilename “dump.rdb”
對于AOF的存儲方式redis并沒有默認(rèn)開啟。通過配置開啟如下:
把注釋去掉就開啟了AOF的存儲方式。
開啟RDB方式redis會在指定的時間段內(nèi)將內(nèi)存中的數(shù)據(jù)快照到磁盤中,redis啟動時再恢復(fù)到內(nèi)存中。
Redis會單獨(dú)創(chuàng)建(fork)一個線程,將數(shù)據(jù)寫入到臨時文件中,持久化的過程都結(jié)束了,在用這個臨時文件替換上次的臨時文件。
如果需要進(jìn)行大規(guī)模的數(shù)據(jù)恢復(fù),并且對于數(shù)據(jù)恢復(fù)不是很敏感,RDB的方式比AOF方式更加高效,RDB的缺點(diǎn)就在于最后一次持久化后的數(shù)據(jù)有可能會丟失。
RDB持久化數(shù)據(jù)觸發(fā)配置在redis.conf中:
默認(rèn)是當(dāng)一條數(shù)據(jù)寫入時15分鐘持久化一次,當(dāng)10條數(shù)據(jù)發(fā)生變化5分鐘(為了測試方便改成了2分鐘)持久化一次,當(dāng)10000條數(shù)據(jù)發(fā)生變化1分鐘進(jìn)行持久化。
RDB存儲方式測試:
兩分鐘后在文件夾中生成了一個dump.rdb的文件,這個就是臨時文件,保存該臨時文件。
再次清空數(shù)據(jù)庫:
然后刪除dum.rdb文件,將dump.rdb.bk文件恢復(fù)成dump.rdb。再啟動服務(wù)器。
如上圖所示,redis中的數(shù)據(jù)已經(jīng)從dump.rdb中恢復(fù)過來了。
以日志的形式來記錄每個寫操作,將Redis執(zhí)行過的所有寫指令記錄下來(讀操作不記錄),
只許追加文件但不可以改寫文件,redis啟動之初會讀取該文件重新構(gòu)建數(shù)據(jù),換言之,redis
重啟的話就根據(jù)日志文件的內(nèi)容將寫指令從前到后執(zhí)行一次以完成數(shù)據(jù)的恢復(fù)工作。
注:所有的指令記錄也包括flushDB操作,后面會有坑。
在redis中這種存儲方式默認(rèn)是關(guān)閉的,需要在redis.conf文件中開啟,開啟方式在文中已經(jīng)做了介紹,就不在贅述。
Redis對于AOF存儲方式是怎么持久化的在redis.conf也有,如下:
配置文件對于這種方式的持久化有三種方式:
(1)有寫操作就寫。顯然這種方式影響性能。但是數(shù)據(jù)完整,不會丟數(shù)據(jù)
(2)不開啟。不開啟AOF就沒意思了
(3)每秒寫文件。折中的方式更加合適。但是有可能導(dǎo)致一秒的數(shù)據(jù)丟失。
AOF采用文件追加方式,文件會越來越大為避免出現(xiàn)此種情況,新增了重寫機(jī)制,
當(dāng)AOF文件的大小超過所設(shè)定的閾值時,Redis就會啟動AOF文件的內(nèi)容壓縮。
AOF文件持續(xù)增長而過大時,會fork出一條新進(jìn)程來將文件重寫(也是先寫臨時文件最后再rename),遍歷新進(jìn)程的內(nèi)存中數(shù)據(jù),每條記錄有一條的Set語句。重寫aof文件的操作,并沒有讀取舊的aof文件,而是將整個內(nèi)存中的數(shù)據(jù)庫內(nèi)容用命令的方式重寫了一個新的aof文件,這點(diǎn)和快照有點(diǎn)類似。
Redis會記錄上次重寫時的AOF大小,默認(rèn)配置是當(dāng)AOF文件大小是上次rewrite后大小的一倍且文件大于64M時觸發(fā)。
(1)每秒同步。
(2)每修改同步。
(1)AOF文件遠(yuǎn)大于EDB。
(2)運(yùn)行效率慢。
(1)寫入數(shù)據(jù)
(2)寫入之后在文件夾中出現(xiàn)了AOF文件,再對這個文件進(jìn)行備份
(3)清空數(shù)據(jù)庫并退出
(4)恢復(fù)appendonly.aof文件
(5)啟動redis服務(wù)器,查看數(shù)據(jù)
如圖所示數(shù)據(jù)已經(jīng)恢復(fù)。
從剛才測試AOF可以看出兩種方式同時開啟是使用AOF的存儲方式。
當(dāng)只開啟了RBD方式時數(shù)據(jù)庫中有10條數(shù)據(jù),當(dāng)開啟了AOF方式之后,由于appendonly.aof文件中沒有備份數(shù)據(jù),所以啟動后如第二個框中框出的所示沒有數(shù)據(jù)。從這里可以看出默認(rèn)首先使用AOF的存儲方式。
AOF是使用文件追加的方式,隨著系統(tǒng)使用的越來越久,AOF的文件會越來越大,當(dāng)AOF的大小超過文件大小所設(shè)定的閾值時,Redis就會啟動AOF文件內(nèi)容壓縮,只保留可以恢復(fù)的最小指令集。
重寫原理:對文件進(jìn)行壓縮(AOF文件過大時,redis會fork出一條新的進(jìn)程將文件重寫,遍歷新進(jìn)程中的內(nèi)存數(shù)據(jù))。
觸發(fā)條件:Redis會記錄上次重寫時AOF的大小,默認(rèn)配置是當(dāng)AOF文件大小是上次rewrite后大小的一倍,且文件大于64M時觸發(fā),可以在配置文件中修改。
以上就是動力節(jié)點(diǎn)小編介紹的"分布式內(nèi)存數(shù)據(jù)庫之Redis的持久化",希望對大家有幫助,想了解更多可查看Java分布式應(yīng)用教程。動力節(jié)點(diǎn)在線學(xué)習(xí)教程,針對沒有任何Java基礎(chǔ)的讀者學(xué)習(xí),讓你從入門到精通,主要介紹了一些Java基礎(chǔ)的核心知識,讓同學(xué)們更好更方便的學(xué)習(xí)和了解Java編程,感興趣的同學(xué)可以關(guān)注一下。
初級 202925
初級 203221
初級 202629
初級 203743