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

聊聊 Redis 的發(fā)布訂閱設(shè)計與實(shí)現(xiàn)

數(shù)據(jù)庫 Redis 開發(fā)
關(guān)于 Redis 發(fā)布訂閱的設(shè)計與實(shí)現(xiàn),本質(zhì)上就是通過一個個鏈表管理訂閱者,通過pub指令定位到channel后將消息遍歷發(fā)送到對應(yīng)客戶端socket上。

借一個午休的時光整理一下關(guān)于redis發(fā)布訂閱源碼的設(shè)計與實(shí)現(xiàn),通過本文的閱讀,你將會對發(fā)布訂閱模型的設(shè)計思想以及對哨兵間選舉通信的流程有著更底層的視角。

一、詳解redis中發(fā)布訂閱的設(shè)計

1. channel的設(shè)計

redis服務(wù)端啟動時,會初始化一個記錄channel以及channel訂閱者的鍵值對結(jié)構(gòu),它用channel的名稱作為key,用一個鏈表記錄這個訂閱這個channel的客戶端:

對此我們給出redis初始化函數(shù)initServer的代碼片段,可以看到其內(nèi)部調(diào)用dictCreate方法為pubsub_channels 這個記錄channel和channel訂閱者的指針初始化了一個頻道名稱為key,鏈表為value的字典:

void initServer(void) {
    //......
    // 初始化pubsub_channels存儲頻道信息,keylistDictType用頻道名稱作為key,訂閱者list作為value
    server.pubsub_channels = dictCreate(&keylistDictType,NULL);
 //......
}

2. pub/sub的實(shí)現(xiàn)

當(dāng)客戶端1通過SUBSCRIBE mychannel訂閱mychannel這個頻道,本質(zhì)上就是redis服務(wù)端解析SUBSCRIBE指令并調(diào)用subscribeCommand函數(shù),該方法會檢查這個channel是否存在,如果不存在則則以channel名稱為key,初始化一個鏈表作為value,將訂閱這個channel的客戶端追加到鏈表中。反之,如果channel存在則直接將客戶端信息存入鏈表即可:

圖片==圖片==

對此我們給出對應(yīng)的源碼實(shí)現(xiàn),該函數(shù)subscribeCommand位于pubsub.c可以看到其入口邏輯就是遍歷參數(shù)得到當(dāng)前客戶端想訂閱的頻道,然后調(diào)用pubsubSubscribeChannel將該客戶端追加到這個頻道的鏈表上:

void subscribeCommand(redisClient *c) {
    int j;
    //遍歷頻道將該客戶端存入
    for (j = 1; j < c->argc; j++)
        pubsubSubscribeChannel(c,c->argv[j]);
     //將當(dāng)前客戶端標(biāo)識為做了發(fā)布訂閱   
    c->flags |= REDIS_PUBSUB;
}

我們步入pubsubSubscribeChannel方法即可看到上圖所說明的邏輯,如果對應(yīng)的頻道不存在,則初始化然后將客戶端追加到鏈表中,反之直接追加到鏈表中:

int pubsubSubscribeChannel(redisClient *c, robj *channel) {
    //頻道添加到pubsub_channels中
    if (dictAdd(c->pubsub_channels,channel,NULL) == DICT_OK) {
        retval = 1;
        incrRefCount(channel);
        //查看這個頻道的訂閱者鏈表是否存在
        de = dictFind(server.pubsub_channels,channel);
        //如果頻道不存在,則直接初始化鏈表
        if (de == NULL) {
            clients = listCreate();
            dictAdd(server.pubsub_channels,channel,clients);
            incrRefCount(channel);
        } else {
            clients = dictGetVal(de);
        }
        
        //將客戶端追加的鏈表尾巴
        listAddNodeTail(clients,c);
    }
   //......
}

同理,當(dāng)我們通過redis客戶端鍵入publish mychannel "hello"向mychannel 發(fā)送一個hello消息時,redis服務(wù)端會解析這條publish指令并調(diào)用publishCommand完成消息發(fā)布,通知到各個訂閱者:

圖片==圖片==

我們給出publishCommand的源碼,位于pubsub.c這個源代碼文件中,可以看到這段代碼會將channel和對應(yīng)的消息傳入pubsubPublishMessage方法中,并返回接收者數(shù):

void publishCommand(redisClient *c) {
    //發(fā)布消息返回接收者 PUBLISH <channel> <message>,返回接收者的數(shù)量
    int receivers = pubsubPublishMessage(c->argv[1],c->argv[2]);
   //......
}

步入pubsubPublishMessage即可看到發(fā)布消息的核心邏輯,可以看到這個方法用receivers來記錄接收的通知者,它會先進(jìn)行精準(zhǔn)匹配,到pubsub_channels找到和channel名字一致的channel并向該channel的訂閱者發(fā)布消息,然后在進(jìn)行模糊匹配,遍歷所有的channel找到模糊匹配上的channel并向訂閱者發(fā)布消息:

int pubsubPublishMessage(robj *channel, robj *message) {
    int receivers = 0;
    dictEntry *de;
    listNode *ln;
    listIter li;

    
    //查找名字相同的channel
    de = dictFind(server.pubsub_channels,channel);
    if (de) {
        list *list = dictGetVal(de);
       //......
  //移動至訂閱者鏈表首部
        listRewind(list,&li);
        //遍歷并向這些訂閱者發(fā)布消息
        while ((ln = listNext(&li)) != NULL) {
            redisClient *c = ln->value;

          //......
          //發(fā)布消息
            addReplyBulk(c,message);
            //接收數(shù)++
            receivers++;
        }
    }
    
    if (listLength(server.pubsub_patterns)) {
     //移動至channel鏈表首部
        listRewind(server.pubsub_patterns,&li);
        channel = getDecodedObject(channel);
        //遍歷channel
        while ((ln = listNext(&li)) != NULL) {
            pubsubPattern *pat = ln->value;
   //找到匹配的channel并發(fā)布消息
            if (stringmatchlen((char*)pat->pattern->ptr,
                                sdslen(pat->pattern->ptr),
                                (char*)channel->ptr,
                                sdslen(channel->ptr),0)) {
               //......
                addReplyBulk(pat->client,message);
                receivers++;
            }
        }
    }
    return receivers;
}

3. 哨兵如何利用發(fā)布訂閱完成消息通信的

關(guān)于pub/sub模式,redis中的哨兵就很好的利用這種模式進(jìn)行溝通和選舉等各個工作,當(dāng)我們的redis以哨兵的方式啟動時,redis會定期執(zhí)行哨兵的定時任務(wù),該任務(wù)會在檢查連接時檢查發(fā)布訂閱master的連接是否為空,若為空則調(diào)用異步連接綁定的方式訂閱master的"__sentinel__:hello"頻道,而該頻道主要負(fù)責(zé)下面這些工作:

  • Sentinel 實(shí)例的發(fā)現(xiàn)與信息交換:每個 Sentinel 實(shí)例會定期通過 __sentinel__:hello 頻道發(fā)布自己的信息,包括 Sentinel 的 IP 地址、端口、運(yùn)行 ID、當(dāng)前配置的紀(jì)元(epoch)等。 其他 Sentinel 實(shí)例會訂閱這個頻道,從而感知到其他 Sentinel 的存在,并獲取它們的信息。 監(jiān)控主從節(jié)點(diǎn)的狀態(tài):
  • Sentinel 實(shí)例通過 __sentinel__:hello 頻道共享它們對 Redis 主節(jié)點(diǎn)和從節(jié)點(diǎn)的監(jiān)控信息:例如,某個 Sentinel 實(shí)例檢測到主節(jié)點(diǎn)不可用時,會通過這個頻道通知其他 Sentinel 實(shí)例,以便它們確認(rèn)并共同決定是否進(jìn)行故障轉(zhuǎn)移。 故障轉(zhuǎn)移的協(xié)調(diào):

在故障轉(zhuǎn)移過程中,Sentinel 實(shí)例會通過 __sentinel__:hello 頻道交換信息,協(xié)調(diào)誰來執(zhí)行故障轉(zhuǎn)移操作,并確保只有一個 Sentinel 實(shí)例負(fù)責(zé)執(zhí)行。

void sentinelReconnectInstance(sentinelRedisInstance *ri) {
    //......
   
    //檢查發(fā)布訂閱是否為空
    if ((ri->flags & (SRI_MASTER|SRI_SLAVE)) && ri->pc == NULL) {
     //若為空則pc指針指向異步連接
        ri->pc = redisAsyncConnectBind(ri->addr->ip,ri->addr->port,REDIS_BIND_ADDR);
        if (ri->pc->err) {
         //......
        } else {//如果沒有報錯,則訂閱__sentinel__:hello頻道
            int retval;

            //......
            //哨兵訂閱 __sentinel__:hello 頻道(也就是下面的常量SENTINEL_HELLO_CHANNEL),通過sentinelReceiveHelloMessages處理回調(diào)
            retval = redisAsyncCommand(ri->pc,
                sentinelReceiveHelloMessages, NULL, "SUBSCRIBE %s",
                    SENTINEL_HELLO_CHANNEL);
          //......
            }
        }
    }
   //......
}

通過master的hello頻道,哨兵會定期publish自己的信息到hello頻道,其他哨兵就可以基于這個頻道發(fā)現(xiàn)其他的哨兵由此完成通信:

對此我們給出哨兵定期發(fā)送hello的函數(shù)入口sentinelSendPeriodicCommands,這個方法會被定期執(zhí)行,其內(nèi)部邏輯一旦檢查到pub/sub時間間隔過長時就會發(fā)送調(diào)用sentinelSendHello向hello頻道發(fā)送當(dāng)前哨兵的信息讓其他哨兵感知:

void sentinelSendPeriodicCommands(sentinelRedisInstance *ri) {
    //......
    ping_period = ri->down_after_period;
    if (ping_period > SENTINEL_PING_PERIOD) ping_period = SENTINEL_PING_PERIOD;

    if ((ri->flags & SRI_SENTINEL) == 0 &&
        (ri->info_refresh == 0 ||
        (now - ri->info_refresh) > info_period))
    {
       //......
    } else if ((now - ri->last_pong_time) > ping_period) {//超過ping間隔發(fā)ping
     //......
    } else if ((now - ri->last_pub_time) > SENTINEL_PUBLISH_PERIOD) {
    
        //超過pub最大間隔SENTINEL_PUBLISH_PERIOD則發(fā)送發(fā)送哨兵自身ip端口等信息到hello頻道
        sentinelSendHello(ri);
    }
}

步入sentinelSendHello即可看到我們上文所說的邏輯,可以看到當(dāng)前哨兵會組裝個人信息通過異步連接cc指針維護(hù)的連接信息PUBLISH 個人信息到hello頻道:

int sentinelSendHello(sentinelRedisInstance *ri) {
   //......
   //獲取當(dāng)前哨兵ip
    if (sentinel.announce_ip) {
        announce_ip = sentinel.announce_ip;
    } else {
        if (anetSockName(ri->cc->c.fd,ip,sizeof(ip),NULL) == -1)
            return REDIS_ERR;
        announce_ip = ip;
    }
    //獲取當(dāng)前哨兵端口
    announce_port = sentinel.announce_port ?
                    sentinel.announce_port : server.port;

    //將數(shù)據(jù)拼接到payload中
    snprintf(payload,sizeof(payload),
        "%s,%d,%s,%llu," /* Info about this sentinel. */
        "%s,%s,%d,%llu", /* Info about current master. */
        announce_ip, announce_port, server.runid,
        (unsigned long long) sentinel.current_epoch,
        /* --- */
        master->name,master_addr->ip,master_addr->port,
        (unsigned long long) master->config_epoch);
    //將組裝的哨兵信息publish到hello頻道(SENTINEL_HELLO_CHANNEL就是hello頻道的常量變量值)   
    retval = redisAsyncCommand(ri->cc,
        sentinelPublishReplyCallback, NULL, "PUBLISH %s %s",
            SENTINEL_HELLO_CHANNEL,payload);
    //......
}

二、小結(jié)

自此我們將發(fā)現(xiàn)redis發(fā)布訂閱的設(shè)計與實(shí)現(xiàn),本質(zhì)上就是通過一個個鏈表管理訂閱者,通過pub指令定位到channel后將消息遍歷發(fā)送到對應(yīng)客戶端socket上,這里筆者也簡單的補(bǔ)充一句,從源碼中我們可以看到redis的發(fā)布訂閱模型沒有持久化機(jī)制,所以對于可靠性要求高的場景筆者還是不太建議使用pub/sub。

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

2025-03-20 09:54:47

2025-05-22 08:15:00

2023-05-26 08:24:17

短信渠道模型

2020-09-15 10:25:13

Redis命令Java

2022-10-18 08:28:38

運(yùn)營活動實(shí)現(xiàn)邏輯整體協(xié)作

2024-01-10 08:16:08

Redis集成JMS

2025-02-19 10:27:48

哨兵Redis故障轉(zhuǎn)移

2025-01-23 08:53:15

2021-08-05 06:54:05

觀察者訂閱設(shè)計

2024-07-02 11:42:53

SpringRedis自定義

2020-01-02 09:57:09

Redis訂閱發(fā)布

2022-12-02 07:28:58

Event訂閱模式Spring

2009-11-05 10:07:37

WCF設(shè)計模式

2024-11-04 08:00:00

Netty客戶端

2023-12-14 10:10:09

pythonRedis開發(fā)

2024-05-14 08:03:51

C#EventArgs?屬性

2024-10-11 11:50:05

Redis適用場景

2023-02-10 08:59:42

業(yè)務(wù)技術(shù)核心

2022-08-15 09:02:22

Redis模式訂閱消息

2021-06-01 06:59:58

運(yùn)維Jira設(shè)計
點(diǎn)贊
收藏

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

亚洲视频久久| 国产乱码精品一区二区三区亚洲人| 成人涩涩免费视频| 97精品视频在线| 国内精品卡一卡二卡三| 99精品美女视频在线观看热舞| 亚洲激情六月丁香| 久久资源亚洲| 国产精品久久无码一三区| 国产精品av一区二区| 亚洲另类欧美自拍| 在线一区二区不卡| 密臀av在线播放| 国产精品麻豆欧美日韩ww| 丁香婷婷久久久综合精品国产| 精品免费囯产一区二区三区| 围产精品久久久久久久| 亚洲国产另类久久精品 | 日本精品一二三| 成人欧美大片| 亚洲欧美日韩国产一区二区三区 | 邪恶网站在线观看| heyzo高清国产精品| 久久毛片高清国产| 99re国产在线播放| 亚洲天堂网在线视频| 日韩一级不卡| 久久伊人精品一区二区三区| 88久久精品无码一区二区毛片| 国产一区精品二区| 欧美综合视频在线观看| xxxx18hd亚洲hd捆绑| 成人短视频在线| 久久久亚洲精品石原莉奈| 成人免费在线一区二区三区| 一级黄色大片免费| 久久福利毛片| 国模精品系列视频| 永久久久久久久| 成人久久一区| 日韩高清a**址| 国产一级免费片| 日韩成人在线看| 欧美精品丝袜中出| 香蕉视频禁止18| 欧美激情护士| 午夜久久久影院| 精品人妻人人做人人爽| 黄色网在线播放| 国产精品久久一卡二卡| 日韩av一区二区三区在线观看| 天天干天天色天天| 成人免费视频免费观看| 97人人模人人爽人人喊38tv| 国产丝袜视频在线观看| 国产一区二区三区黄视频 | 国产福利亚洲| 91国模大尺度私拍在线视频 | 日韩av在线播放中文字幕| 午夜精品一区二区三区在线| 精品无码久久久久久久| 欧美日韩国产高清| 欧美激情极品视频| 精品在线免费观看视频| 亚洲激情国产| 欧美在线观看网址综合| 国产美女激情视频| 久久久成人网| 国产精品久久久久久搜索 | 欧美一级片免费看| 亚洲五月激情网| 亚洲1区在线| 亚洲国产成人在线视频| 久久久久国产精品区片区无码| 久久99国产精品久久99大师| 亚洲精品美女免费| 午夜在线观看一区| 欧美激情欧美| 欧美日韩国产91| 中文字幕亚洲精品在线| 久久美女性网| 成人a免费视频| 午夜精品久久久久久久99热黄桃| 成人精品高清在线| 欧美激情一区二区三区在线视频| 九色视频在线播放| 自拍偷拍亚洲综合| 国产高清www| 欧美日韩精品免费观看视完整| 欧美日韩一区精品| 91精品人妻一区二区三区四区| 欧美三级午夜理伦三级小说| 一本色道久久88精品综合| 黄色一级大片在线免费观看| 狠狠爱成人网| 国产精品99久久久久久久久 | av黄色免费在线观看| 欧美aa国产视频| 98精品国产自产在线观看| 亚洲黄网在线观看| 国产综合色精品一区二区三区| 国产日韩一区二区三区| 中文字幕日本在线观看| 亚洲精品免费在线| 99久久久无码国产精品6| 在线免费成人| 日韩二区三区在线| 国产大学生自拍| 久久久久一区| 岛国视频一区| √天堂资源地址在线官网| 一区二区三区日韩精品视频| 黄色高清无遮挡| 日韩黄色av| 国产一区二区三区四区福利| 国产福利久久久| 麻豆精品视频在线观看视频| 国产日韩在线一区二区三区| 日本激情在线观看| 精品久久久久久久久久久久| 亚洲图片 自拍偷拍| 最新亚洲精品| 久久久久久久激情视频| 伊人网站在线观看| www欧美成人18+| 日本黄大片在线观看| 四虎国产精品免费久久| 精品视频在线播放色网色视频| 欧美成人三级在线观看| 免费精品99久久国产综合精品| 免费看成人午夜电影| 毛片在线导航| 欧美一区二区日韩| 91制片厂在线| 看电视剧不卡顿的网站| 欧美精品免费观看二区| 操人在线观看| 精品国产凹凸成av人导航| 日韩视频中文字幕在线观看| 理论片日本一区| 日韩精品另类天天更新| 亚洲女色av| 日韩电影免费观看在线观看| 久久一二三四区| 国产成人精品亚洲日本在线桃色 | 日韩欧美在线视频日韩欧美在线视频| 91精品人妻一区二区三区蜜桃2| 国产精品成人a在线观看| 国产精品免费网站| 成人h小游戏| 在线免费观看视频一区| 久久美女免费视频| 视频一区二区三区中文字幕| 日本成人三级| 天然素人一区二区视频| 国产午夜精品全部视频播放| av一级在线观看| 久久精品夜色噜噜亚洲a∨| 欧美亚洲另类色图| 久久99国产精品视频| 欧美一级淫片aaaaaaa视频| 四虎电影院在线观看| 欧美性猛交xxxx| 一道本在线观看| 日韩av网站免费在线| 在线视频精品一区| 国产午夜精品一区在线观看| 欧美猛交免费看| 蜜桃91麻豆精品一二三区| 亚洲午夜视频在线观看| 完美搭档在线观看| 久久精品卡一| 亚洲国产欧美一区二区三区不卡| 日本久久二区| 色综合久综合久久综合久鬼88| 成人久久久精品国产乱码一区二区| 亚洲国产综合在线| 大地资源二中文在线影视观看| 快she精品国产999| 一本一道久久久a久久久精品91 | 国产三区精品| 欧美大片免费观看网址| 色综合伊人色综合网| 国产av一区二区三区精品| 亚洲国产一区在线观看| 最近中文字幕在线mv视频在线| 免费高清视频精品| 日韩中文在线字幕| 日本欧美高清| 国产区精品在线观看| 久久久123| 国产亚洲一区精品| 精品国产av 无码一区二区三区| 午夜不卡av免费| 日本一卡二卡在线播放| 国产福利一区二区三区视频在线| 成人综合视频在线| 性欧美69xoxoxoxo| 国模精品一区二区三区| 久久精品黄色| 亚洲2020天天堂在线观看| 成人免费在线电影| 亚洲成人中文字幕| 中文字幕 国产| 亚洲成人免费看| 狂野欧美性猛交| 99精品视频在线播放观看| 天天干天天玩天天操| 99视频一区| 三年中文高清在线观看第6集| 亚洲黄色录像| 91黄色精品| 欧美aaaaaa| 欧洲亚洲免费视频| 激情av在线| 日日噜噜噜夜夜爽亚洲精品| 视频在线不卡| 日韩欧美一区二区三区在线| 国产精品无码粉嫩小泬| 亚洲成人av电影在线| 紧身裙女教师波多野结衣| 久久久久久久电影| 国产成人av无码精品| 激情综合网最新| 三级视频中文字幕| 性8sex亚洲区入口| 青青草成人免费在线视频| 久久精品青草| 亚洲精品视频一区二区三区| 亚洲桃色综合影院| 国产精品一区二区三区观看| 国产专区精品| 国产在线98福利播放视频| 88xx成人免费观看视频库| 97成人精品区在线播放| 操你啦视频在线| xvideos亚洲| av资源网站在线观看| 亚洲欧美成人一区二区在线电影| 欧美一级免费片| 精品福利av导航| xxxx国产精品| 欧美mv日韩mv国产| 亚洲成人第一区| 欧美刺激午夜性久久久久久久| 国产乱人乱偷精品视频| 欧美丰满嫩嫩电影| 国产又色又爽又黄又免费| 欧美日韩精品欧美日韩精品| 国产成人av免费| 欧美在线高清视频| 国内av在线播放| 欧美三级中文字| 国产又粗又黄又爽| 欧美精品777| 国产日韩免费视频| 日韩欧美在线网站| 亚洲av无码乱码国产麻豆| 欧美mv和日韩mv的网站| 亚洲精品免费在线观看视频| 欧美videos中文字幕| 丰满熟妇人妻中文字幕| 日韩精品视频免费在线观看| 艳母动漫在线看| 亚洲人精品午夜在线观看| 国产日本在线| xxxx性欧美| 中国av在线播放| 国内揄拍国内精品少妇国语| 女厕盗摄一区二区三区| 国产精品久久久久久久久久新婚| 看片一区二区| 91久久国产自产拍夜夜嗨| 超碰在线一区| 免费国产一区二区| 91九色精品| 久艹在线免费观看| 亚洲一区日韩| 999精彩视频| 国产福利一区二区三区视频在线| 亚洲国产精品自拍视频| 国产色产综合产在线视频| 亚洲一二三在线观看| 亚洲777理论| 中文字幕+乱码+中文字幕明步| 欧美精品色综合| 天天综合天天综合| 在线观看亚洲区| 欧美xxxx免费虐| 欧美在线免费观看| 免费精品一区二区三区在线观看| 国产91色在线|亚洲| 国际精品欧美精品| 2022中文字幕| 久久深夜福利| 亚洲熟女乱综合一区二区| xnxx国产精品| 九九视频在线免费观看| 色婷婷一区二区| 国产高清在线观看视频| 亚洲一区二区黄| av中文字幕在线观看第一页| 国产精品久久久久久久午夜| 激情视频极品美女日韩| 中文字幕久久综合| 亚洲一区图片| 91传媒理伦片在线观看| 欧美国产一区在线| 欧美亚韩一区二区三区| 91 com成人网| 欧美91精品久久久久国产性生爱| 久久艹在线视频| 成人黄色免费观看| 久久久久久国产精品mv| 国产精品99一区二区| 中文字幕线观看| 久久久久久亚洲综合影院红桃| 欧美卡一卡二卡三| 欧美精品xxxxbbbb| 国产专区在线| 欧美亚洲第一页| 99re热精品视频| 大桥未久一区二区| 蜜桃视频一区二区三区在线观看 | 国产一区二区三区三州| 精品中文视频在线| 超黄网站在线观看| 亚洲一区二区自拍| 91麻豆国产自产在线观看亚洲| 欧美 国产 小说 另类| 北条麻妃国产九九精品视频| 综合五月激情网| 91精选在线观看| 欧美激情午夜| 国产精品自产拍在线观看中文| 欧美亚洲tv| 97国产在线播放| 不卡电影一区二区三区| 久久免费小视频| 日韩一区二区三区免费观看| 国产一区久久精品| 91精品久久久久久久久不口人| 日韩在线观看电影完整版高清免费悬疑悬疑 | 亚洲一区二区三区三| 国产a级免费视频| 欧美成人亚洲成人| 欧美日本三级| www成人免费| 成人av手机在线观看| 国产精品a成v人在线播放| 精品福利在线导航| 国产www视频在线观看| 国产98在线|日韩| 亚洲国产高清一区| 一本色道综合久久欧美日韩精品 | 久久9999免费视频| 精品嫩模一区二区三区| 国产成人一区在线| 日本网站在线免费观看| 日韩精品视频免费专区在线播放| 性欧美freesex顶级少妇| 欧美日韩在线观看一区| 久久精品日产第一区二区 | 2019亚洲男人天堂| 国产精品午夜一区二区三区| 午夜精品在线免费观看| 中文字幕中文乱码欧美一区二区| 91麻豆成人精品国产| 欧美大奶子在线| 成人av资源网址| 国产在线观看福利| 国产精品色呦呦| 国产黄色av片| 69av在线视频| 日本午夜一区| 亚洲在线观看网站| 亚洲国产精品久久久男人的天堂| 少妇一区二区三区四区| 国产99久久久欧美黑人| 97久久夜色精品国产| 国产精品99久久久精品无码| 狠狠久久亚洲欧美专区| 在线视频1区2区| av一本久道久久波多野结衣| 亚洲在线观看| 91香蕉视频网| 亚洲第一黄色网| 国产电影一区二区三区爱妃记| 乱子伦一区二区| 99国产精品久久久久久久久久| 国产精品自拍第一页| 欧美成aaa人片免费看| 网友自拍一区| 玖玖爱视频在线| 舔着乳尖日韩一区| 日本三级视频在线观看| 精品一区二区三区日本| 久久99精品国产麻豆婷婷洗澡| 精品无码人妻一区二区三区| 伊人男人综合视频网|