Redis是出了名的速度快,那是由於在內存中進行數據存儲和操做;若是僅僅是在內存中進行數據存儲,那就會致使如下問題:linux
對於Redis持久化在工做中和麪試過程當中是一個很重要的技術點,必用必考,接下來詳細說說Redis持久化;面試
Redis針對數據持久化有兩種方案,以下:redis
兩種方式均可以經過配置文件輕鬆搞定,來,我們先從RDB開始;算法
fork:後續會頻繁提到,簡單解釋一下,fork的做用是複製一個與當前進程同樣的子進程,該子進程的全部數據都和原進程一致。數據庫
理論放到後面再說,先來看看實際操做,再來作總結;上次對配置文件簡單進行說明,此次就直接找到快照那配置就行啦,先看看默認配置:windows
經過 save <seconds> <changes>
進行條件配置,若是觸發條件就自動進行RDB持久化操做。默認配置中包含如下三種條件,知足其中一個就自動保存數據到磁盤:緩存
save 900 1
:900秒內(15分鐘)至少有1個key的值進行修改;save 300 10
:300秒內(五分鐘)至少有10個key的值進行修改;save 60 10000
:900秒內(1分鐘)至少有10000個key的值進行修改;爲了測試時間方便,將其中一個條件改成1分鐘內有3個key的值修改了就進行持久化到磁盤,以下:安全
先將原有的dump.rdb文件刪除掉,避免影響測試效果;服務器
修改配置文件以下:併發
用修改以後,指定該配置文件重啓redis-server,而後開始測試;
嘗試打開dump.rdb看看,咋一看是看不懂,但實際上是有對應關係的,這裏就不深究了
Redis強大吧,不知不覺的就把數據備份,主要是還不影響正常操做,上圖中第四步中就有體現,主進程fork了子進程進行備份,主進程不參與備份持久化操做。既然備份文件有了,如何進行恢復數據呢? redis-server在啓動的時候自動將當前目錄中的備份文件(dump.rdb)數據加載到內存中;以下圖所示:
那爲何是dump.rdb文件?,爲何又是當前目錄?,若是rdb備份文件寫入失敗了怎麼辦?這些經過配置文件中SNAPSHOTTING部分都有詳細的說明,並提供相關配置項進行設置,以下:
上面說到自動觸發備份,其實在實際應用場景中,有些需求很急,若是要求等到知足條件備份完成以後才處理問題,間隔時間短還好點,若是間隔時間超過5分鐘,估計等待處理問題的人要上房揭瓦啦;Redis一樣爲你們考慮到了,提供手動備份的方式,以下:
簡單測試一下,刪除dump.rdb文件,將配置文件恢復到默認值,而後指定配置文件重啓redis-server,以下:
能夠經過配置文件的形式配置,也能夠經過命令的形式進行關閉,但經過命令的方式,服務器重啓以後就失效了,因此通常建議經過配置文件進行配置;
save ""
便可,重啓redis-server;config set save ""
便可,但redis-server重啓時就恢復默認值了;簡要說明:
當觸發bgsave持久化時(知足配置條件或手動執行bgsave命令),主進程fork一個子進程進行持久化操做,主進程不參與任何持久化IO操做;
爲了避免影響原有rdb文件的使用,子進程會將快照數據先寫入到臨時文件;
當快照數據徹底備份到臨時文件時,就替換掉原有的rdb文件,從而獲得最新數據的rdb文件;
注:當執行sava命令的時候,會致使阻塞,只有等快照數據持久化完成以後,才能作其餘事情;
每一項技術在解決已有問題的時候,確定也會帶來新問題,RDB用來解決持久化問題,那它有什麼優缺點呢?
優勢
RDB保存的數據文件比較緊湊,對比AOF來講,相同數據的文件大小比較小;
大量數據持久化時速度相對AOF比較快;
RDB中bgsave模式對主進程影響比較小,只有在主進程fork子進程的時候耗費資源,但影響不大;自動備份後臺用的就是bgsave模式;
缺點
既然已經有了RDB持久化了,那爲何還得出一個AOF呢?從RDB的缺點來看,很大程度上是由於可能會丟失最後一次備份以前的數據,對於一些重要數據來講,是不能接受的。而AOF的出現,將數據丟失風險極大的下降。先不說那麼多,實操一把再慢慢聊。
AOF默認狀況是沒開啓的,打開配置文件,爲了避免讓RDB備份影響,這裏暫時先將RDB備份禁用掉,以下:
開啓AOF備份:根據上一篇文章提到的,先找到APPEND ONLY MODE配置塊,將AOF備份開啓appendonly yes
配置好了,指定配置文件重啓redis-server,先來看看效果:
當一啓動redis-server的時候,appendonly.aof文件就已經生成了;來,我們接着敲點命令,以下↓↓↓
嘗試打開appendonly.aof文件看看,和dump.rdp文件有什麼不一樣;
appendonly.aof只記錄寫命令,讀命令不記錄,並且記錄方式是以追加的方式,因此速度相對比較快;
同RDB同樣,在redis-server重啓時,自動加載AOF文件命令依次執行,最終將數據進行恢復;
這就是Redis的強大,針對每個功能均可以經過配置項進行完成,使用很是方便;
當執行的寫命令過多時,就會致使AOF文件過分增大,而對於一些重複性的命令存在AOF文件中是沒有必要的,以下圖所示:
上圖中屢次對a1這個Key進行屢次寫入,最終的值爲10,可見若是AOF文件中只記錄一條最終值的寫命令豈不是最好,從而減小AOF文件的大小;這裏文件大小確定達不到自動觸發重寫的條件,這裏就手動觸發,而後再看看AOF文件內容,是否進行了優化,以下:
如上圖可見,重寫以後的AOF文件的確是咱們本身想要,是否是以爲Redis更加牛X了;觸發重寫有如下兩種方式:
簡要說明:
對於AOF文件內容的合法性怎麼解決呢,有可能因爲忽然事件,好比宕機,致使AOF文件寫入不完整;也有可能有人惡意添加不規範數據,redis會怎麼處理呢?這裏就模擬手動修改AOF文件,以下:
根據提示,使用redis-check-aof --fix <filename>
進行修復,以下:
啓動圖就不截了,小夥伴們試試去;還有redis也能對rdb文件修復,文中沒有體現,但小夥伴記得去嘗試一下,用redis-check-rdb這個工具便可,在windows版本中redis沒有提供此工具,去linux用高點的版本實操一把。
AOF的出現,是解決了RDB丟失最後一次沒保存的數據,極大的下降了數據丟失的風險,但其也帶來相關問題;
優勢
缺點
在redis4.0以後,提供了混合持久化配置開啓功能; 混合持久化就是結合RDB和AOF各自優勢進行整合的持久化方案,從而解決使用AOF恢復數據較慢的問題;
原理就是在AOF文件的前半段加入RDB快照數據,後面纔是增量數據的命令記錄;在配置文件中進行配置便可:aof-use-rdb-preamble yes
,高版本redis都默認開啓這種混合持久化模式;
優勢:解決了單純AOF恢復數據較慢的問題;
缺點:不能兼容低版本redis場景;
若是需求對數據完整性要求不是很高,能夠接受短期數據丟失,RDB快照持久化方式是最好不過的選擇;
若是對數據完整性要求比較嚴格,使用AOF日誌形式進行持久化比較合適;
若是redis版本在4.0以上,可使用混合持久化的方式,下降純AOF文件的恢復數據的時間;
若是僅僅是緩存,緩存數據也不重要,併發也不是很高,能夠不用開啓持久化;
注: 若是不是使用混合持久化,而是將RDB和AOF同時開啓,redis-server恢復數據的時候會優先使用AOF文件進行數據恢復,由於AOF文件相對比較完整;
暫時就到這吧,後續遇到相關問題再來記錄分享;這個知識點比較重要,因此小夥伴們必定要本身嘗試一下哦;使用真的很簡單,進行簡單的配置就完事了,若是能知道其簡單的原理,遇到問題就沒那麼苦惱;下次咱們來聊redis的主從複製;
一個被程序搞醜的帥小夥,關注"Code綜藝圈",跟我一塊兒學~~~