日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

redis(7)、redis持久化

發(fā)布時(shí)間:2025/4/5 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 redis(7)、redis持久化 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

2019獨(dú)角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>

redis持久化,顧名思義,就是把內(nèi)存中的數(shù)據(jù)保存到硬盤(pán)上,以防redis發(fā)生意外造成數(shù)據(jù)丟失。

目前有兩種方案,RDB方式和AOF方式。前者會(huì)根據(jù)配置的規(guī)則定時(shí)將內(nèi)存中的數(shù)據(jù)持久化到硬盤(pán)上,后者則是在每次執(zhí)行寫(xiě)命令之后將命令記錄下來(lái)。兩種持久化方式可以單獨(dú)使用,但是通常會(huì)將兩者結(jié)合使用。按照redis作者的想法,這兩個(gè)方案最終會(huì)在以后的版本中合成一個(gè)。

?

一、快照 RDB

(1)、介紹

redis 持久化的RDB文件是經(jīng)過(guò)壓縮的二進(jìn)制文件,保存了內(nèi)存中的鍵值對(duì)數(shù)據(jù),存在硬盤(pán)里,防止redis數(shù)據(jù)庫(kù)出現(xiàn)故障時(shí)數(shù)據(jù)丟失。

當(dāng)redis數(shù)據(jù)庫(kù)出現(xiàn)故障時(shí),可以使用RDB文件進(jìn)行還原為原先的數(shù)據(jù)庫(kù)狀態(tài)。

在實(shí)際運(yùn)用中,一定要設(shè)置好規(guī)則進(jìn)行定期的備份redis服務(wù)器數(shù)據(jù),保存在其他異地服務(wù)器,一旦redis數(shù)據(jù)庫(kù)出現(xiàn)問(wèn)題,想還原為原先的時(shí)間點(diǎn),就可以使用備份RDB文件進(jìn)行還原。

如果RDB文件有問(wèn)題,還可以使用redis數(shù)據(jù)庫(kù)自帶的工具redis-check-dump進(jìn)行檢測(cè)。

?

(2)、怎樣使用

有兩個(gè)命令可以生成RDB文件,SAVE、BGSAVE。

a)、SAVE命令會(huì)阻塞服務(wù)器進(jìn)程,是在主進(jìn)程中創(chuàng)建RDB文件,會(huì)阻塞其他的客戶端請(qǐng)求。

b)、BGSAVE命令會(huì)在主進(jìn)程fork出的一個(gè)子進(jìn)程創(chuàng)建RDB文件,不會(huì)阻塞客戶端請(qǐng)求。

c)以上兩個(gè)指令是在redis-cli客戶端直接執(zhí)行命令時(shí)保存RDB文件,還可以設(shè)置SAVE命令配置,redis進(jìn)行自動(dòng)保存RDB文件。

save 60 100 #60秒內(nèi)有100次修改,redis就會(huì)自動(dòng)保存RDB文件 save 300 10 #300秒內(nèi)有10次修改,redis就會(huì)自動(dòng)保存RDB文件 ....

可以設(shè)置多個(gè)命令,只要觸發(fā)一個(gè)save命令條件就會(huì)自動(dòng)保存RDB文件。

這里設(shè)置的SAVE命令,redis其實(shí)內(nèi)部是調(diào)用BGSAVE命令進(jìn)行子進(jìn)程創(chuàng)建RDB文件,確保redis主進(jìn)程不會(huì)受到阻塞,可以繼續(xù)處理客戶端的讀寫(xiě)請(qǐng)求。

?

在實(shí)際運(yùn)用時(shí),要根據(jù)場(chǎng)景來(lái)設(shè)定,但是一定要設(shè)置。

a)、如果本身redis數(shù)據(jù)庫(kù)讀大于寫(xiě),則設(shè)置的保存時(shí)間長(zhǎng)久一些,不妨設(shè)置為一個(gè)小時(shí)才觸發(fā)一次創(chuàng)建RDB。

b)、如果redis數(shù)據(jù)庫(kù)寫(xiě)比較多,而且數(shù)據(jù)比較敏感,可以設(shè)置時(shí)間短暫一些,5分鐘或者2分鐘就保存一次。

c)、數(shù)據(jù)本身比較敏感,需要進(jìn)行主從備份,而主從備份依賴原理就是主redis數(shù)據(jù)庫(kù)保存RDB時(shí),才會(huì)觸發(fā)同步從redis數(shù)據(jù)庫(kù),這時(shí)也響應(yīng)的設(shè)置時(shí)間短暫一些。

?

? (3)、原理

?僅針對(duì)配置save命令時(shí),redis數(shù)據(jù)庫(kù)自動(dòng)觸發(fā)創(chuàng)建RDB文件,而在redis-cli中手動(dòng)執(zhí)行save ,bgsave命令,內(nèi)部原理也是相同的。

1、客戶端發(fā)起寫(xiě)請(qǐng)求

2、redis會(huì)記錄寫(xiě)命令計(jì)數(shù)器,并且保存一個(gè)最后保存RDB的時(shí)間

3、當(dāng)redis周期性循環(huán)時(shí),觸發(fā)設(shè)置的一個(gè)SAVE命令,redis會(huì)讀取寫(xiě)命令計(jì)數(shù)器,最后保存時(shí)間

4、達(dá)到了保存RDB文件的條件,redis會(huì)fork一個(gè)子進(jìn)程,其實(shí)開(kāi)始執(zhí)行BGSAVE命令流程

5、掃描redis數(shù)據(jù)庫(kù)的所有數(shù)據(jù),保存到一個(gè)隨機(jī)的RDB文件

6、修改舊的RDB文件名

7、把新的隨機(jī)的RDB文件命名為正常的RDB文件即dump.rdb,并且刪除掉原先舊的RDB文件。

?如下圖所示:

?

注意事項(xiàng):在執(zhí)行fork是時(shí)候操作系統(tǒng)(類Unix操作系統(tǒng))會(huì)使用寫(xiě)時(shí)復(fù)制(copy-on-write)策略,即fork函數(shù)發(fā)生的一刻,父進(jìn)程和子進(jìn)程共享同一塊內(nèi)存數(shù)據(jù),當(dāng)父進(jìn)程需要修改其中的某片數(shù)據(jù)(如執(zhí)行寫(xiě)命令)時(shí),操作系統(tǒng)會(huì)將該片數(shù)據(jù)復(fù)制一份以保證子進(jìn)程不受影響,所以RDB文件存儲(chǔ)的是執(zhí)行fork操作那一刻的內(nèi)存數(shù)據(jù)。所以RDB方式理論上是會(huì)存在丟數(shù)據(jù)的情況的(fork之后修改的的那些沒(méi)有寫(xiě)進(jìn)RDB文件)。

?

(4)、優(yōu)點(diǎn)

a)、RDB是一種表示某個(gè)即時(shí)點(diǎn)的Redis數(shù)據(jù)的緊湊文件。RDB文件適合用于備份。例如,你可能想要每小時(shí)歸檔最近24小時(shí)的RDB文件,每天保存近30天的RDB快照。這允許你很容易的恢復(fù)不同版本的數(shù)據(jù)集以 ? ? ?容災(zāi)。

b)、RDB非常適合于災(zāi)難恢復(fù),作為一個(gè)緊湊的單一文件,可以被傳輸?shù)竭h(yuǎn)程的數(shù)據(jù)中心。
c)、RDB最大化了Redis的性能,因?yàn)镽edis父進(jìn)程持久化時(shí)唯一需要做的是啟動(dòng)(fork)一個(gè)子進(jìn)程,由子進(jìn)程完成所有剩余工作。父進(jìn)程實(shí)例不需要執(zhí)行像磁盤(pán)IO這樣的操作。
d)、RDB在重啟保存了大數(shù)據(jù)集的實(shí)例時(shí)比AOF要快。

? (5)、缺點(diǎn)

?a)、當(dāng)你需要在Redis停止工作(例如停電)時(shí)最小化數(shù)據(jù)丟失,RDB可能不太好。你可以配置不同的保存點(diǎn)(save point)來(lái)保存RDB文件(例如,至少5分鐘和對(duì)數(shù)據(jù)集100次寫(xiě)之后,但是你可以有多個(gè)保存點(diǎn))。然而,你通常每隔5分鐘或更久創(chuàng)建一個(gè)RDB快照,所以一旦Redis因?yàn)槿魏卧驔](méi)有正確關(guān)閉而停止工作,你就得做好最近幾分鐘數(shù)據(jù)丟失的準(zhǔn)備了。?

b)、RDB需要經(jīng)常調(diào)用fork()子進(jìn)程來(lái)持久化到磁盤(pán)。如果數(shù)據(jù)集很大的話,fork()比較耗時(shí),結(jié)果就是,當(dāng)數(shù)據(jù)集非常大并且CPU性能不夠強(qiáng)大的話,Redis會(huì)停止服務(wù)客戶端幾毫秒甚至一秒。AOF也需要fork(),但是你可以調(diào)整多久頻率重寫(xiě)日志而不會(huì)有損(trade-off)持久性(durability)。?

?

?

二、追加日志文件AOF

(1)、介紹

redis除了提供RDB持久化功能,還提供了AOF(append only file)持久化功能。與RDB持久化通過(guò)保存redis數(shù)據(jù)庫(kù)的鍵值對(duì)不同,AOF持久化是通過(guò)保存redis服務(wù)器所執(zhí)行的寫(xiě)命令來(lái)記錄數(shù)據(jù)庫(kù)狀態(tài)的。

當(dāng)開(kāi)啟了AO

F持久化功能時(shí),服務(wù)器會(huì)優(yōu)先從AOF文件中還原數(shù)據(jù);如果沒(méi)有開(kāi)啟AOF時(shí),才會(huì)從RDB中還原

數(shù)據(jù)。如果AOF文件出錯(cuò)了,Redis自帶的redis-check-aof工具來(lái)修復(fù)原文件。

? (2)、怎樣使用

a)、首先在配置文件中開(kāi)啟AOF

appendonly yes

b)、配置AOF策略,有三種策略

appendfsync no 當(dāng)設(shè)置appendfsync為no的時(shí)候,Redis不會(huì)主動(dòng)調(diào)用fsync去將AOF日志內(nèi)容同步到磁盤(pán),所以這一切就完全依賴于操作系統(tǒng)的調(diào)試了。對(duì)大多數(shù)Linux操作系統(tǒng),是每30秒進(jìn)行一次fsync,將緩沖區(qū)中的數(shù)據(jù)寫(xiě)到磁盤(pán)上。 appendfsync everysec 當(dāng)設(shè)置appendfsync為everysec的時(shí)候,Redis會(huì)默認(rèn)每隔一秒進(jìn)行一次fsync調(diào)用,將緩沖區(qū)中的數(shù)據(jù)寫(xiě)到磁盤(pán)。但是當(dāng)這一次的fsync調(diào)用時(shí)長(zhǎng)超過(guò)1秒時(shí)。Redis會(huì)采取延遲fsync的策略,再等一秒鐘。也就是在兩秒后再進(jìn)行fsync,這一次的fsync就不管會(huì)執(zhí)行多長(zhǎng)時(shí)間都會(huì)進(jìn)行。這時(shí)候由于在fsync時(shí)文件描述符會(huì)被阻塞,所以當(dāng)前的寫(xiě)操作就會(huì)阻塞。 所以,結(jié)論就是,在絕大多數(shù)情況下,Redis會(huì)每隔一秒進(jìn)行一次fsync。在最壞的情況下,兩秒鐘會(huì)進(jìn)行一次fsync操作。 這一操作在大多數(shù)數(shù)據(jù)庫(kù)系統(tǒng)中被稱為group commit,就是組合多次寫(xiě)操作的數(shù)據(jù),一次性將日志寫(xiě)到磁盤(pán)。 appednfsync always 當(dāng)設(shè)置appendfsync為always時(shí),每一次寫(xiě)操作都會(huì)調(diào)用一次fsync,這時(shí)數(shù)據(jù)是最安全的,當(dāng)然,由于每次都會(huì)執(zhí)行fsync,所以其性能也會(huì)受到影響。

?(3)、原理

1、客戶端進(jìn)行寫(xiě)請(qǐng)求

2、redis服務(wù)器收到寫(xiě)請(qǐng)求,放入到redis服務(wù)器內(nèi)存AOF緩沖區(qū)中

3、redis周期性循環(huán)中,觸發(fā)寫(xiě)日志策略,去AOF寫(xiě)命令緩沖區(qū)讀取數(shù)據(jù)

4、如果是appednfsync always,會(huì)在主進(jìn)程中進(jìn)行重寫(xiě)日志,會(huì)阻塞其他的請(qǐng)求。如果是appendfsync everysec,會(huì)fork一個(gè)子進(jìn)程進(jìn)行重寫(xiě)日志。如果是appendfsync?no,則依賴操作系統(tǒng)進(jìn)行寫(xiě)日志,大部分linux操作系統(tǒng)默認(rèn)是30秒一次。

5、服務(wù)端調(diào)用write(2)?這個(gè)系統(tǒng)調(diào)用,將數(shù)據(jù)往系統(tǒng)緩沖區(qū)上寫(xiě)。如果保存AOF過(guò)程到這一步時(shí),redis數(shù)據(jù)庫(kù)出現(xiàn)故障,日志依然會(huì)正確的保存下去。下面的流程就由操作系統(tǒng)來(lái)完成了。

6、操作系統(tǒng)將緩沖區(qū)中的數(shù)據(jù)轉(zhuǎn)移到磁盤(pán)控制器上

7、磁盤(pán)控制器將數(shù)據(jù)寫(xiě)到磁盤(pán)的物理介質(zhì)中(數(shù)據(jù)真正落到磁盤(pán)上)。只有完成這一步時(shí),機(jī)器發(fā)生故障,比如斷電,才能保證日志正確保存。

如下圖所示:

?

?

?但是這里有個(gè)問(wèn)題,當(dāng)寫(xiě)命令越來(lái)越多,AOF文件會(huì)越來(lái)越大,所以Redis又提供了一個(gè)功能,叫做AOF rewrite。其功能就是重新生成一份AOF文件,新的AOF文件中一條記錄的操作只會(huì)有一次,而不像一份老文件那樣,可能記錄了對(duì)同一個(gè)值的多次操作。其生成過(guò)程和RDB類似,也是fork一個(gè)進(jìn)程,直接遍歷數(shù)據(jù),寫(xiě)入新的AOF臨時(shí)文件。在寫(xiě)入新文件的過(guò)程中,所有的寫(xiě)操作日志還是會(huì)寫(xiě)到原來(lái)老的AOF文件中,同時(shí)還會(huì)記錄在內(nèi)存緩沖區(qū)中。當(dāng)重完操作完成后,會(huì)將所有緩沖區(qū)中的日志一次性寫(xiě)入到臨時(shí)文件中。然后調(diào)用原子性的rename命令用新的AOF文件取代老的AOF文件。

從上面的流程我們能夠看到,RDB和AOF操作都是順序IO操作,性能都很高。而同時(shí)在通過(guò)RDB文件或者AOF日志進(jìn)行數(shù)據(jù)庫(kù)恢復(fù)的時(shí)候,也是順序的讀取數(shù)據(jù)加載到內(nèi)存中。所以也不會(huì)造成磁盤(pán)的隨機(jī)讀。

?

(4)、優(yōu)點(diǎn)

1、使用AOF?Redis會(huì)更具有可持久性(durable):你可以有很多不同的fsync策略:沒(méi)有fsync,每秒fsync,每次請(qǐng)求時(shí)fsync。使用默認(rèn)的每秒fsync策略,寫(xiě)性能也仍然很不錯(cuò)(fsync是由后臺(tái)線程完成的,主線程繼續(xù)努力地執(zhí)行寫(xiě)請(qǐng)求),即便你也就僅僅只損失一秒鐘的寫(xiě)數(shù)據(jù)。

2、AOF日志是一個(gè)追加文件,所以不需要定位,在斷電時(shí)也沒(méi)有損壞問(wèn)題。即使由于某種原因文件末尾是一個(gè)寫(xiě)到一半的命令(磁盤(pán)滿或者其他原因),redis-check-aof工具也可以很輕易的修復(fù)。

當(dāng)AOF文件變得很大時(shí),Redis會(huì)自動(dòng)在后臺(tái)進(jìn)行重寫(xiě)。重寫(xiě)是絕對(duì)安全的,因?yàn)镽edis繼續(xù)往舊的文件中追加,使用創(chuàng)建當(dāng)前數(shù)據(jù)集所需的最小操作集合來(lái)創(chuàng)建一個(gè)全新的文件,一旦第二個(gè)文件創(chuàng)建完畢,Redis就會(huì)切換這兩個(gè)文件,并開(kāi)始往新文件追加。

3、AOF文件里面包含一個(gè)接一個(gè)的操作,以易于理解和解析的格式存儲(chǔ)。你也可以輕易的導(dǎo)出一個(gè)AOF文件。例如,即使你不小心錯(cuò)誤地使用FLUSHALL命令清空一切,如果此時(shí)并沒(méi)有執(zhí)行重寫(xiě),你仍然可以保存你的數(shù)據(jù)集,你只要停止服務(wù)器,刪除最后一條命令,然后重啟Redis就可以。

?

(5)、缺點(diǎn)

?1、對(duì)同樣的數(shù)據(jù)集,AOF文件通常要大于等價(jià)的RDB文件。AOF可能比RDB慢,這取決于準(zhǔn)確的fsync策略。通常fsync設(shè)置為每秒一次的話性能仍然很高,如果關(guān)閉fsync,即使在很高的負(fù)載下也和RDB一樣的快。不過(guò),即使在很大的寫(xiě)負(fù)載情況下,RDB還是能提供能好的最大延遲保證。

?

三、小結(jié)

通常來(lái)說(shuō),我們應(yīng)該同時(shí)使用這兩種持久化方法。在實(shí)際配置中,最好兩者結(jié)合,AOF保證數(shù)據(jù)不會(huì)丟失,RDB進(jìn)行備份數(shù)據(jù)以及提供少延遲的主從復(fù)制功能。
如果可以接受災(zāi)難時(shí)有幾分鐘的數(shù)據(jù)丟失,可以只單獨(dú)使用RDB。?
單獨(dú)使用AOF也并不好,因?yàn)闀r(shí)常進(jìn)行RDB快照非常方便于數(shù)據(jù)庫(kù)備份,啟動(dòng)速度也較之快,還避免了AOF引擎的bug。?
基于這些原因,redis可能會(huì)統(tǒng)一AOF和RDB為一種單一的持久化模型(長(zhǎng)遠(yuǎn)計(jì)劃)。?

轉(zhuǎn)載于:https://my.oschina.net/haoran100/blog/712532

總結(jié)

以上是生活随笔為你收集整理的redis(7)、redis持久化的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。