婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > 從源碼解讀redis持久化

從源碼解讀redis持久化

熱門標簽:一個地圖標注多少錢 廊坊外呼系統(tǒng)在哪買 四川穩(wěn)定外呼系統(tǒng)軟件 地圖標注工廠入駐 400電話辦理的口碑 b2b外呼系統(tǒng) 高碑店市地圖標注app 南京手機外呼系統(tǒng)廠家 臺灣電銷

為什么需要持久化?

由于Redis是一種內(nèi)存型數(shù)據(jù)庫,即服務器在運行時,系統(tǒng)為其分配了一部分內(nèi)存存儲數(shù)據(jù),一旦服務器掛了,或者突然宕機了,那么數(shù)據(jù)庫里面的數(shù)據(jù)將會丟失,為了使服務器即使突然關機也能保存數(shù)據(jù),必須通過持久化的方式將數(shù)據(jù)從內(nèi)存保存到磁盤中。

對于進行持久化的程序來說,數(shù)據(jù)從程序寫到計算機的磁盤的流程如下:

1、客戶端發(fā)送一個寫指令給數(shù)據(jù)庫(此時數(shù)據(jù)在客戶端的內(nèi)存)

2、數(shù)據(jù)庫接收到寫的指令以及數(shù)據(jù)(數(shù)據(jù)此時在服務端的內(nèi)存)

3、數(shù)據(jù)庫發(fā)起一個系統(tǒng)調(diào)用,把數(shù)據(jù)寫到磁盤(此時數(shù)據(jù)在內(nèi)核的內(nèi)存)

4、操作系統(tǒng)把數(shù)據(jù)傳輸?shù)酱疟P控制器(數(shù)據(jù)此時在磁盤緩存中)

5、磁盤控制器執(zhí)行真正寫入數(shù)據(jù)到物理媒介的操作(如磁盤)

如果只是考慮數(shù)據(jù)庫層面,數(shù)據(jù)在第三階段之后就安全了,在這個時候,系統(tǒng)調(diào)用已經(jīng)發(fā)起了,即使數(shù)據(jù)庫進程奔潰了,系統(tǒng)調(diào)用會繼續(xù)進行,也能順利將數(shù)據(jù)寫入到磁盤中。 在這一步之后,在第4步內(nèi)核會將數(shù)據(jù)從內(nèi)核緩存保存到磁盤緩存中,但為了系統(tǒng)的效率問題,默認情況下不會太頻繁地執(zhí)行這個動作,大概會在30s執(zhí)行一次,這就意味著如果這一步失敗了或者就在進行這一步的時候服務器突然關機了,那么就可能會有30s的數(shù)據(jù)丟失了,這種比較普通的災難性問題也是需要考慮的。

POSIX API也提供了一個系統(tǒng)調(diào)用讓內(nèi)核強制將緩存數(shù)據(jù)寫入到磁盤中,比較常見的就是fsync系統(tǒng)調(diào)用。

int fsync(int fd);

fsync函數(shù)只對由文件描述符fd指定的一個文件起作用,并且等待寫磁盤操作結束后才返回。每次調(diào)用fsync時,會初始化一個寫操作,然后把緩沖區(qū)的數(shù)據(jù)寫入到磁盤中。fsync()函數(shù)在完成寫操作的時候會阻塞進程,如果其他線程也在寫同一個文件,它也會阻塞其他線程,直到完成寫操作。

持久化

持久化是將程序數(shù)據(jù)在持久狀態(tài)和瞬時狀態(tài)間轉換的機制。對于程序來說,程序運行中數(shù)據(jù)是在內(nèi)存的,如果沒有及時同步寫入到磁盤,那么一旦斷電或者程序突然奔潰,數(shù)據(jù)就會丟失了,只有把數(shù)據(jù)及時同步到磁盤,數(shù)據(jù)才能永久保存,不會因為宕機影像數(shù)據(jù)的有效性。而持久化就是將數(shù)據(jù)從程序同步到磁盤的一個動作過程。

Redis的持久化

redis有RDB和AOF兩種持久化方式。RDB是快照文件的方式,redis通過執(zhí)行SAVE/BGSAVE命令,執(zhí)行數(shù)據(jù)的備份,將redis當前的數(shù)據(jù)保存到*.rdb文件中,文件保存了所有的數(shù)據(jù)集合。AOF是服務器通過讀取配置,在指定的時間里,追加redis寫操作的命令到*.aof文件中,是一種增量的持久化方式。

RDB

RDB文件通過SAVE或BGSAVE命令實現(xiàn)。 SAVE命令會阻塞Redis服務進程,直到RDB文件創(chuàng)建完成為止。 BGSAVE命令通過fork子進程,有子進程來進行創(chuàng)建RDB文件,父進程和子進程共享數(shù)據(jù)段,父進程繼續(xù)提供讀寫服務,子進程實現(xiàn)備份功能。BGSAVE階段只有在需要修改共享數(shù)據(jù)段的時候才進行拷貝,也就是COW(Copy On Write)。SAVE創(chuàng)建RDB文件可以通過設置多個保存條件,只要其中一個條件滿足,就可以在后臺執(zhí)行SAVE操作。

SAVE和BGSAVE命令的實現(xiàn)代碼如下:

void saveCommand(client *c) {

// BGSAVE執(zhí)行時不能執(zhí)行SAVE

if (server.rdb_child_pid != -1) {

addReplyError(c,"Background save already in progress");

return;

}

rdbSaveInfo rsi, *rsiptr;

rsiptr = rdbPopulateSaveInfo(rsi);

// 調(diào)用rdbSave函數(shù)執(zhí)行備份(阻塞當前客戶端)

if (rdbSave(server.rdb_filename,rsiptr) == C_OK) {

addReply(c,shared.ok);

} else {

addReply(c,shared.err);

}

}

/*

* BGSAVE 命令實現(xiàn) [可選參數(shù)"schedule"]

*/

void bgsaveCommand(client *c) {

int schedule = 0;

/* 當AOF正在執(zhí)行時,SCHEDULE參數(shù)修改BGSAVE的效果

* BGSAVE會在之后執(zhí)行,而不是報錯

* 可以理解為:BGSAVE被提上日程

*/

if (c->argc > 1) {

// 參數(shù)只能是"schedule"

if (c->argc == 2  !strcasecmp(c->argv[1]->ptr,"schedule")) {

schedule = 1;

} else {

addReply(c,shared.syntaxerr);

return;

}

}

// BGSAVE正在執(zhí)行,不操作

if (server.rdb_child_pid != -1) {

addReplyError(c,"Background save already in progress");

} else if (server.aof_child_pid != -1) {

// aof正在執(zhí)行,如果schedule==1,BGSAVE被提上日程

if (schedule) {

server.rdb_bgsave_scheduled = 1;

addReplyStatus(c,"Background saving scheduled");

} else {

addReplyError(c,

"An AOF log rewriting in progress: can't BGSAVE right now. "

"Use BGSAVE SCHEDULE in order to schedule a BGSAVE whenever "

"possible.");

}

} else if (rdbSaveBackground(server.rdb_filename,NULL) == C_OK) {// 否則調(diào)用rdbSaveBackground執(zhí)行備份操作

addReplyStatus(c,"Background saving started");

} else {

addReply(c,shared.err);

}

}

有了RDB文件之后,如果服務器關機了,或者需要新增一個服務器,重新啟動數(shù)據(jù)庫服務器之后,就可以通過載入RDB文件恢復之前備份的數(shù)據(jù)。 但是bgsave會耗費較長時間,不夠實時,會導致在停機的時候丟失大量數(shù)據(jù)。

AOF(Append Only File)

RDB文件保存的是數(shù)據(jù)庫的鍵值對數(shù)據(jù),AOF保存的是數(shù)據(jù)庫執(zhí)行的寫命令。

AOF的實現(xiàn)流程有三步:

append->write->fsync

append追加命令到AOF緩沖區(qū),write將緩沖區(qū)的內(nèi)容寫入到程序緩沖區(qū),fsync將程序緩沖區(qū)的內(nèi)容寫入到文件。 當AOF持久化功能處于開啟狀態(tài)時,服務器每執(zhí)行完一個命令,就會將命令以協(xié)議格式追加寫入到redisServer結構體的aof_buf緩沖區(qū),具體的協(xié)議這里不展開闡述。

AOF的持久化發(fā)生時期有個配置選項:appendfsync。該選項有三個值: always:所有內(nèi)容寫入并同步到aof文件 everysec:將aof_buf緩沖區(qū)的內(nèi)容寫入到AOF文件,如果距離上次同步AOF文件的 no:將aof_buf緩沖區(qū)中的所有內(nèi)容寫入到AOF文件,但并不對AOF文件進行同步,由操作系統(tǒng)決定何時進行同步,一般是默認情況下的30s。

AOF持久化模式每個寫命令都會追加到AOF文件,隨著服務器不斷運行,AOF文件會越來越大,為了避免AOF產(chǎn)生的文件太大,服務器會對AOF文件進行重寫,將操作相同key的相同命令合并,從而減少文件的大小。

舉個例子,要保存一個員工的名字、性別等信息:

> hset employee_12345 name "hoohack"

> hset employee_12345 good_at "php"

> hset employee_12345 gender "male"

只是錄入這個哈希鍵的狀態(tài),AOF文件就需要保存三條命令,如果還有其他,比如刪除,或者更新值的操作,那命令將會更多,文件會更大,有了重寫后,就可以適當?shù)販p少文件的大小。

AOF重寫的實現(xiàn)原理是先服務器中的數(shù)據(jù)庫,然后遍歷數(shù)據(jù)庫,找出每個數(shù)據(jù)庫中的所有鍵對象,獲取鍵值對的鍵和值,根據(jù)鍵的類型對鍵值對進行重寫。比如上面的例子,可以合并為下面的一條命令:

> hset employee_12345 name "hoohack" good_at "php" gender "male"。

AOF的重寫會執(zhí)行大量的寫入操作,Redis是單線程的,所以如果有服務器直接調(diào)用重寫,服務器就不能處理其他命令了,因此Redis服務器新起了單獨一個進程來執(zhí)行AOF重寫。

Redis執(zhí)行重寫的流程:

在子進程執(zhí)行AOF重寫時,服務端接收到客戶端的命令之后,先執(zhí)行客戶端發(fā)來的命令,然后將執(zhí)行后的寫命令追加到AOF緩沖區(qū)中,同時將執(zhí)行后的寫命令追加到AOF重寫緩沖區(qū)中。 等到子進程完成了重寫工作后,會發(fā)一個完成的信號給服務器,服務器就將AOF重寫緩沖區(qū)中的所有內(nèi)容追加到AOF文件中,然后原子性地覆蓋現(xiàn)有的AOF文件。

RDB和AOF的優(yōu)缺點

RDB持久化方式可以只通過服務器讀取數(shù)據(jù)就能加載備份中的文件到程序中,而AOF方式必須創(chuàng)建一個偽客戶端才能執(zhí)行。

RDB的文件較小,保存了某個時間點之前的數(shù)據(jù),適合做災備和主從同步。

RDB備份耗時較長,如果數(shù)據(jù)量大,在遇到宕機的情況下,可能會丟失部分數(shù)據(jù)。另外,RDB是通過配置使達到某種條件的時候才執(zhí)行,如果在這段時間內(nèi)宕機,那么這部分數(shù)據(jù)也會丟失。

AOF方式,在相同數(shù)據(jù)集的情況下,文件大小會比RDB方式的大。

AOF的持久化方式也是通過配置的不同,默認配置的是每秒同步,最快的模式是同步每一個命令,最壞的方式是等待系統(tǒng)執(zhí)行fsync將緩沖同步到磁盤文件中,大部分操作系統(tǒng)是30s。通常情況下會配置為每秒同步一次,所以最多會有1s的數(shù)據(jù)丟失。

怎樣的同步方式更好?

RDB和AOF方式結合。起一個定時任務,每小時備份一份服務器當前狀態(tài)的數(shù)據(jù),以日期和小時命名,另外起一個定時任務,定時刪除無效的備份文件(比如48小時之前)。AOF配置為1s一次。這樣一來,最多會丟失1s的數(shù)據(jù),同時如果redis發(fā)生雪崩,也能迅速恢復為前一天的狀態(tài),不至于停止服務。

總結

Redis的持久化方案也不是一成不變的,紙上的理論還需要結合實踐成果來證明其可行性。

您可能感興趣的文章:
  • redis學習之RDB、AOF與復制時對過期鍵的處理教程
  • Redis兩種持久化方案RDB和AOF詳解
  • redis的2種持久化方案深入講解
  • Linux下redis的持久化、主從同步與哨兵詳解
  • redis持久化的介紹
  • 通過Nginx+Tomcat+Redis實現(xiàn)持久會話
  • Redis持久化RDB和AOF區(qū)別詳解

標簽:伊春 南寧 定州 河源 畢節(jié) 甘南 拉薩 泰州

巨人網(wǎng)絡通訊聲明:本文標題《從源碼解讀redis持久化》,本文關鍵詞  從,源碼,解讀,redis,持久化,;如發(fā)現(xiàn)本文內(nèi)容存在版權問題,煩請?zhí)峁┫嚓P信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《從源碼解讀redis持久化》相關的同類信息!
  • 本頁收集關于從源碼解讀redis持久化的相關信息資訊供網(wǎng)民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    www国产成人免费观看视频 深夜成人网| 风间由美性色一区二区三区| 欧美亚洲一区二区在线观看| 国产精品一区二区在线观看不卡 | 亚洲午夜影视影院在线观看| 国产精品日韩成人| 久久婷婷色综合| 欧美一级一区二区| 91精品在线观看入口| 欧美日韩一区二区三区四区五区| 成人综合在线视频| 国产成人精品网址| 国产精品主播直播| 六月丁香婷婷色狠狠久久| 日韩av一区二区在线影视| 一区二区成人在线| 国产精品久久久久久户外露出 | av爱爱亚洲一区| 成人精品视频一区| 不卡av电影在线播放| bt7086福利一区国产| 成人精品高清在线| 色综合天天狠狠| 在线观看一区二区视频| 欧美老肥妇做.爰bbww视频| 欧美日韩国产片| 日韩午夜精品电影| 日韩一级完整毛片| 26uuuu精品一区二区| 国产婷婷色一区二区三区四区| 国产精品乱码一区二三区小蝌蚪| 综合色中文字幕| 亚洲综合在线第一页| 日本中文字幕一区| 国产成人av一区| 91麻豆精东视频| 欧美视频在线一区二区三区 | 国产精品18久久久久久久网站| 国产乱人伦偷精品视频不卡| 99久久精品一区| 国产精品一品二品| 91麻豆福利精品推荐| 欧美一区中文字幕| 日本一区二区综合亚洲| 亚洲国产美女搞黄色| 国内精品久久久久影院薰衣草| 国产成人自拍高清视频在线免费播放| 成人看片黄a免费看在线| 精品视频在线视频| 久久久久久久性| 亚洲高清免费视频| 国产精品香蕉一区二区三区| 欧美日韩视频专区在线播放| 2021久久国产精品不只是精品 | 蜜臀久久99精品久久久久宅男| 极品销魂美女一区二区三区| 99精品久久99久久久久| 91麻豆精品国产91久久久资源速度| 精品免费国产一区二区三区四区| 欧美国产日韩亚洲一区| 亚洲成人动漫在线免费观看| 成人激情黄色小说| 欧美一级久久久| 一区二区三区产品免费精品久久75| 精品伊人久久久久7777人| 欧美艳星brazzers| 国产精品久久影院| 久久成人久久爱| 欧美日韩成人综合在线一区二区| 国产欧美日韩综合精品一区二区| 亚洲一区二区精品3399| 成人精品视频一区二区三区尤物| 精品欧美乱码久久久久久1区2区| 亚洲国产三级在线| 91在线porny国产在线看| 欧美r级电影在线观看| 天堂在线一区二区| 欧美性猛片aaaaaaa做受| 国产精品二三区| 国产高清一区日本| 2023国产精品| 国产一区二区美女诱惑| 日韩欧美一区在线观看| 亚洲动漫第一页| 国产激情一区二区三区| 久久一区二区三区四区| 免费在线看一区| 日韩一区二区视频| 亚洲成人资源在线| 欧美二区三区91| 免费成人你懂的| 欧美久久免费观看| 日韩中文字幕亚洲一区二区va在线 | 欧美人体做爰大胆视频| 亚洲一区二区三区在线播放| 在线观看日韩国产| 一区二区成人在线观看| 91丨porny丨国产| 国产午夜久久久久| 老司机一区二区| 久久久国产精品麻豆| 大陆成人av片| 中文字幕视频一区二区三区久| 白白色 亚洲乱淫| 亚洲在线视频一区| 欧美一级日韩免费不卡| 国内成人免费视频| 国产精品欧美一区二区三区| av爱爱亚洲一区| 夜夜嗨av一区二区三区中文字幕 | 26uuu欧美日本| 国产精品亚洲а∨天堂免在线| 欧美成va人片在线观看| 日韩电影免费一区| 日韩免费看网站| 国产福利一区在线| 国产精品素人一区二区| 色婷婷精品久久二区二区蜜臂av| 亚洲成人动漫在线观看| 亚洲精品在线观看网站| 国产不卡在线播放| 亚洲一区二区精品视频| 欧美三区在线视频| 国产精品99久久久久久宅男| 亚洲一区二区三区四区五区中文| 精品国产在天天线2019| 色综合久久中文综合久久牛| 美国十次综合导航| 亚洲人成网站色在线观看| 日韩视频免费直播| 一本色道亚洲精品aⅴ| 韩国精品主播一区二区在线观看 | 国产色婷婷亚洲99精品小说| 成人app下载| 亚洲成人在线观看视频| 久久精品男人的天堂| 欧美日韩成人在线| 成人丝袜18视频在线观看| 婷婷综合另类小说色区| 亚洲欧洲日韩一区二区三区| 日韩精品专区在线| 91久久免费观看| 成人理论电影网| 综合久久久久久久| 欧美电影在哪看比较好| 成人高清视频在线观看| 午夜日韩在线观看| 国产精品国产自产拍高清av王其| 欧美高清hd18日本| 国产在线一区二区| 天天综合色天天| 一区二区三区国产豹纹内裤在线| 欧美精品亚洲二区| 99精品一区二区| 国产精品麻豆视频| 国产人妖乱国产精品人妖| 97久久超碰国产精品电影| 日本系列欧美系列| 亚洲午夜久久久久久久久久久 | 蜜臀av亚洲一区中文字幕| 一区二区三区在线观看动漫| 国产日韩欧美电影| 欧美一区在线视频| 欧美一区二区三区精品| 岛国精品在线播放| 美女国产一区二区| 亚洲男人的天堂网| 欧美精品一区在线观看| 精品理论电影在线观看| 色8久久人人97超碰香蕉987| 91麻豆免费视频| 色婷婷精品大在线视频| 国产成人免费视| 成人精品在线视频观看| 激情av综合网| 国产乱子轮精品视频| 国产精品少妇自拍| 亚洲欧美偷拍卡通变态| 亚洲精品视频在线看| 国产精品网曝门| 亚洲欧美偷拍卡通变态| 国产欧美日韩在线| 国产精品高潮呻吟| 欧美久久久久久久久中文字幕| 欧美精品自拍偷拍| 欧美大白屁股肥臀xxxxxx| 欧美午夜精品免费| 911精品国产一区二区在线| 91亚洲精华国产精华精华液| 91麻豆蜜桃一区二区三区| 日韩精品亚洲一区| 秋霞午夜av一区二区三区| 精品一区二区日韩| 久久国产免费看| 成人黄页在线观看| 欧美日韩亚州综合| 欧美精品v国产精品v日韩精品| 精品日韩欧美一区二区| 日韩欧美高清dvd碟片| 中文字幕精品综合|