大家都知道,Redis之所以性能好,讀寫快,是因為Redis是一個內(nèi)存數(shù)據(jù)庫,它的操作都幾乎基于內(nèi)存。但是內(nèi)存型數(shù)據(jù)庫有一個很大的弊端,就是當數(shù)據(jù)庫進程崩潰或系統(tǒng)重啟的時候,如果內(nèi)存數(shù)據(jù)不保存的話,里面的數(shù)據(jù)就會丟失不見了。這樣的數(shù)據(jù)庫并不是一個可靠的數(shù)據(jù)庫。
站在用戶的角度思考問題,與客戶深入溝通,找到大名網(wǎng)站設(shè)計與大名網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗,讓設(shè)計與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個性化、用戶體驗好的作品,建站類型包括:網(wǎng)站制作、網(wǎng)站設(shè)計、企業(yè)官網(wǎng)、英文網(wǎng)站、手機端網(wǎng)站、網(wǎng)站推廣、主機域名、虛擬主機、企業(yè)郵箱。業(yè)務覆蓋大名地區(qū)。所以數(shù)據(jù)的持久化是內(nèi)存型數(shù)據(jù)庫的重中之重。它不僅提供數(shù)據(jù)保存硬盤的功能,還可以借此用硬盤容量擴展數(shù)據(jù)存儲空間,使得Redis的可以存儲超過機器本身內(nèi)存大小的數(shù)據(jù)。
Redis對于數(shù)據(jù)持久化提供了兩種持久化的方案,RDB與AOF。它們的原理和使用場景都大不相同,下面我們來詳細地了解下。
RDB,提供一個某個時間點的數(shù)據(jù)的Snapshot,保存在RDB文件中。它可以通過SAVE/BGSAVE
命令手動執(zhí)行,把數(shù)據(jù)Snapshot寫到RDB文件,也可以通過配置,定時執(zhí)行。
Redis也可以通過加載RDB文件,把數(shù)據(jù)從磁盤加載讀取到Redis中。
連上Redis,設(shè)值一些值,然后執(zhí)行SAVE
命令。
然后可以查看下redis.conf的持久化工作目錄。進入目錄可以看到保存了一個dump.rdb文件。該文件是一個二進制文件,無法直接正常打開。
至于SAVE/BGSAVE
的區(qū)別,就是前置是阻塞執(zhí)行,此時服務不會接受請求,后者是Fork一個子進程出來,由該進程去執(zhí)行保存RDB文件的操作,不影響用戶請求。
P.S. Redis是單進程的,所以BGSAVE
只能Fork一個子進程,而不是創(chuàng)建一個線程處理。
以上是手動執(zhí)行的過程。但在生產(chǎn)我們很少會手動登上服務去執(zhí)行操作,所以更多的時候是依賴Redis的配置,定時保存RDB文件。
打開redis.conf
配置文件,找到SNAPSHOTTING的配置,Save Point的設(shè)置。
圖中的配置意思是,當至少有一個key變更時,900秒后會執(zhí)行一次SAVE。其他配置同理,有10次變更,300秒后保存一次.....
在Redis中,這個自動保存RDB的功能是默認開啟的。
先kill掉Redis進程,再重新啟動Redis Server,會發(fā)現(xiàn)日志會有這樣的一行,
并且Redis中,依然有之前設(shè)置的三個值。說明Redis在啟動的時候,會加載數(shù)據(jù)初始化。
不過,這里加載的初始化數(shù)據(jù)不一定是RDB的。如果Redis開啟了AOF,會優(yōu)先從AOF初始化數(shù)據(jù),否則才會加載RDB的數(shù)據(jù)。
優(yōu)點:
缺點:
Redis的另外一種持久化方案就是AOF,Append Only File。AOF相當于一個操作的日志記錄,每次對于數(shù)據(jù)的變更都會記錄追加到AOF日志。當服務啟動的時候就會讀這些操作日志,重新執(zhí)行一次操作,從而恢復原始數(shù)據(jù)。
AOF默認是關(guān)閉的。打開redis.conf配置文件,找到appendonly no
改成appendonly yes
。
AOF和RDB是可以共存的,只要保存的文件名不沖突。
配置文件往下拉,看到fsync
的配置。
fsync()是一個系統(tǒng)調(diào)用函數(shù),告訴操作系統(tǒng)把數(shù)據(jù)寫到硬盤上,而不是緩存更多數(shù)據(jù)才寫到硬盤。這樣的調(diào)用可以及時保存數(shù)據(jù)到硬盤上。
Redis提供了三種fsync的調(diào)用方式
開啟AOF后,會再工作目錄看到appendonly.aof
文件。
在客戶端上執(zhí)行一些命令后,打開AOF文件,可以觀察到有對應的操作的記錄日志。
文件解析說明:
set a 1
是三個參數(shù),所以是*3set
這個參數(shù)是三字節(jié),所以是$3,key值a是一個字節(jié),所以是$1set
,a
,1
就是具體的數(shù)據(jù)AOF雖然比RDB更可靠,但缺點也是比較明顯的,就是每次寫操作都要把操作日志寫到文件上,這樣會導致文件非常冗余。
假若你要自增一個計數(shù)器100次,如果不重寫,AOF文件就就會有這100次的自增記錄,如INCR a
。如果執(zhí)行了日志重寫,那么文件只會保留set a 100
而不是100條INCR a
。這樣擁有相同的結(jié)果,但可以大大減少AOF的文件大小,并且可以讓AOF載入的時候提升載入的效率。
看回redis.conf
配置,有兩項控制rewrite的選項。
來實驗一下重寫的結(jié)果,我們先設(shè)定一個a值,然后自增多次,查看AOF文件內(nèi)容。里面有很多INCR的語句記錄
然后我們手動執(zhí)行下BGREWRITEOF
,執(zhí)行日志重寫。
可以看到,多個incr語句,變成了一個set a 6
語句,減少了5個incr a
語句的操作日志。
優(yōu)點:
缺點
以上已經(jīng)基本了解過RDB和AOF的使用、基本原理以及對應的優(yōu)缺點。那么在實際當中,我們到底怎么去選擇用哪種持久化方式呢?
一般來說,不考慮硬盤大小,最安全的做法是RDB與AOF同時使用,即使AOF損壞無法修復,還可以用RDB來恢復數(shù)據(jù)。
如果Redis的數(shù)據(jù)在你的服務中并不是必要的數(shù)據(jù),例如只是當簡單的緩存,沒有緩存也不會造成緩存雪崩。說明數(shù)據(jù)的安全可靠性并不是首要考慮范圍內(nèi),那么單獨只使用RDB就可以了。
不推薦單獨使用AOF,因為AOF對于數(shù)據(jù)的恢復載入來說,比RDB慢。并且Redis官方也說明了,AOF有一個罕見的bug。出了問題無法很好的解決。所以使用AOF的時候,最好還是有RDB作為數(shù)據(jù)備份。
根據(jù)官方的意愿描述,在未來可能會有一種RDB與AOF相結(jié)合的持久化模型。到時Redis持久化就不再如此麻煩費勁了,我們拭目以待吧。
更多技術(shù)文章、精彩干貨,請關(guān)注
博客:zackku.com
微信公眾號:Zack說碼
另外有需要云服務器可以了解下創(chuàng)新互聯(lián)cdcxhl.cn,海內(nèi)外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。