持久化
將數(shù)據(jù)從內(nèi)存中以某種形式同步到硬盤中,使得重啟后可以根據(jù)硬盤中的記錄恢復(fù)數(shù)據(jù),這一過程就是持久化
辐棒。
Redis支持兩種方式的持久化:
-
RDB
方式:根據(jù)指定規(guī)則“定時”將內(nèi)存中的數(shù)據(jù)存儲在硬盤上寡夹; -
AOF
方式:每次執(zhí)行命令后將命令本身記錄下來。
一桨菜、RDB方式
? RDB
方式的持久化是通過快照
(snapshotting)完成的豁状,當(dāng)完成一定條件時Redis會自動將內(nèi)存中的所有數(shù)據(jù)生成一份副本并存儲在硬盤上,這個過程稱為“快照”倒得。
1.根據(jù)配置規(guī)則進(jìn)行自動快照
通過redis.conf
配置文件(/usr/local/etc/redis.conf)泻红,我們可以看到Redis為我們預(yù)置了3個條件:
save 900 1 # 在15分鐘(900秒)內(nèi)有一個或一個以上的鍵被更改則進(jìn)行快照。
save 300 10 # 在5分鐘(300秒)內(nèi)至少有10個鍵被更改則進(jìn)行快照霞掺。
save 60 10000 # 在1分鐘(60秒)內(nèi)至少有1000個鍵被更改則進(jìn)行快照谊路。
每條快照條件占一行,以SAVE
參數(shù)開頭菩彬。我們可以自定義這些參數(shù)缠劝,如果符合自動快照條件潮梯,Redis會自動執(zhí)行快照條件。
2.用戶執(zhí)行SAVE或BGSAVE命令
除了自動快照惨恭,當(dāng)服務(wù)重啟秉馏、手動遷移以及備份時,我們需要進(jìn)行手動快照操作脱羡。
1.SAVE命令
當(dāng)執(zhí)行SAVE
命令時萝究,Redis同步地進(jìn)行快照操作,在執(zhí)行快照操作中會阻塞
所有來自客戶端的請求锉罐。如果數(shù)據(jù)庫中的數(shù)據(jù)比較多時帆竹,會導(dǎo)致Redis較長時間內(nèi)無響應(yīng)。因避免在生產(chǎn)環(huán)境中使用這一命令脓规。
2.BGSAVE命令(手動時推薦)
BGSAVE
命令可以在后臺異步
執(zhí)行快照操作栽连,快照的同時仍可接受來自客戶端的請求。執(zhí)行BGSAVE
命令后Redis立即返回OK
表示開始執(zhí)行快照操作侨舆,可通過LASTSAVE
命令獲取最近一次成功執(zhí)行快照的時間秒紧。
3.執(zhí)行FLUSHALL命令
執(zhí)行FLUSHALL
命令時,Redis會清除數(shù)據(jù)庫中的所有數(shù)據(jù)态罪。但不論清楚數(shù)據(jù)庫的過程是否觸發(fā)了自動快照條件噩茄,只要自動快照條件不為空,Redis就會執(zhí)行一次快照操作复颈。
當(dāng)沒有定義自動快照條件時绩聘,執(zhí)行FLUSHALL
則不會進(jìn)行快照。
4.執(zhí)行復(fù)制時
當(dāng)設(shè)置主從模式
時耗啦,Redis會在復(fù)制初始化
時進(jìn)行自動快照凿菩。即使沒有定義自動快照條件和手動執(zhí)行快照操作,也會生成RDB
快照文件帜讲。
5.快照原理
快照的過程:
? 1)Redis使用fork函數(shù)復(fù)制一份當(dāng)前進(jìn)程(父進(jìn)程)的副本(子進(jìn)程)衅谷;
? 2)父進(jìn)程繼續(xù)接收并處理客戶端發(fā)來的命令,而子進(jìn)程開始將內(nèi)存中的數(shù)據(jù)寫入到硬盤中的臨時文件似将;
? 3)當(dāng)子進(jìn)程寫入完所有數(shù)據(jù)后會用該臨時文件替換
舊的RDB文件获黔,至此一次快照操作完成。
RDB
文件的路徑和文件名在验,可以通過配置文件redis.conf
中的dir
和dbfilename
參數(shù)來設(shè)置玷氏。
RDB
文件是經(jīng)過壓縮
(可通過配置rdbcompression參數(shù)禁用壓縮,默認(rèn)是開啟的)的二進(jìn)制格式
腋舌,所以占用的空間會小于內(nèi)存中的數(shù)據(jù)大小盏触,更加利于傳輸。
Redis啟動后會讀取RDB快照文件,將數(shù)據(jù)從硬盤載入到內(nèi)存中赞辩。通過RDB方式實(shí)現(xiàn)的持久化雌芽,若Redis出現(xiàn)異常,就會丟失最后一次快照以后更改的所有數(shù)據(jù)辨嗽。
二世落、AOF方式
AOF = Append Only File
,AOF
持久化可以降低進(jìn)程中止導(dǎo)致的數(shù)據(jù)丟失糟需;他可以將Redis執(zhí)行的每一條寫命令追加到硬盤文件中岛心。
1.開啟AOF
默認(rèn)情況下,Redis是沒有開啟AOF
的篮灼,可以通過配置文件進(jìn)行開啟:
appendonly yes
AOF文件的保存位置和RDB文件的位置相同,都是同過dir
參數(shù)設(shè)置的徘禁,默認(rèn)的文件名是appendonly.aof
,可以通過appendfilename
參數(shù)修改:
appendfilename appendonly.aof
2.AOF實(shí)現(xiàn)
當(dāng)AOF
文件的大小達(dá)到一定條件時诅诱,Redis就會自動重寫AOF
文件,這個條件可以在配置文件中設(shè)置:
auto-aof-rewrite-percentage 100 # 當(dāng)目前的AOF文件大小超過上一次重寫時的AOF文件大小的百分之多少時送朱,會再次進(jìn)行重寫娘荡,如果之前沒有重寫,則以啟動時的AOF文件大小為依據(jù)驶沼。
auto-aof-rewrite-min-size 64mb # 限制了允許重寫的最小AOF文件大小
除了自動執(zhí)行重寫外炮沐,還可以手動執(zhí)行AOF
重寫:
127.0.0.1:6379> bgrewriteaof
AOF
文件和RDB
文件的文件格式完全不同。
在啟動Redis時會逐個執(zhí)行AOF
文件中的命令來將硬盤中的數(shù)據(jù)載入到內(nèi)存中回怜,載入速度相較于RDB
會慢一些大年。
3.同步硬盤數(shù)據(jù)
在執(zhí)行AOF操作時,由于操作系統(tǒng)的緩存機(jī)制玉雾,數(shù)據(jù)并未真正地寫入硬盤翔试,而是進(jìn)入了系統(tǒng)的硬盤緩存中。默認(rèn)情況下系統(tǒng)每30秒會執(zhí)行一次同步操作复旬,以便將硬盤緩存中的數(shù)據(jù)真正寫入到硬盤中垦缅,如果在這期間出現(xiàn)異常會導(dǎo)致硬盤緩存中的數(shù)據(jù)丟失。這就需要通過設(shè)置參數(shù)要求系統(tǒng)主動將緩存內(nèi)容同步要硬盤中驹碍。
# appendfsync always # 每次執(zhí)行寫入都會執(zhí)行同步壁涎,最安全但也最慢
appendfsync everysec # 默認(rèn)采用everysec規(guī)則,每秒執(zhí)行一次同步操作志秃。
# appendfsync no # 不主動進(jìn)行同步操作怔球,而是交給操作系統(tǒng)來做(即每30秒一次),雖快但不安全
一般情況下使用默認(rèn)值everysec
就夠了洽损,性能和安全都有保障庞溜。
Redis允許同時開啟AOF
和RDB
。