Redis學(xué)習(xí)之持久化
前言
在前面我們學(xué)習(xí)了Redis的基本操作防泵,也學(xué)習(xí)了Redis的Java客戶端Jedis的使用窟勃,接下來我們來學(xué)習(xí)Redis的持久化春霍。
在前面的學(xué)習(xí)中斗搞,我們知道Redis是基于內(nèi)存的鍵值對數(shù)據(jù)庫指攒,眾所周知,基于內(nèi)存的數(shù)據(jù)會在內(nèi)存斷電之后丟失僻焚,所以允悦,如果Redis中沒有持久化機(jī)制,那么虑啤,當(dāng)Redis服務(wù)器重啟之后隙弛,存儲的數(shù)據(jù)就丟失了,這顯示是不能接受的狞山,所幸全闷,Redis有持久化機(jī)制,本小節(jié)我們就來學(xué)習(xí)這部分的內(nèi)容萍启。
持久化
Redis支持兩種不同的持久化方式室埋,RDB以及AOF,RDB會定時將內(nèi)存中的數(shù)據(jù)存儲在硬盤上伊约,而AOF則是每次將命令記錄下來姚淆,Redis中這兩種方式可以單獨使用,也可以混合使用屡律。
RDB方式
RDB持久化是通過快照的方式完成的腌逢,當(dāng)符合一定條件時,Redis會自動將內(nèi)存中的所有數(shù)據(jù)生成一份副本并存儲在硬盤上
觸發(fā)條件
- 根據(jù)配置規(guī)則進(jìn)行自動快照
- 用戶執(zhí)行save或者bgsave命令
- 執(zhí)行flushall命令
- 執(zhí)行復(fù)制時
配置規(guī)則
配置規(guī)則配置在Redis的配置文件中超埋,save命令后面跟一個時間窗口大小以及該時間內(nèi)被修改的鍵的個數(shù)搏讶,舉例如下
save 900 1 # 900秒內(nèi)至少一個鍵被修改
save 300 10 # 300秒內(nèi)至少十個鍵被修改
save 60 10000 # 60秒內(nèi)至少10000個鍵被修改
多個規(guī)則之間是或的關(guān)系佳鳖,也就是只要其中一個條件滿足,則觸發(fā)RDB持久化
save/bgsave命令
save命令是前臺操作媒惕,命令執(zhí)行后Redis會阻塞所有的客戶端請求系吩,在生產(chǎn)環(huán)境中不建議使用
bgsave執(zhí)行之后,Redis會在后臺執(zhí)行快照操作(異步)妒蔚,快照的同時服務(wù)器可以繼續(xù)響應(yīng)客戶端請求
flushall命令
執(zhí)行flushall時穿挨,Redis會清除數(shù)據(jù)庫中所有數(shù)據(jù),無論清空數(shù)據(jù)庫的過程是否滿足觸發(fā)條件肴盏,只要自動快照條件不為空科盛,則會進(jìn)行快照操作
快照原理
Redis默認(rèn)將快照文件存儲在當(dāng)前進(jìn)程工作目錄下的dump.rdb
文件中,可以通過配置dbfilename FILENAME
來指定文件的名稱菜皂,通過dir PATH
來指定工作的目錄
快照過程
- Reids使用fork系統(tǒng)調(diào)用產(chǎn)生子進(jìn)程
- 父進(jìn)程繼續(xù)處理請求贞绵,子進(jìn)程開始將內(nèi)存中的數(shù)據(jù)寫入臨時文件
- 當(dāng)子進(jìn)程完成所有數(shù)據(jù)的寫入操作后,將該臨時文件替換舊的RDB文件恍飘,完成快照操作
由于fork操作采用的是寫時復(fù)制策略榨崩,所以,如果父進(jìn)程沒有進(jìn)行操作章母,子進(jìn)程與父進(jìn)程共享同份內(nèi)存母蛛,如果父進(jìn)程發(fā)生寫入操作,則子進(jìn)程會復(fù)制一份父進(jìn)程的內(nèi)存空間胳施,所以溯祸,快照的內(nèi)容其實只是fork時刻的內(nèi)存,而不是實時的數(shù)據(jù)舞肆。
RDB文件是經(jīng)過壓縮的焦辅,可以通過配置rdbcompression yes/no
來決定是否啟動壓縮功能,啟動壓縮功能會消耗多一點CPU資源椿胯,但減少文件的大小筷登。
Redis啟動后會自動讀取RDB文件,并將數(shù)據(jù)從硬盤載入到內(nèi)存中哩盲。
AOF方式
AOF是將每條命令追加到硬盤中前方,可以通過appendonly yes/no
來啟用,通過appendfilename FILENAME
來設(shè)置AOF文件的名稱廉油,存儲位置也是dir
指定的目錄之下惠险。
默認(rèn)情況下AOF會記錄所有的操作,當(dāng)命令重復(fù)比較大的情況下抒线,會比較消耗空間班巩,所以,Redis提供了重寫AOF的功能嘶炭,可以通過auto-aof-rewrite-percentage PERCENT
抱慌、auto-aof-rewrite-min-size SIZE
來配置自動重寫的觸發(fā)條件
auto-aof-rewrite-percentage
表示當(dāng)前的AOF文件的大小超過上一次重寫時AOF文件大小的百分比時會自動重寫逊桦,如果之前沒有重寫過,則以啟動時的AOF文件大小為基準(zhǔn)抑进。
auto-aof-rewrite-min-size
表示允許重寫的最小AOF文件大小
可以通過bgrewriteaof
來手動觸發(fā)重寫
由于OS本身會對寫入磁盤的數(shù)據(jù)做緩存强经,所以雖然AOF是將每條命令寫入到磁盤中,但是實際上并不會實時刷新到硬盤中寺渗,所以匿情,如果需要實時寫入,需要配置如下內(nèi)容
#appendfsync always #每次寫入户秤,會對性能有影響
appendfsync everysec # 每秒寫入
# appendfsync no # 由OS來決定寫入時間
如果同時開啟AOF和RDB码秉,Redis會在重啟之后使用AOF來恢復(fù)數(shù)據(jù)逮矛,畢竟AOF丟失的數(shù)據(jù)量比較少
總結(jié)
本小節(jié)我們主要學(xué)習(xí)了Redis的兩種持久化方式鸡号,RDB和AOF,RDB是根據(jù)觸發(fā)條件對內(nèi)存的數(shù)據(jù)執(zhí)行一次快照操作须鼎,AOF則是將每次操作的命令記錄下來鲸伴。兩種方式中,Redis默認(rèn)啟用的是RDB方式晋控,AOF則需要我們手動開啟汞窗,相比于RDB,AOF能保存的數(shù)據(jù)更加完整赡译,所以如果兩者都啟用仲吏,Redis重啟的時候,以AOF為基準(zhǔn)進(jìn)行數(shù)據(jù)的恢復(fù)蝌焚。