精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Redis RDB 持久化源碼深度解析:從原理到實現(xiàn)

數(shù)據(jù)庫 Redis
為避免服務(wù)器宕機著情況導(dǎo)致redis內(nèi)存數(shù)據(jù)庫數(shù)據(jù)丟失,redis默認(rèn)出通過rdb保證可靠性,本文將從源碼的角度帶讀者了解rdb讀寫時機和寫入流程。

為避免服務(wù)器宕機著情況導(dǎo)致redis內(nèi)存數(shù)據(jù)庫數(shù)據(jù)丟失,redis默認(rèn)出通過rdb保證可靠性,本文將從源碼的角度帶讀者了解rdb讀寫時機和寫入流程。

save指令觸發(fā)rdb

redis支持通過命令的方式持久化內(nèi)存數(shù)據(jù)庫數(shù)據(jù),當(dāng)我們鍵入save的時候,redis解析到這個指令之后,主線程直接調(diào)用saveCommand方法生成rdb文件落到磁盤中。

我們可以在rdb.c文件中看到該方法的實現(xiàn),可以看到為了避免臟寫等問題,saveCommand會檢查當(dāng)前是否有rdb子進程執(zhí)行,如果沒有在子進程執(zhí)行rdb持久化則直接調(diào)用rdbSave方法生成dump.rdb文件落盤:

//調(diào)用save指令其內(nèi)部調(diào)用rdbSave完成rdb文件生成
void saveCommand(redisClient *c) {
 //檢查是否子進程執(zhí)行rdb,若有則直接返回
    if (server.rdb_child_pid != -1) {
        addReplyError(c,"Background save already in progress");
        return;
    }
    //調(diào)用rdbSave
    if (rdbSave(server.rdb_filename) == REDIS_OK) {
        addReply(c,shared.ok);
    } else {
        addReply(c,shared.err);
    }
}

步入rdbSave即可看到生成臨時rdb寫入數(shù)據(jù),然后數(shù)據(jù)刷盤,最后完成文件名原子修改的操作:

int rdbSave(char *filename) {
    char tmpfile[256];
    FILE *fp;
    rio rdb;
    int error;
 //生成一個tmp文件
    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;
    }
 //調(diào)用rdbSaveRio完成數(shù)據(jù)寫入
    rioInitWithFile(&rdb,fp);
    if (rdbSaveRio(&rdb,&error) == REDIS_ERR) {
        errno = error;
        goto werr;
    }
 //直接刷盤到磁盤,避免留在系統(tǒng)輸出緩沖區(qū)
    /* 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;

    //完成寫入后文件重命名為dump.rdb
    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;
    }
    //......
    
    return REDIS_OK;

 //......
}

bgsave指令觸發(fā)rdb

同時redis也支持后臺持久化,如果用戶需要考慮redis性能問題,可以直接通過bgsave指令創(chuàng)建rdb子進程完成數(shù)據(jù)庫數(shù)據(jù)持久化。

我們同樣可以在rdb.c文件中看到bgsave指令調(diào)用的方法bgsaveCommand,可以看到如果沒有子進程進行rdb或者aof,該指令會調(diào)用rdbSaveBackground完成異步數(shù)據(jù)持久化:

//調(diào)用rdbSaveBackground創(chuàng)建一個子進程生成rdb文件,不影響主線程
void bgsaveCommand(redisClient *c) {
 //如果有子進程執(zhí)行rdb或者aof,則直接返回錯誤提醒
    if (server.rdb_child_pid != -1) {
        addReplyError(c,"Background save already in progress");
    } else if (server.aof_child_pid != -1) {
        addReplyError(c,"Can't BGSAVE while AOF log rewriting is in progress");
    } else if (rdbSaveBackground(server.rdb_filename) == REDIS_OK) {//調(diào)用rdbSaveBackground進行數(shù)據(jù)持久化
        addReplyStatus(c,"Background saving started");
    } else {
        addReply(c,shared.err);
    }
}

步入rdbSaveBackground可以看到,其內(nèi)部還會檢查一次是否有文件進行rdb,如果明確沒有之后直接fork一個子進程出來調(diào)用上文所說的rdbSave完成數(shù)據(jù)持久化到dump.rdb中:

int rdbSaveBackground(char *filename) {
    pid_t childpid;
    long long start;

    if (server.rdb_child_pid != -1) return REDIS_ERR;

     //......

    start = ustime();
    if ((childpid = fork()) == 0) {//創(chuàng)建子進程
        int retval;

        //......
        retval = rdbSave(filename);//生成rdb文件
       
        exitFromChild((retval == REDIS_OK) ? 0 : 1);//退出子進程
    } else {
       //......
    }
    return REDIS_OK; /* unreached */
}

rdb被動觸發(fā)

redis被動觸發(fā)由時間事件輪詢處理,我們可以在redis.conf配置rdb被動觸發(fā)持久化的時機,默認(rèn)配置如下當(dāng)60s生成10000或者300s 生成10次改變亦或者900s生成1次改變,我們就會執(zhí)行一次被動rdb持久化:

save 900 1
save 300 10
save 60 10000

對應(yīng)的我們可以在redis.c的serverCron函數(shù)在看到這段邏輯,它會遍歷出我們配置的保存間隔配置saveparam,通過比對這3條配置的上次保存時間計算出時間間隔,以及當(dāng)前redis變化書dirty看看是否符合要求,若如何要求則進行后臺rdb持久化:

int serverCron(struct aeEventLoop *eventLoop, long long id, void *clientData) {
   //......

    /* Check if a background saving or AOF rewrite in progress terminated. */
    if (server.rdb_child_pid != -1 || server.aof_child_pid != -1) {
        //......
        }
    } else {
        //遍歷3個配置的params,如果改變數(shù)和事件間隔配置要求則直接進行后臺被動rdb持久化
         for (j = 0; j < server.saveparamslen; j++) {
            struct saveparam *sp = server.saveparams+j;

            
            if (server.dirty >= sp->changes && //查看變化數(shù)是否大于當(dāng)前配置的changes
                server.unixtime-server.lastsave > sp->seconds && //查看時間間隔是否大于配置
                (server.unixtime-server.lastbgsave_try >
                 REDIS_BGSAVE_RETRY_DELAY ||
                 server.lastbgsave_status == REDIS_OK))
            {
              //......
              //執(zhí)行異步持久化
                rdbSaveBackground(server.rdb_filename);
                break;
            }
         }

         //......
         }
    }


  //......
 
    return 1000/server.hz;
}

其他被動落盤時機

其實有些時候我們執(zhí)行的某些執(zhí)行也會進行rdb持久化,例如flushall刷盤指令,其調(diào)用函數(shù)flushallCommand就會時間串行執(zhí)行rdb持久化:

//調(diào)用flush指令時會調(diào)用rdbSave進行數(shù)據(jù)持久化
void flushallCommand(redisClient *c) {
   //......
    if (server.saveparamslen > 0) {
        //串行執(zhí)行rdb持久化
        int saved_dirty = server.dirty;
        rdbSave(server.rdb_filename);
       //......
    }
    server.dirty++;
}

當(dāng)我們關(guān)閉redis服務(wù)器的時候也會執(zhí)行rdb串行持久化:

//服務(wù)器進程關(guān)閉時調(diào)用rdbSave生成rdb文件
int prepareForShutdown(int flags) {
      //......
    if (server.rdb_child_pid != -1) {
        //......
    }
    if (server.aof_state != REDIS_AOF_OFF) {
       //......
    }
    if ((server.saveparamslen > 0 && !nosave) || save) {
      
        if (rdbSave(server.rdb_filename) != REDIS_OK) {
             //......
            return REDIS_ERR;
        }
    }
      //......
    return REDIS_OK;
}

rdb寫入文件數(shù)據(jù)詳解

無論是rdbsave還是rdbbgsave對應(yīng)的方法,其內(nèi)部都會調(diào)用rdbSaveRio,它進行文件寫入時對應(yīng)寫入數(shù)據(jù)大體順序是:

  • 寫入REDIS大寫。
  • 補0填充長度。
  • 寫入當(dāng)前redis版本號,以筆者源碼為例則是6。
  • 遍歷數(shù)據(jù)庫寫入REDIS_RDB_OPCODE_SELECTDB表示開始存儲數(shù)據(jù)庫數(shù)據(jù),這個值默認(rèn)為254,redis會轉(zhuǎn)為八進制376寫入。
  • 遍歷當(dāng)前數(shù)據(jù)庫鍵值對key長度和key,value長度和value寫入,后續(xù)數(shù)據(jù)庫都是如此往復(fù)。
  • 所有數(shù)據(jù)庫寫完后補上REDIS_RDB_OPCODE_EOF和checksum用于后續(xù)rdb數(shù)據(jù)恢復(fù)的校驗。

為保證讀者更直觀的了解redis持久化寫入的內(nèi)容,我們可以刪除本地rdb文件,然后執(zhí)行如下執(zhí)行生成一個全新的rdb文件:

# 保存鍵值對
set key value
# 切換到1庫
select 1
# 保存鍵值對到1庫
set key-1 value
# 調(diào)用save進行數(shù)據(jù)持久化
save

正常情況下我們打開rdb文件會得到一堆類型亂碼的內(nèi)容,我們無法知曉寫入的信息,我們可以直接鍵入od生成rdb文件16進制數(shù)據(jù)及其對應(yīng)的ASCII字符:

od -A x -t x1c -v dump.rdb

最終我們就可以得到如下文件,可以看到數(shù)據(jù)格式和筆者上文所說基本一致:

#        大寫REDIS          補0            254的8進制 當(dāng)前數(shù)據(jù)庫索引   鍵值對`key`長度和`key`,`value`長度和`value`      
#000000  52  45  44  49  53  30  30  30  36  fe  00  00  03  6b  65  79
         R   E   D   I   S   0   0   0   6 376  \0  \0 003   k   e   y
000010  05  76  61  6c  75  65  fe  01  00  05  6b  65  79  2d  31  05
       005   v   a   l   u   e 
#  254的8進制 當(dāng)前數(shù)據(jù)庫索引1  鍵值對key長度和key,value長度和value    
376 001  \0 005   k   e   y   -   1 005
000020  76  61  6c  75  65  ff  76  eb  e4  80  bd  df  66  11
         v   a   l   u   e 
# EOF 255八進制 剩下8位是對應(yīng)的checksum
377   v 353 344 200 275 337   f 021
00002e

對應(yīng)的我們給出這段源碼,對應(yīng)的寫入流程如上文筆者所述:

int rdbSaveRio(rio *rdb, int *error) {
    dictIterator *di = NULL;
    dictEntry *de;
    char magic[10];
    int j;
    long long now = mstime();
    uint64_t cksum;

    if (server.rdb_checksum)
        rdb->update_cksum = rioGenericUpdateChecksum;
    snprintf(magic,sizeof(magic),"REDIS%04d",REDIS_RDB_VERSION);//對應(yīng)redis 3個0 然后版本號,當(dāng)前版本為6
    if (rdbWriteRaw(rdb,magic,9) == -1) goto werr;//上述魔數(shù)寫入rdb文件
  //遍歷數(shù)據(jù)庫
    for (j = 0; j < server.dbnum; j++) {
        redisDb *db = server.db+j;
        dict *d = db->dict;
        if (dictSize(d) == 0) continue;
        di = dictGetSafeIterator(d);
        if (!di) return REDIS_ERR;

        /* Write the SELECT DB opcode */
        if (rdbSaveType(rdb,REDIS_RDB_OPCODE_SELECTDB) == -1) goto werr;//寫入254,也就是內(nèi)容中的376
        if (rdbSaveLen(rdb,j) == -1) goto werr;//寫入當(dāng)前庫索引

        //遍歷當(dāng)前鍵值對寫入
        while((de = dictNext(di)) != NULL) {
            sds keystr = dictGetKey(de);
            robj key, *o = dictGetVal(de);
            long long expire;

            initStaticStringObject(key,keystr);
            expire = getExpire(db,&key);
            if (rdbSaveKeyValuePair(rdb,&key,o,expire,now) == -1) goto werr;//寫入鍵值對
        }
        dictReleaseIterator(di);
    }
  //......

    /* EOF opcode */
    if (rdbSaveType(rdb,REDIS_RDB_OPCODE_EOF) == -1) goto werr;//寫入結(jié)束符254 八進制為377

 
    cksum = rdb->cksum;
    memrev64ifbe(&cksum);
    if (rioWrite(rdb,&cksum,8) == 0) goto werr;//寫入8位數(shù)校驗和,其底層調(diào)用rioGenericUpdateChecksum,按照cksum到數(shù)組中獲取就對應(yīng)的值并
    return REDIS_OK;

//......
}

對應(yīng)的我們步入rdbSaveKeyValuePair即可看到redis獲取key長度和key,以及value長度和value并寫入rdb文件的核心流程:

int rdbSaveKeyValuePair(rio *rdb, robj *key, robj *val,
                        long long expiretime, long long now)
{
    //......

    /* Save type, key, value */
    if (rdbSaveObjectType(rdb,val) == -1) return -1;//寫入類型以字符串形式就是0
    if (rdbSaveStringObject(rdb,key) == -1) return -1;//寫入key長度和key
    if (rdbSaveObject(rdb,val) == -1) return -1;//寫入value長度和value
    return 1;
}

責(zé)任編輯:趙寧寧 來源: 寫代碼的SharkChili
相關(guān)推薦

2023-10-12 13:01:29

Redis數(shù)據(jù)庫

2024-07-07 21:49:22

2024-03-26 00:03:08

Redis數(shù)據(jù)RDB

2019-11-18 16:20:48

RedisRDB數(shù)據(jù)庫

2024-12-20 12:15:06

RedisRDB持久化

2023-05-11 09:12:35

RedisRDB日志

2021-07-18 07:59:42

RedisRDBAOF

2025-04-02 07:29:14

2019-05-17 08:55:49

RedisRDBAOF

2024-09-12 08:49:53

2021-10-04 21:11:18

Redis混合持久化

2020-02-18 16:14:33

RedisRDBAOF

2025-04-03 00:03:00

數(shù)據(jù)內(nèi)存網(wǎng)絡(luò)

2024-09-06 17:49:46

2021-10-18 07:43:30

RedisAOF日志RDB快照

2021-03-10 00:02:01

Redis

2025-07-23 08:19:52

網(wǎng)絡(luò)通信DHCP網(wǎng)絡(luò)

2023-03-13 08:08:48

數(shù)據(jù)庫Redis

2021-05-26 11:30:24

Java線程池代碼

2011-06-07 17:16:47

iPhone 數(shù)據(jù)
點贊
收藏

51CTO技術(shù)棧公眾號

日本韩国精品在线| 欧美激情无毛| 天天操天天干天天综合网| 精品日本一区二区三区| aaa在线视频| 久久久久亚洲| 亚洲精品乱码久久久久久按摩观| 国产一级不卡毛片| 91国内在线| 久久影院午夜片一区| 国产一区二区视频在线观看| 免费无遮挡无码永久在线观看视频| 欧美电影在线观看免费| 欧美日韩另类一区| 男人添女荫道口喷水视频| 国产理论电影在线观看| 国产精品66部| 国产精品久久久久福利| 久久久精品视频在线| 欧美日韩一二三四| 亚洲电影av在线| av亚洲天堂网| se01亚洲视频| 五月激情六月综合| 中国一级大黄大黄大色毛片| 国产视频二区在线观看| 从欧美一区二区三区| 国产精品男女猛烈高潮激情| 日韩久久精品视频| 91精品国产自产在线观看永久∴| 精品中文视频在线| 亚洲精品乱码久久久久久蜜桃欧美| 日韩精品一区二区三区av| 午夜伊人狠狠久久| 第九区2中文字幕| 欧美精品日韩少妇| 国产日韩欧美在线一区| 成人av片网址| 国产精品自偷自拍| 麻豆精品久久精品色综合| 日本精品久久中文字幕佐佐木| 国产亚洲欧美久久久久| 91成人看片| 中文字幕亚洲综合久久筱田步美 | 美女高潮久久久| 热久久这里只有| 欧美福利视频一区二区| 激情国产一区| 欧美激情精品久久久久久大尺度| 日韩激情小视频| 久久精品国产68国产精品亚洲| 国产亚洲精品成人av久久ww| 色无极影院亚洲| 性人久久久久| 亚洲人成电影网| 丝袜美腿中文字幕| 九九热线有精品视频99| 亚洲亚裔videos黑人hd| 亚洲国产天堂av| 精品久久综合| 中文字幕日韩av综合精品| 中文字幕第24页| 日韩中文字幕高清在线观看| 精品国产一区二区三区久久久| 五月激情四射婷婷| 天天做天天爱综合| 久久国产精品影视| 久久丫精品久久丫| 亚洲激情女人| 热99精品里视频精品| 国产成人无码av| 日韩二区在线观看| 91精品视频播放| 国产女人爽到高潮a毛片| 国产一区二区在线看| www 成人av com| 无码国精品一区二区免费蜜桃| 91麻豆精东视频| 亚洲在线播放电影| a级网站在线播放| 亚洲地区一二三色| 免费在线观看毛片网站| 人人精品久久| 欧美videos大乳护士334| 亚洲欧美日本一区| 久久日文中文字幕乱码| 色在人av网站天堂精品| 亚洲精品中文字幕乱码三区91| 日韩不卡在线观看日韩不卡视频| 成人网欧美在线视频| 性猛交富婆╳xxx乱大交天津| 91免费观看视频在线| 先锋影音一区二区三区| 男女羞羞视频在线观看| 一本久久a久久精品亚洲| 中文字幕22页| 麻豆一区二区| 日韩在线观看精品| 国产精品第108页| 青青草成人在线观看| 99精品99久久久久久宅男| 日本午夜在线视频| 日韩一区中文字幕| 免费成人午夜视频| 亚洲在线资源| 日韩精品在线观看视频| 国产精品免费人成网站酒店 | 国产网站一区二区| 日韩成人三级视频| 全球最大av网站久久| 欧美精品一区二区在线播放| 极品久久久久久久| 亚洲福利国产| 91精品免费久久久久久久久| 色哟哟在线观看| 亚洲欧美日韩综合aⅴ视频| 99爱视频在线| 北条麻妃一区二区三区在线观看| 色av中文字幕一区| 精品人妻无码一区二区性色| 国产精品99久久久久久久女警 | 午夜免费一区| 日本欧美在线视频| 天天干,天天操,天天射| 亚洲精品乱码久久久久久久久| 五月天婷婷激情视频| 久久久久观看| 九九热这里只有精品免费看| 一级片aaaa| 国产色91在线| 情侣黄网站免费看| 秋霞影视一区二区三区| 欧美激情综合色综合啪啪五月| 这里只有精品9| 国产免费观看久久| 久久精品99国产| 小说区图片区色综合区| 91禁外国网站| 三级小视频在线观看| 一区二区三区欧美| 亚洲免费黄色录像| 国产精品videosex性欧美| 国产精品av在线播放| 欧美捆绑视频| 一本大道av一区二区在线播放| 国产精品九九视频| 99国产精品自拍| 国产亚洲精品久久飘花| 后进极品白嫩翘臀在线播放| 日韩精品一区二区三区视频| 曰本女人与公拘交酡| 国产精品资源在线观看| 日日噜噜夜夜狠狠久久丁香五月 | 欧美系列日韩一区| 成人激情五月天| 蜜臂av日日欢夜夜爽一区| 亚洲欧美国产不卡| 日本久久久久| 欧美xxxx做受欧美| 亚洲狼人综合网| 天天色图综合网| 亚洲一级中文字幕| 日韩福利视频导航| 永久免费在线看片视频| 视频精品国内| 97国产精品人人爽人人做| 天堂成人在线视频| 色狠狠一区二区三区香蕉| 蜜桃av乱码一区二区三区| 久久精品国产99| 99热都是精品| 精品女人视频| 日韩av电影免费观看高清| av在线首页| 欧美一区二区啪啪| 久久精品亚洲无码| 91网站最新网址| 午夜久久久精品| 欧美激情成人在线| 精品久久久久久一区二区里番| 小草在线视频免费播放| 在线看日韩av| 精品国产av鲁一鲁一区| 欧美日韩日本国产| 任你操精品视频| 风流少妇一区二区| 国产精品无码一区二区在线| 欧美艳星介绍134位艳星| 亚洲free性xxxx护士hd| av资源新版天堂在线| 亚洲最大中文字幕| 成人高潮片免费视频| 欧美日韩亚洲视频| 91免费公开视频| 99久久99久久久精品齐齐| 国产免费又粗又猛又爽| 国产精品mv在线观看| 欧洲一区二区在线观看| 日韩中文一区二区| 国产精品国产福利国产秒拍| av观看在线| 一本色道久久88综合日韩精品| av av片在线看| 在线观看视频一区| 久久久久99精品| 国产精品国产三级国产普通话99 | 久久精品无码一区二区三区| 在线观看免费看片| 日本在线不卡视频| 国产一区二区三区乱码| 色135综合网| 蜜桃视频在线观看91| 欧美日韩黄色| 国产精品香蕉国产| 中文字幕成在线观看| 久久香蕉国产线看观看网| 青青色在线视频| 欧美sm极限捆绑bd| 91高潮大合集爽到抽搐| 在线观看亚洲一区| 日韩精品一区二区亚洲av| 亚洲国产毛片aaaaa无费看| 天天操天天摸天天舔| 久久久www免费人成精品| 久久久久无码国产精品一区李宗瑞 | 在线观看国产精品日韩av| 深夜福利视频网站| 欧美不卡一区二区| 国产麻豆免费视频| 欧美日韩免费不卡视频一区二区三区| 一级黄色大片视频| 一本一本久久a久久精品综合麻豆 一本一道波多野结衣一区二区 | 欧美国产成人精品一区二区三区| 一区av在线播放| 日本高清一二三区| 亚洲图片激情小说| 色www亚洲国产阿娇yao| 欧美激情中文不卡| 性欧美精品男男| 国产亚洲精品资源在线26u| 波多野结衣福利| 91在线高清观看| 欧美丰满少妇人妻精品| 99久久久精品| 亚洲成人av免费在线观看| av福利精品导航| 欧美精品欧美极品欧美激情| 成人午夜视频免费看| 美女露出粉嫩尿囗让男人桶| 风流少妇一区二区| 91丝袜在线观看| gogogo免费视频观看亚洲一| 一区二区视频观看| 91色九色蝌蚪| 午夜时刻免费入口| 中文字幕va一区二区三区| 日本污视频网站| 专区另类欧美日韩| 午夜免费激情视频| 亚洲香蕉伊在人在线观| 日本一二三区视频| 欧美性xxxx极品高清hd直播| 无码视频在线观看| 欧美精品久久一区| 国产xxxxxx| 亚洲国产精久久久久久| 青青视频在线观| 中文字幕在线日韩| 成人看av片| 97视频免费在线看| 欧美三级精品| 成人网中文字幕| 嗯用力啊快一点好舒服小柔久久| 精品一区二区日本| 国产一区二区三区天码| 一区二区三区视频在线播放| 中文字幕av亚洲精品一部二部| 高清无码视频直接看| 先锋亚洲精品| 99国产精品久久久久久| 成人亚洲一区二区一| 熟女丰满老熟女熟妇| 中文字幕久久午夜不卡| 欧美日韩在线国产| 第一福利永久视频精品| 在线亚洲欧美日韩| 亚洲福利在线看| www.中文字幕久久久| 欧美另类在线观看| 欧美黑人疯狂性受xxxxx野外| 国产日韩av高清| 韩国女主播一区二区三区| 欧美日韩在线不卡一区| 亚洲色图88| 久久无码高潮喷水| 国产中文字幕精品| 国产交换配乱淫视频免费| 亚洲色图制服丝袜| 日韩精品在线观看免费| 日韩一区二区在线免费观看| 亚洲 精品 综合 精品 自拍| 久久九九免费视频| 伊人久久综合一区二区| 91视频免费进入| 欧美精品一区二区久久| 精品国偷自产一区二区三区| 日本aⅴ免费视频一区二区三区| 五月天丁香社区| 国产精品国产自产拍高清av王其| 国产精品100| 日韩欧美精品三级| 天天在线视频色| 欧美壮男野外gaytube| 亚洲精品v亚洲精品v日韩精品| 手机看片福利永久国产日韩| 亚洲伦伦在线| 免费在线观看日韩av| 国产精品久久国产精麻豆99网站| 青青操免费在线视频| 日韩午夜在线观看视频| 拍真实国产伦偷精品| 日本国产精品视频| 日韩丝袜视频| 久久国产精品网| 国产一区二区三区视频在线播放| 欧美成人国产精品一区二区| 午夜精品影院在线观看| 亚洲av无码国产精品久久不卡| 色偷偷噜噜噜亚洲男人| 成人精品电影在线| 欧美h视频在线| 国产欧美69| 国模无码视频一区| 亚洲永久精品大片| 国产成人毛毛毛片| 久久亚洲精品小早川怜子66| 欧美美女被草| 一区二区视频在线播放| 美女爽到高潮91| 懂色av蜜桃av| 欧美性一二三区| 粉嫩av一区| 国产精品视频自在线| 欧洲grand老妇人| 亚洲欧美日韩一级| 国产精品不卡在线| 亚洲中文字幕一区二区| 精品国产视频在线| 国产美女视频一区二区| 91精品国产毛片武则天| 国产高清不卡二三区| 久视频在线观看| 亚洲第一福利在线观看| 欧美裸体视频| 日本一区免费| 看国产成人h片视频| 糖心vlog免费在线观看| 91精品在线麻豆| 青青在线视频| 极品日韩久久| 视频在线观看91| 久久久精品成人| 这里只有精品视频在线观看| 在线你懂的视频| 国产一区自拍视频| 另类亚洲自拍| 少妇高潮惨叫久久久久| 日韩一区二区视频| 91超碰免费在线| 久久影视中文粉嫩av| 免费精品视频在线| 曰本女人与公拘交酡| 日韩精品视频中文在线观看| av资源亚洲| 色乱码一区二区三区熟女| 国产suv精品一区二区三区| 亚洲精品77777| 亚洲性线免费观看视频成熟| 国产美女亚洲精品7777| 亚洲中文字幕无码专区| 国产精品美女视频| 亚洲精品综合久久| 国产精品第3页| 欧美体内she精视频在线观看| 午夜视频在线观看国产| 欧美午夜精品一区二区三区| 91一区二区三区在线| 久久久综合亚洲91久久98| 另类小说视频一区二区| 日本熟女一区二区| 正在播放亚洲1区| 99re6热只有精品免费观看| 日韩一级免费在线观看| 亚洲卡通欧美制服中文| 国产小视频免费在线网址| 亚洲在线www| 视频一区在线播放| 国产亚洲欧美久久久久| 在线性视频日韩欧美| 老牛精品亚洲成av人片|