日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
追溯Redis源碼記憶中的日志(redis 源碼日志)

追溯Redis源碼:記憶中的日志

Redis是一種高性能的NoSQL數(shù)據(jù)庫,已經(jīng)被廣泛應用于各種應用場景中。作為一名Redis開發(fā)者,有必要深入了解其源碼。本文將聚焦于Redis中的日志系統(tǒng),即“AOF”(Append-only file)和“RDB”(Redis Database Backup)。

AOF

AOF是Redis的一個重要特性,用于記錄每個寫入操作,即使它也已經(jīng)在內(nèi)存中執(zhí)行了。使用AOF,Redis可以在災難恢復時可靠地重建數(shù)據(jù)庫。AOF文件以追加方式構(gòu)建,記錄所有寫入操作。當Redis需要恢復數(shù)據(jù)時,它會按順序重放AOF文件中的操作。

讓我們仔細觀察一下Redis源碼中關(guān)于AOF的實現(xiàn)。在redis/src/aof.c文件中,我們可以看到如下實現(xiàn):

int flushAppendOnlyFile(int force) {
if (aof_current_size == 0) return REDIS_OK;
if (!aof_fsync && !force) {
if (aof_buf && sdslen(aof_buf) == 0) return REDIS_OK;
} else {
ssize_t nwritten;
/* Write the buffer at AOF startup or AOF re-write time. */
if (aof_rewrite_buf && aof_rewrite_bufpos > 0) {
nwritten = write(server.aof_rewrite_fd,
aof_rewrite_buf,aof_rewrite_bufpos);
aof_rewrite_bytes += nwritten;
if (nwritten != aof_rewrite_bufpos) goto werr;
aof_rewrite_bufpos = 0;
/* Since we just wrote some data to disk, if we have a pending
* AOF fsync it's now safe to perform it. */
if (aof_fsync == AOF_FSYNC_ALWAYS) aof_fsync_range();
}
if (aof_buf && sdslen(aof_buf) > 0) {
nwritten = write(server.aof_fd,aof_buf,sdslen(aof_buf));
if (nwritten != (ssize_t)sdslen(aof_buf))) {
redisLog(REDIS_WARNING,"Error writing to appending file: %s",
strerror(errno));
goto werr;
}
if (nwritten == -1) {
/* Note that we will not exit the function before trying to
* flush the data that may be in the aof_rewrite_buf. */
aof_last_write_status = REDIS_ERR;
} else {
aof_last_write_status = REDIS_OK;
}
aof_current_size += nwritten;
sdsrange(aof_buf,nwritten,-1);
}
}
}

AOF文件的寫入由flushAppendOnlyFile()函數(shù)實現(xiàn)。在空AOF文件中,aof_current_size變量的值為0,會直接返回REDIS_OK。接下來,函數(shù)會檢查是否有新的數(shù)據(jù)需要寫入AOF文件。如果沒有新的寫入數(shù)據(jù),且aof_fsync標志沒有開啟,函數(shù)返回REDIS_OK。一旦有數(shù)據(jù)需要寫入,函數(shù)會執(zhí)行如下操作:

1. 如果有重寫緩存,寫入AOF重寫緩存。

2. 如果有AOF緩存,將AOF緩存寫入磁盤。

3. 如果一次寫入是錯誤的,將把aof_last_write_status設(shè)置成REDIS_ERR。

RDB

RDB是另一種記錄Redis市場活動的方法,類似于“快照”(snapshot)。使用RDB,Redis可以在恢復時將整個數(shù)據(jù)庫快速地載入到內(nèi)存中。默認情況下,Redis每隔一段時間就會自動創(chuàng)建一個快照(RDB文件)。在一段時間內(nèi),Redis將把所有的寫入市場活動保存到內(nèi)存中,然后使用fork()系統(tǒng)調(diào)用從一個子進程中創(chuàng)建RDB文件,而不會停止主進程。

Redis的RDB實現(xiàn)在redis/src/rdb.c文件中。以下是一個基本的創(chuàng)建快照的示例:

ssize_t rdbSave(char *filename) {
char tmpfile[256];
rio rdb;
FILE *fp;
time_t start;
snprintf(tmpfile,256,"temp-%d.rdb", (int) getpid(), (int) time(NULL));

fp = fopen(tmpfile,"w");
if (!fp) {
redisLog(REDIS_WARNING,"Fled opening .rdb for saving: %s",
strerror(errno));
return REDIS_ERR;
}
rioInitWithFile(&rdb,fp);
if (rdbSaveRio(&rdb) == -1) {
fclose(fp);
server.dirty++;
unlink(tmpfile);
return REDIS_ERR;
}
if (fflush(fp) == -1) {
fclose(fp);
server.dirty++;
unlink(tmpfile);
return REDIS_ERR;
}
if (fsync(fileno(fp)) == -1) {
fclose(fp);
server.dirty++;
unlink(tmpfile);
return REDIS_ERR;
}
fclose(fp);
if (rename(tmpfile,filename) == -1) {
redisLog(REDIS_WARNING,"Fled saving .rdb: %s",
strerror(errno));
unlink(tmpfile);
return REDIS_ERR;
}
redisLog(REDIS_NOTICE,"DB saved on disk");
server.dirty = 0;
}

這是一個將快照保存到磁盤的示例。在temp中,Redis會生成一個臨時文件名,并使用文件指針來打開文件進行寫入。使用rioInitWithFile函數(shù),將rdb與該文件關(guān)聯(lián),以便Redis可以將數(shù)據(jù)轉(zhuǎn)儲到該文件中。使用rename()函數(shù)將臨時文件重命名為指定文件名。這將在一切順利的情況下將快照保存到磁盤上。如果有問題,函數(shù)將返回REDIS_ERR,并刪除臨時文件。

結(jié)論

通過分析Redis中的日志系統(tǒng),在某種程度上可以了解Redis如何管理市場活動及遇到問題時如何解決。這種深入了解對Redis開發(fā)者來說非常有用。我們敦促你花點時間研究一下Redis源代碼,以便更好地理解它在管理數(shù)據(jù)方面的工作原理。

成都服務(wù)器托管選創(chuàng)新互聯(lián),先上架開通再付費。
創(chuàng)新互聯(lián)(www.cdcxhl.com)專業(yè)-網(wǎng)站建設(shè),軟件開發(fā)老牌服務(wù)商!微信小程序開發(fā),APP開發(fā),網(wǎng)站制作,網(wǎng)站營銷推廣服務(wù)眾多企業(yè)。電話:028-86922220


網(wǎng)頁名稱:追溯Redis源碼記憶中的日志(redis 源碼日志)
分享鏈接:http://www.5511xx.com/article/cdhgphh.html