我已經(jīng)運(yùn)行它好幾年了,內(nèi)存中存儲(chǔ)了很多鍵值對(duì)。
如果我掛了,我記憶中的所有數(shù)據(jù)都會(huì)消失。
我得想辦法時(shí)不時(shí)把數(shù)據(jù)拷貝到硬盤里保存。
我稱這個(gè)偉大的計(jì)劃為持久的計(jì)劃。
停下你正在做的事情。
首先,我想到的最簡(jiǎn)單的辦法就是拒絕新的命令,開始把內(nèi)存中的數(shù)據(jù)復(fù)制到硬盤上。
等到復(fù)制完成,再開始接受新的命令。
這樣可以保證我復(fù)制的時(shí)候沒(méi)有新的命令修改內(nèi)存,保證了時(shí)效性。
簡(jiǎn)單來(lái)說(shuō),我保存了Redis在某個(gè)時(shí)刻的內(nèi)存狀態(tài)。
但是這樣每次堅(jiān)持下來(lái)都會(huì)屏蔽客戶端命令,肯定會(huì)被罵。
不要停止你正在做的事情。
那就簡(jiǎn)單了,然后我不會(huì)停止我正在做的事情,我會(huì)接受命令并使之永久化,如下。
這大大提高了效率,并且持久性不再阻止客戶端執(zhí)行命令。
但是,你有沒(méi)有注意到,在內(nèi)存中,某個(gè)時(shí)刻的數(shù)據(jù)只有三種情況:
Flash 18低并發(fā)編程
兄弟18低并發(fā)編程
弟18秋三連
而此時(shí)硬盤中的持久數(shù)據(jù)是:
山科十八丘三連
它不能代表任何時(shí)刻的內(nèi)存數(shù)據(jù)。
那么這樣的快照就失去了意義,即沒(méi)有時(shí)效性的保證。
顯然,這也不行。
先復(fù)制一份內(nèi)存
但是我能做什么呢。
停下手頭的工作可以保證時(shí)效性,但是卻擋住了客戶端。
不要停下手頭的工作,雖然不堵客戶端,但不能保證時(shí)效性。
真的很大。
抓了一會(huì)頭皮,冷靜下來(lái)開始分析。
時(shí)機(jī)一定要保證,否則快照就沒(méi)有意義了,只能盡量縮短阻塞客戶端的時(shí)間。
在阻塞客戶端時(shí)間之前,它是在持久化中消耗的,也就是將內(nèi)存復(fù)制到硬盤的過(guò)程。
優(yōu)化,先從內(nèi)存拷貝一份到另一個(gè)內(nèi)存空間,然后持久化這個(gè)新的內(nèi)存空間。
這樣,持久化過(guò)程不會(huì)延遲客戶端命令,也不會(huì)受到客戶端命令的影響,從而保證了及時(shí)性。
而阻塞客戶端的時(shí)間只是從內(nèi)存復(fù)制一份數(shù)據(jù)到內(nèi)存的時(shí)間,相對(duì)于整個(gè)持久化過(guò)程可以忽略不計(jì)。
完美!
有了這個(gè)完美的計(jì)劃,我去找我?guī)煾秆Α?/p>
寫副本
我:師傅,我做了一個(gè)持久的計(jì)劃!
主持人:嗯,讓我想想...嘖嘖,復(fù)制內(nèi)存是個(gè)好主意,不過(guò)有點(diǎn)生疏了你對(duì)操作系統(tǒng)了解不夠
我:啊,為什么。
主持人:想想吧您現(xiàn)在的目的是隔離持久化和處理客戶端命令這兩個(gè)過(guò)程中使用的內(nèi)存空間,對(duì)嗎
我:嗯嗯,是的。
主持人:是的,其實(shí)你只需要為持久化創(chuàng)建一個(gè)新的流程不同進(jìn)程之間的內(nèi)存是隔離的,即創(chuàng)建一個(gè)新進(jìn)程會(huì)將原進(jìn)程的內(nèi)存空間完全復(fù)制到一個(gè)新進(jìn)程中
我:啊,和自己復(fù)制一段記憶不一樣嗎花的時(shí)間差不多
業(yè)主:我的圖只是給用戶一個(gè)這樣的印象事實(shí)上,linux采用了寫時(shí)復(fù)制技術(shù)當(dāng)fork離開它的子進(jìn)程時(shí),并不立即復(fù)制內(nèi)存,只是復(fù)制一個(gè)映射關(guān)系,使它們臨時(shí)指向同一個(gè)內(nèi)存空間
Master:當(dāng)父子進(jìn)程寫入這個(gè)內(nèi)存空間時(shí),它實(shí)際上會(huì)復(fù)制內(nèi)存,而且是基于頁(yè)的。
我:我明白了,就是說(shuō)我可以利用操作系統(tǒng)的進(jìn)程寫的時(shí)候復(fù)制內(nèi)存的原理,而不是自己復(fù)制所有的內(nèi)存因?yàn)橛辛顺志没倪^(guò)程,我覺(jué)得對(duì)內(nèi)存的寫入不會(huì)太多,大部分值都是常量,所以提高了效率
主持人:是的。
我:太好了!
我迅速修改了方案當(dāng)它需要持久化時(shí),我將派生一個(gè)子流程來(lái)實(shí)現(xiàn)這一點(diǎn)操作系統(tǒng)進(jìn)程內(nèi)存隔離的特性為我保證了時(shí)效性,寫時(shí)復(fù)制原理為我保證了效率,也就是減少了客戶端的阻塞時(shí)間偽代碼是這樣的
voidrdbSaveBackground///子進(jìn)程句柄if0)//主方法rdbSave
完美!
我們還沒(méi)有決定結(jié)構(gòu)。
剛剛訪問(wèn)了持久化的進(jìn)程,還沒(méi)有設(shè)置寫入磁盤的數(shù)據(jù)格式。
那就訂一個(gè)。
如果我的Redis內(nèi)存中只有一條數(shù)據(jù),則通過(guò)以下命令寫入:
設(shè)置地兵發(fā)牛逼
落在磁盤上的持久性rdb文件將如下所示。
但我不在乎持續(xù)時(shí)間長(zhǎng)不長(zhǎng)。
什么時(shí)候做持久化,我給主人留了個(gè)配置。
保存m n
意味著當(dāng)m秒內(nèi)對(duì)數(shù)據(jù)集有n次修改時(shí),會(huì)自動(dòng)觸發(fā)一次持久化。
所有者也可以配置多個(gè)這樣的配置項(xiàng)目。
我好心地給主人分配了一個(gè)默認(rèn)配置項(xiàng),并寫了一條評(píng)論。
#保存?zhèn)?
# Intheexamplebelowthebehaviourwillbetosave:
# after 900 secifatleast 1 key changed
# after 300 secifatleast 10keyschanged
# 60秒后指定至少10000個(gè)密鑰已更改
保存9001
保存30010
儲(chǔ)蓄6010000
我覺(jué)得以我碩士的英語(yǔ)水平是看得懂的。
好了,這次真的完成了!
這個(gè)愚蠢的東西,我會(huì)給它一個(gè)名字,它叫做RDB。
沒(méi)什么特別的,其實(shí)就是以我的名字開頭,Redis DB。
附言
rdb持久化過(guò)程也可以手動(dòng)觸發(fā),即直接輸入bgsave,與自動(dòng)觸發(fā)完全一樣。
在redis的源代碼中,它被稱為bgsaveCommand方法。
整個(gè)源代碼非常簡(jiǎn)單易讀,但是有很多雜念。
。鄭重聲明:此文內(nèi)容為本網(wǎng)站轉(zhuǎn)載企業(yè)宣傳資訊,目的在于傳播更多信息,與本站立場(chǎng)無(wú)關(guān)。僅供讀者參考,并請(qǐng)自行核實(shí)相關(guān)內(nèi)容。
2023年2月15日,湯臣倍健與美團(tuán)買藥在北京舉辦了2023
2021年收入增長(zhǎng)目標(biāo)應(yīng)能確保實(shí)現(xiàn),2022年收入增長(zhǎng)預(yù)計(jì)將
具體來(lái)看,一是簡(jiǎn)化業(yè)務(wù)流程和材料,便利北京冬奧會(huì)相關(guān)區(qū)域內(nèi)境
炒股就看金麒麟分析師研報(bào),權(quán)威,專業(yè),及時(shí),全面,助您挖掘潛
,據(jù)索尼官方消息,新星粉,銀河紫,星光藍(lán),三款全新配色Dua
,新氧數(shù)據(jù)顏究院發(fā)布《2021醫(yī)美行業(yè)白皮書》,白皮書顯示,