標籤:
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持久化