您好,登錄后才能下訂單哦!
這篇文章主要講解了“redis的持久化怎么理解”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“redis的持久化怎么理解”吧!
redis的持久化:
概念:將內(nèi)存中的數(shù)據(jù)保存到磁盤,在機(jī)器宕機(jī)或重啟時(shí)可以保證數(shù)據(jù)不丟失。
說明:建議RDB和AOF同時(shí)開啟,若二者同時(shí)開啟,則redis在啟動(dòng)時(shí)優(yōu)先使用aof文件來恢復(fù)數(shù)據(jù),若讀取aof文件失敗,則讀取rdb文件來恢復(fù)數(shù)據(jù)。
RDB(Redis DataBase)
概念:
將內(nèi)存中的數(shù)據(jù)進(jìn)行快照并且存儲(chǔ)到磁盤上,即在指定目錄下生成一個(gè)dump.rdb文件。RDB是redis默認(rèn)的持久化方式。
redis啟動(dòng)后可用通過讀取rdb文件,將數(shù)據(jù)再次載入到內(nèi)存中,一般情況下1G的rdb文件載入到內(nèi)存的時(shí)間大概為20~30秒。
過程:把所有的數(shù)據(jù)都寫到一個(gè)臨時(shí)文件中,然后用這個(gè)臨時(shí)文件替換掉之前的rdb文件。
觸發(fā)機(jī)制:
手動(dòng)觸發(fā):
save命令:阻塞Redis當(dāng)前的進(jìn)程,直到RDB過程完成為止。若實(shí)例占用的內(nèi)存比較大,則會(huì)造成redis服務(wù)長時(shí)間的不可用。(不建議使用)
bgsave命令:redis當(dāng)前進(jìn)程執(zhí)行fork操作創(chuàng)建子進(jìn)程,RDB持久化過程由子進(jìn)程負(fù)責(zé),父進(jìn)程繼續(xù)接收并處理客戶端發(fā)出的請求。阻塞只發(fā)生在fork階段,一般時(shí)間很短。
注意:fork一個(gè)進(jìn)程時(shí),子進(jìn)程占用的內(nèi)存空間與父進(jìn)程相同。
自動(dòng)觸發(fā):
達(dá)到配置的條件時(shí),自動(dòng)觸發(fā)bgsave命令。
在執(zhí)行shutdown命令后會(huì)自動(dòng)觸發(fā)bgsave命令。
配置文件redis.conf:
# 設(shè)置觸發(fā)快照的條件(Will save the DB if both the given number of seconds and the given number of write operations against the DB occurred.)
# 格式:save <seconds> <changes>
save 900 1 # 900秒內(nèi),如果有1個(gè)以上(包括1個(gè))的key被修改了,則觸發(fā)快照。
save 300 10 # 300秒內(nèi),如果有10個(gè)以上(包括10個(gè))的key被修改了,則觸發(fā)快照。
save 60 10000 # 60秒內(nèi),如果有10000個(gè)以上(包括10000個(gè))的key被修改了,則觸發(fā)快照。
# RDB默認(rèn)會(huì)開啟,關(guān)閉RDB方式的持久化
save ""
# 設(shè)置rdb文件的名稱
dbfilename dump.rdb
# 設(shè)置redis的工作目錄,即rdb文件、aof文件所在的目錄
# The working directory.
# The DB will be written inside this directory, with the filename specified above using the 'dbfilename' configuration directive.
# The Append Only File will also be created inside this directory.
dir ./
# 設(shè)置rdb文件是否進(jìn)行壓縮,默認(rèn)為yes。注:壓縮rdb文件可以減少磁盤空間的占用,但是需要消耗額外的cpu。
rdbcompression yes
優(yōu)點(diǎn):適合大規(guī)模的數(shù)據(jù)恢復(fù),且數(shù)據(jù)加載的速度比較快。
缺點(diǎn):無法做到數(shù)據(jù)實(shí)時(shí)的(秒級(jí))持久化。故數(shù)據(jù)備份的完整性不高。
AOF(Append Only File)
概念:
將發(fā)送到redis服務(wù)端的每一條寫操作都存儲(chǔ)到磁盤上,即在指定目錄下生成一個(gè)appendonly.aof文件,并且將每次的寫操作追加到aof文件的末尾。
redis啟動(dòng)后通過讀取aof文件,將aof文件中的寫操作依次再執(zhí)行一遍,以此來達(dá)到數(shù)據(jù)恢復(fù)的效果。
過程:命令寫入(append)到緩存區(qū)、將緩存區(qū)的數(shù)據(jù)同步到aof文件中(sync)、重新aof文件(rewrite)
重寫aof文件:
目的:去除數(shù)據(jù)的中間執(zhí)行過程,保留最終數(shù)據(jù)的命令,可大大減小aof文件的大小,從而可以加快數(shù)據(jù)恢復(fù)的速度。
過程:redis當(dāng)前進(jìn)程執(zhí)行fork操作創(chuàng)建子進(jìn)程(開銷等同于bgsave過程),子進(jìn)程根據(jù)命令合并規(guī)則將內(nèi)存中的數(shù)據(jù)寫入到新的AOF文件中,最后用新的aof文件替換掉現(xiàn)有的aof文件。
觸發(fā)機(jī)制:
手動(dòng)觸發(fā):
BGREWRITEAOF
若aof文件格式異常,則需要修復(fù)aof文件:redis-check-aof --fix appendonly.aof
自動(dòng)觸發(fā):
達(dá)到配置的條件時(shí),自動(dòng)觸發(fā)更新aof文件 或 重新aof文件 的操作。
3)配置文件redis.conf:
# AOF和RDB可以同時(shí)存在,AOF方式的持久化擁有更好的數(shù)據(jù)完整性和一致性。
# AOF and RDB persistence can be enabled at the same time without problems.
# If the AOF is enabled on startup Redis will load the AOF, that is the file with the better durability guarantees.
# 開啟AOF (AOF默認(rèn)是關(guān)閉的appendonly no)
appendonly yes
# 設(shè)置觸發(fā)更新aof文件的條件
# appendfsync always # 同步持久化,即每次執(zhí)行寫操作后都會(huì)去更新aof文件。數(shù)據(jù)完整性好,但是性能較差。
appendfsync everysec # 每秒同步一次,是AOP默認(rèn)觸發(fā)更新日志的條件。
# appendfsync no # 不主動(dòng)同步,由操作系統(tǒng)來決定什么時(shí)候同步(一般為30s),性能最好但是持久化得不到保障,故不推薦使用該配置。
# 設(shè)置觸發(fā)重寫aof文件的條件,多個(gè)條件是"與"的關(guān)系。
# redis在重寫aof文件后會(huì)將aof文件的大小記錄下來(若沒有重寫過aof文件,則這個(gè)大小默認(rèn)是redis啟動(dòng)時(shí)aof文件的大小)
auto-aof-rewrite-percentage 100 # 當(dāng)前aof文件的大小 超過 上一次重寫后記錄的大小 的 100%。
auto-aof-rewrite-min-size 64mb # 當(dāng)前aof文件大于等于64mb。注一般不會(huì)設(shè)置的這么小,看情況設(shè)為ngb比較合理。
# 設(shè)置aof文件的名稱
# appendfilename appendonly.aof
# 設(shè)置redis的工作目錄,即rdb文件、aof文件所在的目錄
dir ./
優(yōu)點(diǎn):可以做到數(shù)據(jù)實(shí)時(shí)的(秒級(jí))持久化,故數(shù)據(jù)備份的完整性很高。
缺點(diǎn):AOF記錄的內(nèi)容多,文件會(huì)越來越大,數(shù)據(jù)恢復(fù)也會(huì)越來越慢,故redis在AOF中引入了重寫aof文件的機(jī)制。
持久化給redis帶來的開銷:
概念:子進(jìn)程在重寫RDB文件和重寫AOF文件時(shí)會(huì)消耗cpu、內(nèi)存、硬盤等資源。
cpu:子進(jìn)程負(fù)責(zé)把進(jìn)程內(nèi)的數(shù)據(jù)分批寫入文件,這個(gè)過程屬于CPU密集操作,通常子進(jìn)程對(duì)單核CPU利用率接近90%。
內(nèi)存:父進(jìn)程fork子進(jìn)程時(shí),子進(jìn)程默認(rèn)占用的內(nèi)存同父進(jìn)程一樣。我們可以修改Linux內(nèi)存分配的配置,避免物理內(nèi)存不足導(dǎo)致fork進(jìn)程失敗。
硬盤:往rdb文件或aof文件中寫數(shù)據(jù)的過程中,磁盤io的壓力比較大。
說明:開啟AOF的Redis在高流量寫入時(shí),如果使用普通機(jī)械磁盤,寫入吞吐一般在100MB/s左右,這時(shí)Redis實(shí)例的瓶頸主要在AOF同步硬盤上。
注意:redis實(shí)例不應(yīng)該和其它對(duì)cpu、內(nèi)存、硬盤敏感的服務(wù)混部。
感謝各位的閱讀,以上就是“redis的持久化怎么理解”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對(duì)redis的持久化怎么理解這一問題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。