從現(xiàn)在開始,我們來探討redis的一個非常重要的問題——集群,要討論集群,我們需要先理解redis持久化數(shù)據(jù)的方法,因為集群本質(zhì)上就是將一個集群的數(shù)據(jù)同步到其他機器上。
Redis 6的持久化機制主要有兩種:RDB(Redis DataBase)和AOF(Append Only File)。前者效果好,但是代價高,使用頻率低,后者則完全相反。本文將詳細(xì)介紹這兩種持久化方式的工作原理和配置要點。
目錄
1. RDB持久化原理
1.1 基本原理
1.2 RDB的優(yōu)點和缺點
2.持久化的5個步驟
3.RDB持久化實戰(zhàn)
1. RDB持久化原理
1.1 基本原理
RDB持久化是將當(dāng)前進程的數(shù)據(jù)生成快照保存到磁盤的過程。它可以通過手動觸發(fā)或自動觸發(fā)兩種方式來執(zhí)行。
手動觸發(fā)RDB持久化可以使用save命令或bgsave命令。save命令會阻塞Redis服務(wù)器直到RDB過程完成,而bgsave命令則會創(chuàng)建一個子進程來執(zhí)行持久化操作,主進程可以繼續(xù)處理其他請求。
自動觸發(fā)RDB持久化可以在配置文件中設(shè)置save指令,指定在一定時間間隔內(nèi)有一定數(shù)量的修改操作時自動觸發(fā)bgsave命令。
三種主要的觸發(fā)機制:
1.Save命令:Save命令是手動觸發(fā)RDB持久化的機制。當(dāng)執(zhí)行Save命令時,Redis會阻塞主線程,創(chuàng)建一個子進程,將數(shù)據(jù)快照保存到磁盤上的RDB文件中。在持久化完成之前,Redis的主線程將無法處理其他請求。
2.BGSAVE命令:BGSAVE命令是異步觸發(fā)RDB持久化的機制。當(dāng)執(zhí)行BGSAVE命令時,Redis會創(chuàng)建一個子進程,在子進程中進行數(shù)據(jù)快照的生成和保存。與Save命令不同的是,BGSAVE命令不會完全阻塞主線程,可以繼續(xù)處理其他請求。
3. 自動觸發(fā):Redis 6.0引入了自動觸發(fā)RDB持久化的機制。可以通過配置文件中的save選項來設(shè)置自動觸發(fā)的條件。例如,設(shè)置save 900 1表示在900秒(15分鐘)內(nèi),如果至少有1個鍵發(fā)生變化,則自動觸發(fā)RDB持久化操作。這樣可以根據(jù)實際需求來靈活地控制RDB持久化的頻率。
這些觸發(fā)機制可以根據(jù)需求和場景選擇合適的方式來進行RDB持久化,以保證數(shù)據(jù)的持久性和恢復(fù)能力。再次對之前的回答失誤表示歉意,希望這次回答能夠滿足你的需求。如果還有其他問題,請隨時提問。
RDB持久化的優(yōu)點包括快速恢復(fù)數(shù)據(jù)、壓縮存儲和加載速度快。缺點是實時性較差,無法做到秒級持久化,并且執(zhí)行bgsave命令會進行fork子進程,頻繁執(zhí)行開銷較大。
RDB持久化的配置項包括:
- dbfilename:RDB文件在磁盤上的名稱。
- dir:RDB文件的存儲路徑。
- stop-writes-on-bgsave-error:如果持久化過程出錯,主進程是否停止寫入操作。
- rdbcompression:是否對RDB文件進行壓縮。
- rdbchecksum:在RDB文件末尾添加冗余校驗編碼。
1.2 RDB的優(yōu)點和缺點
RDB 它會周期性地將 Redis 內(nèi)存中的數(shù)據(jù)快照寫入到硬盤中,并生成對應(yīng)的 RDB 文件。
優(yōu)點是:
- 數(shù)據(jù)恢復(fù)速度快:由于 RDB 文件采用二進制格式存儲,文件體積較小,恢復(fù)速度非???。
- 對性能影響?。号c AOF 持久化方式相比,RDB 持久化方式對 Redis 的性能影響要小很多,因為 RDB 僅在指定的時間間隔內(nèi)執(zhí)行一次快照存儲操作。
- 文件體積?。河捎?RDB 文件采用二進制格式存儲,文件體積較小,可節(jié)省存儲空間。
- 可以單獨備份:RDB 文件可以單獨備份,方便進行數(shù)據(jù)遷移和備份。
缺點是:
- 可能會丟失一定量的數(shù)據(jù):由于 RDB 持久化方式是周期性地生成快照文件,如果在兩次快照文件之間 Redis 發(fā)生宕機,就會丟失這段時間內(nèi)的數(shù)據(jù)。
- 數(shù)據(jù)一致性較低:由于 RDB 持久化方式并不是實時同步,而是周期性快照存儲,因此在宕機時可能會丟失一部分?jǐn)?shù)據(jù),數(shù)據(jù)一致性較 AOF 持久化方式要低。
- 不支持實時備份:由于 RDB 持久化方式是周期性快照存儲,因此不支持實時備份。
整體而言RDB 持久化方式可以提供快速的數(shù)據(jù)恢復(fù)能力,對 Redis 的性能影響比較小,同時也可以節(jié)省存儲空間。但是,它也存在丟失一定量數(shù)據(jù)和數(shù)據(jù)一致性較低的問題,需要根據(jù)實際情況進行權(quán)衡和選擇。后面我們講解另一種持久化方式AOF。我們可以對照著學(xué)習(xí)一下。
?
2.持久化的5個步驟
RDB持久化方式一共可以分為5步,第五步其實就是持久化恢復(fù),也可以不算。
具體來說:
1. 觸發(fā)條件: 可以通過配置文件中的save參數(shù)來設(shè)置RDB持久化的觸發(fā)條件。當(dāng)滿足設(shè)定的觸發(fā)條件時,Redis會執(zhí)行RDB持久化操作。
2. 快照生成:當(dāng)觸發(fā)條件滿足時,Redis會調(diào)用fork函數(shù)創(chuàng)建一個子進程。父進程繼續(xù)處理客戶端的請求,而子進程負(fù)責(zé)將數(shù)據(jù)寫入RDB文件。
3. 寫入過程:子進程會遍歷Redis服務(wù)器中的所有數(shù)據(jù)庫,將每個數(shù)據(jù)庫的鍵值對寫入到RDB文件中。寫入過程中,子進程會將數(shù)據(jù)轉(zhuǎn)換為二進制格式,并按照一定的規(guī)則進行壓縮。
4. 寫入完成:當(dāng)子進程完成RDB文件的寫入后,它會用新生成的RDB文件覆蓋原來的RDB文件。這個過程是原子的,可以保證RDB文件的完整性。
5. 恢復(fù):當(dāng)Redis服務(wù)器重新啟動時,它會檢查是否存在RDB文件。如果存在,Redis會加載RDB文件,并將其中的數(shù)據(jù)恢復(fù)到內(nèi)存中,從而完成數(shù)據(jù)的持久化恢復(fù)。
比較坑的是 RDB持久化是一個阻塞操作,即在進行RDB持久化期間,Redis服務(wù)器將暫停響應(yīng)客戶端的請求。這是因為RDB持久化是通過fork子進程來完成的,而fork操作會復(fù)制整個父進程的內(nèi)存空間,可能會耗費大量的CPU和內(nèi)存資源。
此外,RDB持久化還有一些配置選項可以進行調(diào)整,例如可以設(shè)置RDB文件的路徑和名稱、是否壓縮RDB文件、觸發(fā)條件的設(shè)置等。這些選項可以通過Redis的配置文件redis.conf來進行配置。
?
3.RDB持久化實戰(zhàn)
rdb持久化問題,本來以為非常復(fù)雜,沒想到非常簡單,當(dāng)我們關(guān)閉redis時,就會使用rdb方式將我們的緩存文件保存下來,這樣下次啟動了就可以恢復(fù)全部數(shù)據(jù)。
接下來我們演示一下rdb如何使用。
首先,我們將redis工作區(qū)下的.rdb的文件先刪掉,然后重啟redis服務(wù):
可以看到此時是沒有數(shù)據(jù)的,然后我們輸入幾個值:
然后我們將redis-server關(guān)閉,(可以使用kill命令)。
之后我們重啟redis-server,此時再用redis-cli客戶端登陸,可以看到此時keys是有我們存儲的信息。
如果我們將redis工作區(qū)下的dump.rdb文件(默認(rèn))刪除 ,然后重啟redis-server,此時就會發(fā)現(xiàn)redis里什么都沒有了。
由此,我們也可以看到redis的關(guān)閉的時候確實使用rdb來將數(shù)據(jù)保存到本地。而啟動的時候會先使用rdb中的信息來恢復(fù)原始數(shù)據(jù)。文章來源:http://www.zghlxwxcb.cn/news/detail-800579.html
文章參考:rdb持久化文章來源地址http://www.zghlxwxcb.cn/news/detail-800579.html
到了這里,關(guān)于【征服redis7】談?wù)凴edis的RDB持久化方式的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!