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