redis中的快照持久化是什么-創(chuàng)新互聯(lián)

創(chuàng)新互聯(lián)www.cdcxhl.cn八線動態(tài)BGP香港云服務(wù)器提供商,新人活動買多久送多久,劃算不套路!

站在用戶的角度思考問題,與客戶深入溝通,找到南沙網(wǎng)站設(shè)計與南沙網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗,讓設(shè)計與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個性化、用戶體驗好的作品,建站類型包括:成都做網(wǎng)站、網(wǎng)站設(shè)計、外貿(mào)營銷網(wǎng)站建設(shè)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機端網(wǎng)站、網(wǎng)站推廣、域名與空間、雅安服務(wù)器托管、企業(yè)郵箱。業(yè)務(wù)覆蓋南沙地區(qū)。

redis中的快照持久化是什么?針對這個問題,這篇文章詳細(xì)介紹了相對應(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 是單線程程序,這個線程要同時負(fù)責(zé)多個客戶端套接字的并發(fā)讀寫操作 和內(nèi)存數(shù)據(jù)結(jié)構(gòu)的邏輯讀寫。

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

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

那該怎么辦呢?

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

fork(多進(jìn)程)

Redis 在持久化時會調(diào)用 glibc 的函數(shù) fork 產(chǎn)生一個子進(jìn)程,快照持久化完全交給子進(jìn) 程來處理,父進(jìn)程繼續(xù)處理客戶端請求。子進(jìn)程剛剛產(chǎn)生時,它和父進(jìn)程共享內(nèi)存里面的代 碼段和數(shù)據(jù)段。這時你可以將父子進(jìn)程想像成一個連體嬰兒,共享身體。這是 Linux 操作系統(tǒng)的機制,為了節(jié)約內(nèi)存資源,所以盡可能讓它們共享起來。在進(jìn)程分離的一瞬間,內(nèi)存的增長幾乎沒有明顯變化。子進(jìn)程做數(shù)據(jù)持久化,它不會修改現(xiàn)有的內(nèi)存數(shù)據(jù)結(jié)構(gòu),它只是對數(shù)據(jù)結(jié)構(gòu)進(jìn)行遍歷讀取,然后序列化寫到磁盤中。但是父進(jìn)程不一樣,它必須持續(xù)服務(wù)客戶端請求,然后對內(nèi)存數(shù)據(jù)結(jié)構(gòu)進(jìn)行不間斷的修改。這個時候就會使用操作系統(tǒng)的 COW 機制來進(jìn)行數(shù)據(jù)段頁面的分離。數(shù)據(jù)段是由很多操 作系統(tǒng)的頁面組合而成,當(dāng)父進(jìn)程對其中一個頁面的數(shù)據(jù)進(jìn)行修改時,會將被共享的頁面復(fù) 制一份分離出來,然后對這個復(fù)制的頁面進(jìn)行修改。這時子進(jìn)程相應(yīng)的頁面是沒有變化的, 還是進(jìn)程產(chǎn)生時那一瞬間的數(shù)據(jù)。

隨著父進(jìn)程修改操作的持續(xù)進(jìn)行,越來越多的共享頁面被分離出來,內(nèi)存就會持續(xù)增 長。但是也不會超過原有數(shù)據(jù)內(nèi)存的 2 倍大小。另外一個 Redis 實例里冷數(shù)據(jù)占的比例往 往是比較高的,所以很少會出現(xiàn)所有的頁面都會被分離,被分離的往往只有其中一部分頁 面。每個頁面的大小只有 4K,一個 Redis 實例里面一般都會有成千上萬的頁面。

子進(jìn)程因為數(shù)據(jù)沒有變化,它能看到的內(nèi)存里的數(shù)據(jù)在進(jìn)程產(chǎn)生的一瞬間就凝固了,再 也不會改變,這也是為什么 Redis 的持久化叫「快照」的原因。接下來子進(jìn)程就可以非常安 心的遍歷數(shù)據(jù)了進(jìn)行序列化寫磁盤了。

文章名稱:redis中的快照持久化是什么-創(chuàng)新互聯(lián)
文章起源:http://muchs.cn/article40/dpjiho.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站維護(hù)、網(wǎng)站設(shè)計公司、商城網(wǎng)站、做網(wǎng)站、關(guān)鍵詞優(yōu)化、網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站建設(shè)