溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

redis中的快照持久化是什么

發(fā)布時間:2020-07-01 14:32:31 來源:億速云 閱讀:264 作者:元一 欄目:關(guān)系型數(shù)據(jù)庫

redis中的快照持久化是什么?針對這個問題,這篇文章詳細介紹了相對應(yīng)的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。

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 是單線程程序,這個線程要同時負責(zé)多個客戶端套接字的并發(fā)讀寫操作 和內(nèi)存數(shù)據(jù)結(jié)構(gòu)的邏輯讀寫。

在服務(wù)線上請求的同時,Redis 還需要進行內(nèi)存快照,內(nèi)存快照要求 Redis 必須進行文 件 IO 操作,可文件 IO 操作是不能使用多路復(fù)用 API。

這意味著單線程同時在服務(wù)線上的請求還要進行文件 IO 操作,文件 IO 操作會嚴重拖 垮服務(wù)器請求的性能。還有個重要的問題是為了不阻塞線上的業(yè)務(wù),就需要邊持久化邊響應(yīng) 客戶端請求。持久化的同時,內(nèi)存數(shù)據(jù)結(jié)構(gòu)還在改變,比如一個大型的 hash 字典正在持久 化,結(jié)果一個請求過來把它給刪掉了,還沒持久化完呢,這尼瑪要怎么搞?

那該怎么辦呢?

Redis 使用操作系統(tǒng)的多進程 COW(Copy On Write) 機制來實現(xiàn)快照持久化,這個機制 很有意思,也很少人知道。多進程 COW 也是鑒定程序員知識廣度的一個重要指標。

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)注億速云行業(yè)資訊頻道了解更多相關(guān)知識。

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI