redis中的快照持久化是什么?針對這個問題,這篇文章詳細(xì)介紹了相對應(yīng)的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
創(chuàng)新互聯(lián)成立與2013年,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項目網(wǎng)站設(shè)計制作、網(wǎng)站制作網(wǎng)站策劃,項目實施與項目整合能力。我們以讓每一個夢想脫穎而出為使命,1280元陽泉做網(wǎng)站,已為上家服務(wù),為陽泉各地企業(yè)和個人服務(wù),聯(lián)系電話:18982081108
Redis為了內(nèi)部數(shù)據(jù)的安全考慮,會把本身的數(shù)據(jù)以文件形式保存到硬盤中一份,在服務(wù)器重啟之后會自動把硬盤的數(shù)據(jù)恢復(fù)到內(nèi)存(redis)的里邊,數(shù)據(jù)保存到硬盤的過程就稱為“持久化”效果。
快照持久化
將某一時刻的所有數(shù)據(jù)寫入硬盤。使用BGSAVE命令,隨著內(nèi)存使用量的增加,執(zhí)行 BGSAVE 可能會導(dǎo)致系統(tǒng)長時間地停頓。
快照原理
我們知道 Redis 是單線程程序,這個線程要同時負(fù)責(zé)多個客戶端套接字的并發(fā)讀寫操作 和內(nèi)存數(shù)據(jù)結(jié)構(gòu)的邏輯讀寫。
在服務(wù)線上請求的同時,Redis 還需要進行內(nèi)存快照,內(nèi)存快照要求 Redis 必須進行文 件 IO 操作,可文件 IO 操作是不能使用多路復(fù)用 API。
這意味著單線程同時在服務(wù)線上的請求還要進行文件 IO 操作,文件 IO 操作會嚴(yán)重拖 垮服務(wù)器請求的性能。還有個重要的問題是為了不阻塞線上的業(yè)務(wù),就需要邊持久化邊響應(yīng) 客戶端請求。持久化的同時,內(nèi)存數(shù)據(jù)結(jié)構(gòu)還在改變,比如一個大型的 hash 字典正在持久 化,結(jié)果一個請求過來把它給刪掉了,還沒持久化完呢,這尼瑪要怎么搞?
那該怎么辦呢?
Redis 使用操作系統(tǒng)的多進程 COW(Copy On Write) 機制來實現(xiàn)快照持久化,這個機制 很有意思,也很少人知道。多進程 COW 也是鑒定程序員知識廣度的一個重要指標(biāo)。
fork(多進程)
Redis 在持久化時會調(diào)用 glibc 的函數(shù) fork 產(chǎn)生一個子進程,快照持久化完全交給子進 程來處理,父進程繼續(xù)處理客戶端請求。子進程剛剛產(chǎn)生時,它和父進程共享內(nèi)存里面的代 碼段和數(shù)據(jù)段。這時你可以將父子進程想像成一個連體嬰兒,共享身體。這是 Linux 操作系統(tǒng)的機制,為了節(jié)約內(nèi)存資源,所以盡可能讓它們共享起來。在進程分離的一瞬間,內(nèi)存的增長幾乎沒有明顯變化。子進程做數(shù)據(jù)持久化,它不會修改現(xiàn)有的內(nèi)存數(shù)據(jù)結(jié)構(gòu),它只是對數(shù)據(jù)結(jié)構(gòu)進行遍歷讀取,然后序列化寫到磁盤中。但是父進程不一樣,它必須持續(xù)服務(wù)客戶端請求,然后對內(nèi)存數(shù)據(jù)結(jié)構(gòu)進行不間斷的修改。這個時候就會使用操作系統(tǒng)的 COW 機制來進行數(shù)據(jù)段頁面的分離。數(shù)據(jù)段是由很多操 作系統(tǒng)的頁面組合而成,當(dāng)父進程對其中一個頁面的數(shù)據(jù)進行修改時,會將被共享的頁面復(fù) 制一份分離出來,然后對這個復(fù)制的頁面進行修改。這時子進程相應(yīng)的頁面是沒有變化的, 還是進程產(chǎn)生時那一瞬間的數(shù)據(jù)。
隨著父進程修改操作的持續(xù)進行,越來越多的共享頁面被分離出來,內(nèi)存就會持續(xù)增 長。但是也不會超過原有數(shù)據(jù)內(nèi)存的 2 倍大小。另外一個 Redis 實例里冷數(shù)據(jù)占的比例往 往是比較高的,所以很少會出現(xiàn)所有的頁面都會被分離,被分離的往往只有其中一部分頁 面。每個頁面的大小只有 4K,一個 Redis 實例里面一般都會有成千上萬的頁面。
子進程因為數(shù)據(jù)沒有變化,它能看到的內(nèi)存里的數(shù)據(jù)在進程產(chǎn)生的一瞬間就凝固了,再 也不會改變,這也是為什么 Redis 的持久化叫「快照」的原因。接下來子進程就可以非常安 心的遍歷數(shù)據(jù)了進行序列化寫磁盤了。
關(guān)于redis中的快照持久化是什么問題的解答就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道了解更多相關(guān)知識。