創(chuàng)新互聯(lián)www.cdcxhl.cn八線動態(tài)BGP香港云服務器提供商,新人活動買多久送多久,劃算不套路!
redis中的快照持久化是什么?針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
Redis為了內(nèi)部數(shù)據(jù)的安全考慮,會把本身的數(shù)據(jù)以文件形式保存到硬盤中一份,在服務器重啟之后會自動把硬盤的數(shù)據(jù)恢復到內(nèi)存(redis)的里邊,數(shù)據(jù)保存到硬盤的過程就稱為“持久化”效果。
快照持久化
將某一時刻的所有數(shù)據(jù)寫入硬盤。使用BGSAVE命令,隨著內(nèi)存使用量的增加,執(zhí)行 BGSAVE 可能會導致系統(tǒng)長時間地停頓。
快照原理
我們知道 Redis 是單線程程序,這個線程要同時負責多個客戶端套接字的并發(fā)讀寫操作 和內(nèi)存數(shù)據(jù)結(jié)構(gòu)的邏輯讀寫。
在服務線上請求的同時,Redis 還需要進行內(nèi)存快照,內(nèi)存快照要求 Redis 必須進行文 件 IO 操作,可文件 IO 操作是不能使用多路復用 API。
這意味著單線程同時在服務線上的請求還要進行文件 IO 操作,文件 IO 操作會嚴重拖 垮服務器請求的性能。還有個重要的問題是為了不阻塞線上的業(yè)務,就需要邊持久化邊響應 客戶端請求。持久化的同時,內(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ù)服務客戶端請求,然后對內(nèi)存數(shù)據(jù)結(jié)構(gòu)進行不間斷的修改。這個時候就會使用操作系統(tǒng)的 COW 機制來進行數(shù)據(jù)段頁面的分離。數(shù)據(jù)段是由很多操 作系統(tǒng)的頁面組合而成,當父進程對其中一個頁面的數(shù)據(jù)進行修改時,會將被共享的頁面復 制一份分離出來,然后對這個復制的頁面進行修改。這時子進程相應的頁面是沒有變化的, 還是進程產(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ù)了進行序列化寫磁盤了。
文章名稱:redis中的快照持久化是什么-創(chuàng)新互聯(lián)
文章起源:http://www.chinadenli.net/article40/dpjiho.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站維護、網(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)
猜你還喜歡下面的內(nèi)容