Redis 學習 ---- 10.RDB持久化

來源:互聯網
上載者:User

標籤:

10.1 RDB檔案的建立和載入
有倆個Redis命令可以用於產生RDB檔案,一個是SAVE,另一個是BGSAVE。

SAVE命令會阻塞Redis伺服器處理序,直到RDB檔案建立完畢為止。

BGSAVE命令會派生出一個子金城關負責建立RDB檔案,伺服器處理序繼續處理命令請求。


RDB檔案的載入工作是在伺服器啟動時自動執行的,因為AOF檔案的更新頻率通常比RDB檔案的更新頻率高,所以:
① 如果伺服器開啟了AOF持久化功能,那麼伺服器會優先使用過AOF檔案來還原資料庫狀態;
② 只有在AOF持久化功能處於關閉狀態時,伺服器才會使用RDB檔案來還原資料庫狀態。


伺服器判斷該用哪個檔案來還原資料庫狀態的流程如所示:



10.1.2 BGSAVE命令執行時的伺服器狀態

int rdbSave(char *filename) {//save命令執行函數    char tmpfile[256];    FILE *fp;    rio rdb;    int error;    snprintf(tmpfile,256,"temp-%d.rdb", (int) getpid());    fp = fopen(tmpfile,"w");    if (!fp) {        redisLog(REDIS_WARNING, "Failed opening .rdb for saving: %s",            strerror(errno));        return REDIS_ERR;    }    rioInitWithFile(&rdb,fp);    if (rdbSaveRio(&rdb,&error) == REDIS_ERR) {        errno = error;        goto werr;    }    /* Make sure data will not remain on the OS's output buffers */    if (fflush(fp) == EOF) goto werr;    if (fsync(fileno(fp)) == -1) goto werr;    if (fclose(fp) == EOF) goto werr;    /* Use RENAME to make sure the DB file is changed atomically only     * if the generate DB file is ok. */    if (rename(tmpfile,filename) == -1) {        redisLog(REDIS_WARNING,"Error moving temp DB file on the final destination: %s", strerror(errno));        unlink(tmpfile);        return REDIS_ERR;    }    redisLog(REDIS_NOTICE,"DB saved on disk");    server.dirty = 0;    server.lastsave = time(NULL);    server.lastbgsave_status = REDIS_OK;    return REDIS_OK;werr:    redisLog(REDIS_WARNING,"Write error saving DB on disk: %s", strerror(errno));    fclose(fp);    unlink(tmpfile);    return REDIS_ERR;}


在BGSAVE命令執行期間,SAVE、BGSAVE命令會被伺服器拒絕,


BGSAVE和BGREWRITEAOF不能同時執行:
① 如果BGSAVE正在執行,那麼BGREWRITEAOF命令會被延遲到BGSAVE命令執行完畢之後執行。
② 如果BGREWRITEAOF命令正在執行,那麼用戶端發送的BGSAVE命令會被伺服器拒絕。


10.2 自動間隔性儲存
如果向伺服器提供以下配置:
save 900 1
save 300 10
save 60  10000
那麼只要滿足任意一個,BGSAVE命令就會被執行:
伺服器在900秒之內,對資料庫進行了至少1次修改。
伺服器在300秒之內,對資料庫進行了至少10次修改。
伺服器在60秒之內,對資料庫進行了至少10000次修改。


serverCron預設每隔100毫秒就會執行一次,其中一項工作就是檢查save選項所設定的
儲存條件是否已經滿足。


伺服器狀態中的儲存條件



RDB檔案結構:

RDB檔案資料庫結構:


          

key_value_pairs結構:



10.5 重點回顧
Ⅰ RDB檔案用於儲存和還原Redis伺服器所有資料庫中的所有鍵值對資料。
Ⅱ SAVE命令由伺服器處理序直接執行儲存操作,所有該命令會阻塞伺服器。
Ⅲ BGSAVE命令由紫禁城執行儲存操作,所以該命令不會阻塞伺服器。
Ⅳ 伺服器狀態中會儲存所有用save選項設定的儲存條件,當任意一個儲存條件被滿足時,伺服器會自動執BGSAVE命令。
Ⅴ RDB檔案是一個經過壓縮的二進位檔案,由多個部分組成。
Ⅵ 對於不同類型的鍵值對,RDB檔案會使用不同的方式來儲存他們。




Redis 學習 ---- 10.RDB持久化

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.