亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 數據庫 > Redis > 正文

從源碼解讀redis持久化

2020-03-17 12:33:03
字體:
來源:轉載
供稿:網友

源碼,redis,持久化

為什么需要持久化?

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

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

1、客戶端發送一個寫指令給數據庫(此時數據在客戶端的內存)

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

3、數據庫發起一個系統調用,把數據寫到磁盤(此時數據在內核的內存)

4、操作系統把數據傳輸到磁盤控制器(數據此時在磁盤緩存中)

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

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

POSIX API也提供了一個系統調用讓內核強制將緩存數據寫入到磁盤中,比較常見的就是fsync系統調用。

int fsync(int fd);

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

持久化

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

源碼,redis,持久化

Redis的持久化

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

RDB

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

SAVE和BGSAVE命令的實現代碼如下:

void saveCommand(client *c) {// BGSAVE執行時不能執行SAVEif (server.rdb_child_pid != -1) {addReplyError(c,"Background save already in progress");return;}rdbSaveInfo rsi, *rsiptr;rsiptr = rdbPopulateSaveInfo(&rsi);// 調用rdbSave函數執行備份(阻塞當前客戶端)if (rdbSave(server.rdb_filename,rsiptr) == C_OK) {addReply(c,shared.ok);} else {addReply(c,shared.err);}}/** BGSAVE 命令實現 [可選參數"schedule"]*/void bgsaveCommand(client *c) {int schedule = 0;/* 當AOF正在執行時,SCHEDULE參數修改BGSAVE的效果* BGSAVE會在之后執行,而不是報錯* 可以理解為:BGSAVE被提上日程*/if (c->argc > 1) {// 參數只能是"schedule"if (c->argc == 2 && !strcasecmp(c->argv[1]->ptr,"schedule")) {schedule = 1;} else {addReply(c,shared.syntaxerr);return;}}// BGSAVE正在執行,不操作if (server.rdb_child_pid != -1) {addReplyError(c,"Background save already in progress");} else if (server.aof_child_pid != -1) {// aof正在執行,如果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) {// 否則調用rdbSaveBackground執行備份操作addReplyStatus(c,"Background saving started");} else {addReply(c,shared.err);}}

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

AOF(Append Only File)

RDB文件保存的是數據庫的鍵值對數據,AOF保存的是數據庫執行的寫命令。

AOF的實現流程有三步:

append->write->fsync

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

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

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

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

> hset employee_12345 name "hoohack"

> hset employee_12345 good_at "php"

> hset employee_12345 gender "male"

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

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

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

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

Redis執行重寫的流程:

源碼,redis,持久化

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

RDB和AOF的優缺點

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

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

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

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

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

怎樣的同步方式更好?

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

總結

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


注:相關教程知識閱讀請移步到Redis頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
精品国产区一区二区三区在线观看| 国产97在线|亚洲| 欧洲成人在线观看| 国产成人综合一区二区三区| 国产精品久久久久久网站| 久久躁狠狠躁夜夜爽| 久久久91精品国产一区不卡| 欧美精品在线免费播放| 亚洲国产精品资源| 国产成人精品一区二区在线| 久久久久久999| 九色精品美女在线| 成人激情免费在线| 亚洲福利视频免费观看| 裸体女人亚洲精品一区| 日韩美女免费线视频| 成人乱人伦精品视频在线观看| 色偷偷噜噜噜亚洲男人的天堂| 久久久国产精品亚洲一区| y97精品国产97久久久久久| 精品视频在线观看日韩| 欧美日韩亚洲激情| 欧美激情亚洲综合一区| 中文字幕亚洲色图| 精品久久香蕉国产线看观看gif| 欧洲美女免费图片一区| 国产专区精品视频| 日韩暖暖在线视频| 久久久精品2019中文字幕神马| 欧美亚洲国产另类| 欧美精品www在线观看| 国产一区二区三区网站| 欧美另类69精品久久久久9999| 日韩女优人人人人射在线视频| 亚洲成人动漫在线播放| 成人精品视频在线| 欧美日韩国产精品一区二区不卡中文| 亚洲精品福利免费在线观看| 亚洲加勒比久久88色综合| 91大神福利视频在线| 国产精品久久久久77777| 久久综合电影一区| 九九久久综合网站| 欧美精品日韩www.p站| 国产91精品在线播放| 久久国产精品久久精品| 欧美国产日韩一区二区三区| 欧美成年人视频网站| 日韩精品日韩在线观看| 欧美精品做受xxx性少妇| 亚洲女人天堂色在线7777| 不卡av电影院| 久色乳综合思思在线视频| 日韩av有码在线| 国产日产欧美a一级在线| 激情亚洲一区二区三区四区| 国产精品爽黄69天堂a| 亚洲一品av免费观看| 国产自摸综合网| 亚洲无av在线中文字幕| 国产+人+亚洲| 国产剧情日韩欧美| 最近中文字幕2019免费| 在线观看日韩av| 欧美激情xxxxx| 九色精品免费永久在线| 91精品久久久久久久久久| 亚洲精品动漫久久久久| 欧美亚洲在线播放| 红桃视频成人在线观看| 欧美日韩国产一中文字不卡| 欧美成人四级hd版| 亚洲欧美另类自拍| 91精品视频观看| 日本成人在线视频网址| 国产美女扒开尿口久久久| 欧美一区二区大胆人体摄影专业网站| 国产精品h在线观看| 亚洲天堂一区二区三区| 精品国产乱码久久久久久虫虫漫画| 欧美激情视频一区二区| 亚洲情综合五月天| 日韩性xxxx爱| 亚洲视频视频在线| 欧美性xxxx在线播放| 91成人在线播放| 丝袜情趣国产精品| 国产精品男人爽免费视频1| 在线视频日韩精品| 亚洲午夜未删减在线观看| 91亚洲va在线va天堂va国| 日韩av电影院| 亚洲国产成人一区| 黑人欧美xxxx| 日韩中文字幕av| 久久乐国产精品| 欧美人在线观看| 中文字幕日韩欧美在线视频| 亚洲www永久成人夜色| 久久视频免费在线播放| 2019精品视频| 亚洲一区二区三区香蕉| 亚洲精品久久视频| 都市激情亚洲色图| 国产成人一区二区在线| 久久在线免费观看视频| 久久久久久高潮国产精品视| 亚洲人成网站免费播放| 一个色综合导航| 欧美高清在线观看| 日韩高清电影免费观看完整| 狠狠综合久久av一区二区小说| 亚洲图中文字幕| 国产日产久久高清欧美一区| www.日韩av.com| 久久精品91久久香蕉加勒比| 欧美激情图片区| 亚洲欧美一区二区激情| 日韩av快播网址| 亚洲午夜女主播在线直播| 国内精品久久久久久中文字幕| 国产精品吴梦梦| 欧美成人性色生活仑片| 亚洲天堂网在线观看| 亚洲欧美国产日韩天堂区| 欧美日韩国产第一页| 另类专区欧美制服同性| 国外成人在线播放| 色yeye香蕉凹凸一区二区av| 91九色国产社区在线观看| 亚洲久久久久久久久久久| 亚洲香蕉av在线一区二区三区| 亚洲欧美在线播放| 色青青草原桃花久久综合| 精品香蕉在线观看视频一| 日本精品中文字幕| 伊人伊成久久人综合网小说| 国产香蕉精品视频一区二区三区| 日韩免费在线电影| 国产精品久久久久久久久久ktv| 国产精品美女免费视频| 亚洲欧美色婷婷| 国内精品久久久久久久久| 91在线视频精品| 在线日韩av观看| 欧美精品激情在线| 日韩精品有码在线观看| 日韩高清a**址| 国产日本欧美一区| 国产精品第七十二页| 色偷偷av亚洲男人的天堂| 一区二区三区视频在线| 日韩欧美在线视频日韩欧美在线视频| 国产午夜精品一区理论片飘花| 久久久久久噜噜噜久久久精品| 久久久久久久久久av| 亚洲天堂av在线免费观看| 国产乱肥老妇国产一区二| 神马国产精品影院av| 日韩av在线免费观看| 国产美女搞久久| 青青精品视频播放| 国产日韩中文字幕| 91久久久久久久一区二区|