Redis數(shù)據(jù)持久化方式技術(shù)解析
RDB(Redis DataBases)
1、RDB是什么:
在指定的時間間隔內(nèi)將內(nèi)存中的數(shù)據(jù)集快照寫入磁盤,也就是Snapshot快照,它恢復(fù)時是將快照文件直接讀到內(nèi)存里。
Redis會單獨創(chuàng)建(fork)一個子進程來進行持久化,會將數(shù)據(jù)寫入到一個臨時文件中,持久化過程都結(jié)束了,再用這個臨時文件替換上次持久化好的文件。整個過程中,主進程是不進行任何IO操作的,這就確保了極高的性能,如果需要進行大規(guī)模數(shù)據(jù)的恢復(fù),且對于數(shù)據(jù)恢復(fù)的完整性不是非常敏感,那RDB方式是要比AOF方式更加的高效。RDB的缺點是最后一次持久化后的數(shù)據(jù)可能丟失。
2、Fork的作用:
Fork的作用是復(fù)制一個與當(dāng)前進程一樣的進程。新進程的所有數(shù)據(jù)(變量、環(huán)境變量、程序計數(shù)器等)數(shù)值都和原進程一致,但是是一個全新的進程,并作為原進程的子進程。
3、Rdb保存的是dump.rdb文件。
4、如何觸發(fā)RDB快照
(1)配置文件中默認的快照配置:冷拷貝后重新使用(可以cp dump.rdb dump_new.rdb)。
(2)命令save或者bgsave:Save,只管保存其他不管,全部阻塞;bgsave,redis會在后臺異步進行快照操作,快照同時還可以響應(yīng)客戶端請求??梢酝ㄟ^lastsave命令獲取最后一次成功執(zhí)行快照的時間。
(3)執(zhí)行flushall命令,也會產(chǎn)生dump.rdb文件,但里面是空的,無意義。
5、如何恢復(fù): 將備份文件(dump.rdb)移動到redis安裝目錄并啟動服務(wù)即可。
6、優(yōu)勢:適合大規(guī)模的數(shù)據(jù)恢復(fù);對數(shù)據(jù)完整性和一致性要求不高。
7、劣勢:在一定間隔時間做一次備份,所以如果redis意外down掉的話,就會丟失最后一次快照后的所有修改。Fork的時候,內(nèi)存中的數(shù)據(jù)被克隆了一份,大致2倍的膨脹性需要考慮。
8、如何停止:動態(tài)所有停止RDB保存規(guī)則的方法:redis-cli config set save “”
總結(jié)
1、RDB是一個非常緊湊的文件。
2、RDB在保存RDB文件時父進程唯一需要做的就是fork出一個子進程,接下來的工作全部由子進程來做,父進程不需要再做其他IO操作,所以RDB持久化方式可以最大化redis的性能。
3、與AOF相比,再恢復(fù)大的數(shù)據(jù)集的時候,RDB方式會更快一些。
4、數(shù)據(jù)丟失風(fēng)險大。
5、RDB需要經(jīng)常fork子進程來保存數(shù)據(jù)集到硬盤上,當(dāng)數(shù)據(jù)集比較大的時候,fork的過程是非常耗時的,可能會導(dǎo)致Redis在一些毫秒級不能響應(yīng)客戶端請求。
AOF(Append Only File)
1、AOF是什么:以日志的形式來記錄每個寫操作,將Redis執(zhí)行過的所有寫指令記錄下來(讀操作不記錄),只許追加文件但不可以改寫文件,redis啟動之初會讀取該文件重新構(gòu)建數(shù)據(jù),換言之,redis重啟的話就根據(jù)日志文件的內(nèi)容將寫指令從前到后執(zhí)行一次以完成數(shù)據(jù)的恢復(fù)工作。
2、rewrite是什么:AOF采用文件追加的方式,文件會越來越大為避免出現(xiàn)此種情況,新增了重寫機制,當(dāng)AOF文件的大小超過所設(shè)定的閾值時,Redis就會啟動AOF文件的內(nèi)容壓縮,只保留可以恢復(fù)數(shù)據(jù)的最小指令集,可以使用命令bgrewriteaof。
3、重寫原理:AOF文件持續(xù)增長而過大時,會fork出一條新進程來將文件重寫(也是先寫臨時文件最后再rename),遍歷新進程的內(nèi)存中數(shù)據(jù),每條記錄有一條的set語句。重寫aof文件的操作,并沒有讀取舊的aof文件,而是將整個內(nèi)存中的數(shù)據(jù)庫內(nèi)容用命令的方式重寫了一個新的aof文件,這點和快照點數(shù)類似。
4、重寫的觸發(fā)機制:Redis會記錄上次重寫時AOF的大小,默認配置時當(dāng)AOF文件大小是上次rewrite后大小的一倍且文件大于64MB時觸發(fā)。
5、優(yōu)勢:
(1)每秒同步:appendfsync always同步持久化每次發(fā)生數(shù)據(jù)變更會被立即記錄到磁盤,性能較差但數(shù)據(jù)完整性比較好。
(2)每次修改同步:appendfsync everysec 異步操作,每秒記錄如果一秒內(nèi)宕機,有數(shù)據(jù)丟失。
(3)不同步:appendfsync no 從不同步。
6、劣勢:
(1)相同數(shù)據(jù)集的數(shù)據(jù)而言aof文件要遠大于rdb文件,恢復(fù)速度慢于rdb。
(2)AOF運行效率要慢于rdb,每秒同步策略效率較好,不同步效率和rdb相同。
總結(jié)
1、AOF文件是一個只進行追加的日志文件。
2、Redis可以再AOF文件體積變得過大時,自動地在后臺對AOF進行重寫。
3、AOF文件有序地保存了對數(shù)據(jù)庫執(zhí)行的所有寫入操作,這些寫入操作以Redis協(xié)議的格式保存,因此AOF文件的內(nèi)容非常容易被人讀懂,對文件進行分析也很輕松。
4、對于相同的數(shù)據(jù)集來說,AOF文件的體積通常要大于RDB文件的體積。
5、根據(jù)所使用的fsync策略,AOF的速度可能會慢于RDB。
兩種方式的總結(jié)
1、RDB持久化方式能夠在指定的時間間隔能對你的數(shù)據(jù)進行快照存儲。
2、AOF持久化方式記錄每次對服務(wù)器寫的操作,當(dāng)服務(wù)器重啟的時候會重新執(zhí)行這些命令來恢復(fù)原始的數(shù)據(jù),AOF文件進行后臺重寫,使得AOF文件的體積不至于過大。
3、只做緩存:如果你只希望你的數(shù)據(jù)在服務(wù)器運行的時候存在,你也可以不使用任何持久化方式。
以上就是Redis緩存持久化技術(shù)解析的詳細內(nèi)容,更多關(guān)于redis持久化的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
redis輕松處理經(jīng)緯度坐標點數(shù)據(jù)的實現(xiàn)方法
這篇文章主要介紹了redis輕松處理經(jīng)緯度坐標點數(shù)據(jù)的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-10-10分布式架構(gòu)Redis中有哪些數(shù)據(jù)結(jié)構(gòu)及底層實現(xiàn)原理
這篇文章主要為大家介紹了分布式架構(gòu)Redis中有哪些數(shù)據(jù)結(jié)構(gòu)及底層的實現(xiàn)原理解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步2022-03-03