午夜视频免费看_日韩三级电影网站_国产精品久久一级_亚洲一级在线播放_人妻体内射精一区二区三区_91夜夜揉人人捏人人添红杏_91福利在线导航_国产又粗又猛又黄又爽无遮挡_欧美日韩一区在线播放_中文字幕一区二区三区四区不卡 _日日夜夜精品视频免费观看_欧美韩日一区二区三区

主頁 > 知識庫 > 關(guān)于Redis網(wǎng)絡(luò)模型的源碼詳析

關(guān)于Redis網(wǎng)絡(luò)模型的源碼詳析

熱門標(biāo)簽:臺灣電銷 一個地圖標(biāo)注多少錢 南京手機外呼系統(tǒng)廠家 四川穩(wěn)定外呼系統(tǒng)軟件 400電話辦理的口碑 高碑店市地圖標(biāo)注app b2b外呼系統(tǒng) 地圖標(biāo)注工廠入駐 廊坊外呼系統(tǒng)在哪買

前言

Redis的網(wǎng)絡(luò)模型是基于I/O多路復(fù)用程序來實現(xiàn)的。源碼中包含四種多路復(fù)用函數(shù)庫epoll、select、evport、kqueue。在程序編譯時會根據(jù)系統(tǒng)自動選擇這四種庫其中之一。下面以epoll為例,來分析Redis的I/O模塊的源碼。

epoll系統(tǒng)調(diào)用方法

Redis網(wǎng)絡(luò)事件處理模塊的代碼都是圍繞epoll那三個系統(tǒng)方法來寫的。先把這三個方法弄清楚,后面就不難了。

epfd = epoll_create(1024);

創(chuàng)建epoll實例

參數(shù):表示該 epoll 實例最多可監(jiān)聽的 socket fd(文件描述符)數(shù)量。

返回: epoll 專用的文件描述符。

int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event)

管理epoll中的事件,對事件進行注冊、修改和刪除。

參數(shù):
epfd:epoll實例的文件描述符;
op:取值三種:EPOLL_CTL_ADD 注冊、EPOLL_CTL_MOD 修 改、EPOLL_CTL_DEL 刪除;
fd:socket的文件描述符;
epoll_event *event:事件

event代表一個事件,類似于Java NIO中的channel“通道”。epoll_event 的結(jié)構(gòu)如下:

typedef union epoll_data {
void *ptr;
int fd; /* socket文件描述符 */
__uint32_t u32;
__uint64_t u64;
} epoll_data_t;

struct epoll_event {
__uint32_t events; /* Epoll events 就是各種待監(jiān)聽操作的操作碼求與的結(jié)果,例如EPOLLIN(fd可讀)、EPOLLOUT(fd可寫) */
epoll_data_t data; /* User data variable */
};

int epoll_wait(int epfd, struct epoll_event * events, intmaxevents, int timeout);

等待事件是否就緒,類似于Java NIO中 select 方法。如果事件就緒,將就緒的event存入events數(shù)組中。

參數(shù)
epfd:epoll實例的文件描述符;
events:已就緒的事件數(shù)組;
intmaxevents:每次能處理的事件數(shù);
timeout:阻塞時間,等待產(chǎn)生就緒事件的超時值。

源碼分析

事件

Redis事件系統(tǒng)中將事件分為兩種類型:

  • 文件事件;網(wǎng)絡(luò)套接字對應(yīng)的事件;
  • 時間事件:Redis中一些定時操作事件,例如 serverCron 函數(shù)。

下面從事件的注冊、觸發(fā)兩個流程對源碼進行分析

綁定事件

建立 eventLoop

在 initServer方法(由 redis.c 的 main 函數(shù)調(diào)用) 中,在建立 RedisDb 對象的同時,會初始化一個“eventLoop”對象,我稱之為事件處理器對象。結(jié)構(gòu)體的關(guān)鍵成員變量如下所示:

struct aeEventLoop{
aeFileEvent *events;//已注冊的文件事件數(shù)組
aeFiredEvent *fired;//已就緒的文件事件數(shù)組
aeTimeEvent *timeEventHead;//時間事件數(shù)組
...
}

初始化 eventLoop 在 ae.c 的“aeCreateEventLoop”方法中執(zhí)行。該方法中除了初始化 eventLoop 還調(diào)用如下方法初始化了一個 epoll 實例。

/*
 * ae_epoll.c
 * 創(chuàng)建一個新的 epoll 實例,并將它賦值給 eventLoop
 */
static int aeApiCreate(aeEventLoop *eventLoop) {

  aeApiState *state = zmalloc(sizeof(aeApiState));

  if (!state) return -1;

  // 初始化事件槽空間
  state->events = zmalloc(sizeof(struct epoll_event)*eventLoop->setsize);
  if (!state->events) {
    zfree(state);
    return -1;
  }

  // 創(chuàng)建 epoll 實例
  state->epfd = epoll_create(1024); /* 1024 is just a hint for the kernel */
  if (state->epfd == -1) {
    zfree(state->events);
    zfree(state);
    return -1;
  }

  // 賦值給 eventLoop
  eventLoop->apidata = state;
  return 0;
}

也正是在此處調(diào)用了系統(tǒng)方法“epoll_create”。這里的state是一個aeApiState結(jié)構(gòu),如下所示:

/*
 * 事件狀態(tài)
 */
typedef struct aeApiState {

  // epoll 實例描述符
  int epfd;

  // 事件槽
  struct epoll_event *events;

} aeApiState;

這個 state 由 eventLoop->apidata 來記錄。

綁定ip端口與句柄

通過 listenToPort 方法開啟TCP端口,每個IP端口會對應(yīng)一個文件描述符 ipfd(因為服務(wù)器可能會有多個ip地址)

// 打開 TCP 監(jiān)聽端口,用于等待客戶端的命令請求
if (server.port != 0 
  listenToPort(server.port,server.ipfd,server.ipfd_count) == REDIS_ERR)
  exit(1);

注意:*eventLoop 和 ipfd 分別被 server.el 和 server.ipfd[] 引用。server 是結(jié)構(gòu)體 RedisServer 的實例,是Redis的全局變量。

注冊事件

如下所示代碼,為每一個文件描述符綁定一個事件函數(shù)

// initServer方法:
for (j = 0; j  server.ipfd_count; j++) {
  if (aeCreateFileEvent(server.el, server.ipfd[j], AE_READABLE,
    acceptTcpHandler,NULL) == AE_ERR)
    {
      redisPanic(
        "Unrecoverable error creating server.ipfd file event.");
    }
}
// ae.c 中的 aeCreateFileEvent 方法
/*
 * 根據(jù) mask 參數(shù)的值,監(jiān)聽 fd 文件的狀態(tài),
 * 當(dāng) fd 可用時,執(zhí)行 proc 函數(shù)
 */
int aeCreateFileEvent(aeEventLoop *eventLoop, int fd, int mask,
    aeFileProc *proc, void *clientData)
{
  if (fd >= eventLoop->setsize) {
    errno = ERANGE;
    return AE_ERR;
  }

  if (fd >= eventLoop->setsize) return AE_ERR;

  // 取出文件事件結(jié)構(gòu)
  aeFileEvent *fe = eventLoop->events[fd];

  // 監(jiān)聽指定 fd 的指定事件
  if (aeApiAddEvent(eventLoop, fd, mask) == -1)
    return AE_ERR;

  // 設(shè)置文件事件類型,以及事件的處理器
  fe->mask |= mask;
  if (mask  AE_READABLE) fe->rfileProc = proc;
  if (mask  AE_WRITABLE) fe->wfileProc = proc;

  // 私有數(shù)據(jù)
  fe->clientData = clientData;

  // 如果有需要,更新事件處理器的最大 fd
  if (fd > eventLoop->maxfd)
    eventLoop->maxfd = fd;

  return AE_OK;
}

aeCreateFileEvent 函數(shù)中有一個方法調(diào)用:aeApiAddEvent,代碼如下

/*
 * ae_epoll.c
 * 關(guān)聯(lián)給定事件到 fd
 */
static int aeApiAddEvent(aeEventLoop *eventLoop, int fd, int mask) {
  aeApiState *state = eventLoop->apidata;
  struct epoll_event ee;

  /* If the fd was already monitored for some event, we need a MOD
   * operation. Otherwise we need an ADD operation. 
   *
   * 如果 fd 沒有關(guān)聯(lián)任何事件,那么這是一個 ADD 操作。
   *
   * 如果已經(jīng)關(guān)聯(lián)了某個/某些事件,那么這是一個 MOD 操作。
   */
  int op = eventLoop->events[fd].mask == AE_NONE ?
      EPOLL_CTL_ADD : EPOLL_CTL_MOD;

  // 注冊事件到 epoll
  ee.events = 0;
  mask |= eventLoop->events[fd].mask; /* Merge old events */
  if (mask  AE_READABLE) ee.events |= EPOLLIN;
  if (mask  AE_WRITABLE) ee.events |= EPOLLOUT;
  ee.data.u64 = 0; /* avoid valgrind warning */
  ee.data.fd = fd;

  if (epoll_ctl(state->epfd,op,fd,ee) == -1) return -1;

  return 0;
}

這里實際上就是調(diào)用系統(tǒng)方法“epoll_ctl”,將事件(文件描述符)注冊進 epoll 中。首先要封裝一個 epoll_event 結(jié)構(gòu),即 ee ,通過“epoll_ctl”將其注冊進 epoll 中。

除此之外,aeCreateFileEvent 還完成了下面兩個重要操作:

  • 將事件函數(shù)“acceptTcpHandler”存入了eventLoop中,即由eventLoop->events[fd]->rfileProc 來引用(也可能是wfileProc,分別代表讀事件和寫事件);
  • 將當(dāng)操作碼添加進 eventLoop->events[fd]->mask 中(mask 類似于JavaNIO中的ops操作碼,代表事件類型)。

事件監(jiān)聽與執(zhí)行

redis.c 的main函數(shù)會調(diào)用 ae.c 中的 main 方法,如下所示:

/*
 * 事件處理器的主循環(huán)
 */
void aeMain(aeEventLoop *eventLoop) {

  eventLoop->stop = 0;

  while (!eventLoop->stop) {

    // 如果有需要在事件處理前執(zhí)行的函數(shù),那么運行它
    if (eventLoop->beforesleep != NULL)
      eventLoop->beforesleep(eventLoop);

    // 開始處理事件
    aeProcessEvents(eventLoop, AE_ALL_EVENTS);
  }
}

上述代碼會調(diào)用 aeProcessEvents 方法用于處理事件,方法如下所示

/* Process every pending time event, then every pending file event
 * (that may be registered by time event callbacks just processed).
 *
 * 處理所有已到達的時間事件,以及所有已就緒的文件事件。
 * 函數(shù)的返回值為已處理事件的數(shù)量
 */
 int aeProcessEvents(aeEventLoop *eventLoop, int flags)
{
  int processed = 0, numevents;

  /* Nothing to do? return ASAP */
  if (!(flags  AE_TIME_EVENTS)  !(flags  AE_FILE_EVENTS)) return 0;

  if (eventLoop->maxfd != -1 ||
    ((flags  AE_TIME_EVENTS)  !(flags  AE_DONT_WAIT))) {
    int j;
    aeTimeEvent *shortest = NULL;
    struct timeval tv, *tvp;

    // 獲取最近的時間事件
    if (flags  AE_TIME_EVENTS  !(flags  AE_DONT_WAIT))
      shortest = aeSearchNearestTimer(eventLoop);
    if (shortest) {
      // 如果時間事件存在的話
      // 那么根據(jù)最近可執(zhí)行時間事件和現(xiàn)在時間的時間差來決定文件事件的阻塞時間
      long now_sec, now_ms;

      /* Calculate the time missing for the nearest
       * timer to fire. */
      // 計算距今最近的時間事件還要多久才能達到
      // 并將該時間距保存在 tv 結(jié)構(gòu)中
      aeGetTime(now_sec, now_ms);
      tvp = tv;
      tvp->tv_sec = shortest->when_sec - now_sec;
      if (shortest->when_ms  now_ms) {
        tvp->tv_usec = ((shortest->when_ms+1000) - now_ms)*1000;
        tvp->tv_sec --;
      } else {
        tvp->tv_usec = (shortest->when_ms - now_ms)*1000;
      }

      // 時間差小于 0 ,說明事件已經(jīng)可以執(zhí)行了,將秒和毫秒設(shè)為 0 (不阻塞)
      if (tvp->tv_sec  0) tvp->tv_sec = 0;
      if (tvp->tv_usec  0) tvp->tv_usec = 0;
    } else {
      
      // 執(zhí)行到這一步,說明沒有時間事件
      // 那么根據(jù) AE_DONT_WAIT 是否設(shè)置來決定是否阻塞,以及阻塞的時間長度

      /* If we have to check for events but need to return
       * ASAP because of AE_DONT_WAIT we need to set the timeout
       * to zero */
      if (flags  AE_DONT_WAIT) {
        // 設(shè)置文件事件不阻塞
        tv.tv_sec = tv.tv_usec = 0;
        tvp = tv;
      } else {
        /* Otherwise we can block */
        // 文件事件可以阻塞直到有事件到達為止
        tvp = NULL; /* wait forever */
      }
    }

    // 處理文件事件,阻塞時間由 tvp 決定
    numevents = aeApiPoll(eventLoop, tvp);
    for (j = 0; j  numevents; j++) {
      // 從已就緒數(shù)組中獲取事件
      aeFileEvent *fe = eventLoop->events[eventLoop->fired[j].fd];

      int mask = eventLoop->fired[j].mask;
      int fd = eventLoop->fired[j].fd;
      int rfired = 0;

      /* note the fe->mask  mask  ... code: maybe an already processed
       * event removed an element that fired and we still didn't
       * processed, so we check if the event is still valid. */
      // 讀事件
      if (fe->mask  mask  AE_READABLE) {
        // rfired 確保讀/寫事件只能執(zhí)行其中一個
        rfired = 1;
        fe->rfileProc(eventLoop,fd,fe->clientData,mask);
      }
      // 寫事件
      if (fe->mask  mask  AE_WRITABLE) {
        if (!rfired || fe->wfileProc != fe->rfileProc)
          fe->wfileProc(eventLoop,fd,fe->clientData,mask);
      }

      processed++;
    }
  }

  /* Check time events */
  // 執(zhí)行時間事件
  if (flags  AE_TIME_EVENTS)
    processed += processTimeEvents(eventLoop);

  return processed; 
}

該函數(shù)中代碼大致分為三個主要步驟

  • 根據(jù)時間事件與當(dāng)前時間的關(guān)系,決定阻塞時間 tvp;
  • 調(diào)用aeApiPoll方法,將就緒事件都寫入eventLoop->fired[]中,返回就緒事件數(shù)目;
  • 遍歷eventLoop->fired[],遍歷每一個就緒事件,執(zhí)行之前綁定好的方法rfileProc 或者wfileProc。

ae_epoll.c 中的 aeApiPoll 方法如下所示:

/*
 * 獲取可執(zhí)行事件
 */
static int aeApiPoll(aeEventLoop *eventLoop, struct timeval *tvp) {
  aeApiState *state = eventLoop->apidata;
  int retval, numevents = 0;

  // 等待時間
  retval = epoll_wait(state->epfd,state->events,eventLoop->setsize,
      tvp ? (tvp->tv_sec*1000 + tvp->tv_usec/1000) : -1);

  // 有至少一個事件就緒?
  if (retval > 0) {
    int j;

    // 為已就緒事件設(shè)置相應(yīng)的模式
    // 并加入到 eventLoop 的 fired 數(shù)組中
    numevents = retval;
    for (j = 0; j  numevents; j++) {
      int mask = 0;
      struct epoll_event *e = state->events+j;

      if (e->events  EPOLLIN) mask |= AE_READABLE;
      if (e->events  EPOLLOUT) mask |= AE_WRITABLE;
      if (e->events  EPOLLERR) mask |= AE_WRITABLE;
      if (e->events  EPOLLHUP) mask |= AE_WRITABLE;

      eventLoop->fired[j].fd = e->data.fd;
      eventLoop->fired[j].mask = mask;
    }
  }
  
  // 返回已就緒事件個數(shù)
  return numevents;
}

執(zhí)行epoll_wait后,就緒的事件會被寫入 eventLoop->apidata->events 事件槽。后面的循環(huán)就是將事件槽中的事件寫入到 eventLoop->fired[] 中。具體描述:每一個事件都是一個 epoll_event 結(jié)構(gòu),用e來指代,則e.data.fd代表文件描述符,e->events表示其操作碼,將操作碼轉(zhuǎn)化為mask,最后將fd 和 mask 都寫入eventLoop->fired[j]中。

之后,在外層的 aeProcessEvents 方法中會執(zhí)行函數(shù)指針 rfileProc 或者 wfileProc 指向的方法,例如前文提到已注冊的“acceptTcpHandler”。

總結(jié)

Redis的網(wǎng)絡(luò)模塊其實是一個簡易的Reactor模式。本文順著“服務(wù)端注冊事件——>接受客戶端連接——>監(jiān)聽事件是否就緒——>執(zhí)行事件”這樣的路線,來分析Redis源碼,描述了Redis接受客戶端connect的過程。實際上NIO的思想都基本類似。

到此這篇關(guān)于Redis網(wǎng)絡(luò)模型的源碼詳析的文章就介紹到這了,更多相關(guān)Redis網(wǎng)絡(luò)模型源碼內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • Redis源碼解析:集群手動故障轉(zhuǎn)移、從節(jié)點遷移詳解
  • Spring AOP實現(xiàn)Redis緩存數(shù)據(jù)庫查詢源碼
  • redis源碼分析教程之壓縮鏈表ziplist詳解
  • Redisson分布式鎖源碼解析
  • 從源碼解讀redis持久化
  • scrapy-redis源碼分析之發(fā)送POST請求詳解

標(biāo)簽:伊春 定州 拉薩 河源 泰州 甘南 南寧 畢節(jié)

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《關(guān)于Redis網(wǎng)絡(luò)模型的源碼詳析》,本文關(guān)鍵詞  關(guān)于,Redis,網(wǎng)絡(luò),模型,的,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《關(guān)于Redis網(wǎng)絡(luò)模型的源碼詳析》相關(guān)的同類信息!
  • 本頁收集關(guān)于關(guān)于Redis網(wǎng)絡(luò)模型的源碼詳析的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    欧美大片顶级少妇| 又骚又黄的视频| 99热都是精品| 日本在线精品视频| 麻豆精品精品国产自在97香蕉| 亚洲激情在线视频| 久久九九国产视频| 日韩成人一区二区三区| 国产一区av在线| 久久视频一区| 国产精品久久久久久久9999| av中文字幕免费在线观看| 日韩欧美猛交xxxxx无码| 欧美一区二区三区艳史| 视频在线观看99| www.日韩精品| 国产激情av在线| 欧美性色黄大片人与善| 精品人妻一区二区三| 在线观看成人av电影| 亚洲摸摸操操av| 在线免费观看一区二区| 右手影院亚洲欧美| 中文字幕一区二区在线观看视频 | 成人激情视频在线播放| 亚洲最大视频网| 色偷偷噜噜噜亚洲男人| 国产成人8x视频一区二区| 91制片厂毛片| 日韩在线免费视频观看| 国产精品日产欧美久久久久| 久久久久久久久久看片| 懂色一区二区三区免费观看| 国产精品久久久久久久免费| 久久精品国产露脸对白| 国产伦精品一区二区三区视频孕妇 | 国产一级生活片| 亚洲xxx视频| 国产一区视频网站| 99精品视频播放| 日韩女优视频免费观看| 国产精品国产三级国产| 91激情在线观看| 亚洲精品一区二区18漫画| 国产中文字幕亚洲| 国产中文日韩欧美| 日韩一区二区三区四区| 欧美成人精品网站| 日韩亚洲欧美在线观看| 先锋影音亚洲资源| 免费观看特级毛片| 亚洲一区二区三区色| 亚洲欧美另类中文字幕| 国内精品久久久久影院薰衣草| 国产乱码一区二区三区四区| 粉嫩av四季av绯色av第一区| 日本精品久久久久影院| 久久久久久国产精品mv| 路边理发店露脸熟妇泻火| 91传媒免费看| 久久影院免费观看| 精品99999| 日本一二三四高清不卡| 成人高清av在线| 受虐m奴xxx在线观看| 日韩性生活视频| 另类成人小视频在线| 人妻巨大乳一二三区| 99视频在线免费| 少妇大叫太大太粗太爽了a片小说| 91欧美激情另类亚洲| 视频直播国产精品| 97视频在线看| 精品日韩一区二区三区免费视频| 首页国产欧美日韩丝袜| 日韩av电影手机在线| av午夜精品一区二区三区| 亚洲网站在线看| 亚洲丝袜精品丝袜在线| 老**午夜毛片一区二区三区| 亚洲综合图片一区| 亚洲成年人专区| 欧美第一淫aaasss性| 久久久久亚洲精品| 亚洲成人18| 国自产拍偷拍精品啪啪一区二区| 亚洲福利精品视频| 欧美 国产 综合| av电影一区二区三区| 伊人久久99| 国产欧美va欧美va香蕉在| 国产精品久久激情| 国产欧美一区视频| 日韩av免费播放| 三年中国国语在线播放免费| 国产精品黄色av| 99国产视频在线| 久久精品第九区免费观看 | 国产拍揄自揄精品视频麻豆| 欧美肥妇bbwbbw| 国产成+人+综合+亚洲欧洲| www.av亚洲| 国产亚洲欧美另类一区二区三区| 色婷婷久久久亚洲一区二区三区| 国产精品美女久久久久久久| 国产在线看一区| 成人免费一级片| 99久久久无码国产精品性波多| 日本三级中文字幕在线观看| 日韩精品无码一区二区三区免费| 小向美奈子av| wwwxxxx国产| 国产日韩三级在线| 91视频国产观看| 久久精品国产一区二区| 国产98色在线|日韩| 国产精品视频看| 性中国xxx极品hd| 欧美一级淫片免费视频黄| 不卡av在线免费观看| 欧美视频13p| 国产精品视频一二三区| 欧美日韩亚洲视频| 欧美中文字幕一区二区三区| 秋霞午夜av一区二区三区| 2014亚洲片线观看视频免费| 欧美日韩久久不卡| 欧美一区永久视频免费观看| 最近中文字幕mv在线一区二区三区四区 | 国内精品久久影院| 欧美整片在线观看| 最新中文字幕亚洲| 日韩欧美国产黄色| 欧美性生交xxxxx久久久| 亚洲激情一二三区| 精品国精品国产| 精品蜜桃在线看| 中文字幕亚洲一区二区三区五十路 | 97超级碰碰碰| 中文字幕亚洲欧美在线| 亚洲自拍偷拍九九九| 中文字幕免费播放| 四虎影成人精品a片| 亚洲精品高清视频| 蜜臀久久99精品久久久久久宅男| 欧美日韩国产综合新一区| 亚洲精品久久久久avwww潮水| av五月天在线| 国产精品久久久久久久久久 | 中文 欧美 日韩| 中文字幕免费在线播放| 亚洲国产婷婷香蕉久久久久久99| 亚洲男人第一网站| 99re这里都是精品| √资源天堂中文在线| 欧美交换配乱吟粗大25p| 久久久电影免费观看完整版| 国产精品久久久久aaaa樱花| 波多野结衣黄色网址| 国产又大又黄又猛| 久久久www成人免费精品| 天天综合日日夜夜精品| 青青草成人在线观看| 在线看片中文字幕| 1314成人网| 国产二区视频在线播放| 亚洲少妇中文字幕| 在线免费一区二区| 日韩精品乱码免费| 国产精品色婷婷| 亚洲一区中文在线| 亚洲视频在线观看一区| 91视视频在线观看入口直接观看www| 99国产精品久久| 亚洲精品视频在线| 成人一级片网址| 高清视频一区二区| 欧美日韩中文字幕视频| 国产 porn| 成年人看的免费视频| 亚洲精品一区二区三区不卡| av在线一区二区| 91蜜桃婷婷狠狠久久综合9色| 91丨porny丨国产| 精品国产乱码久久久久久虫虫漫画| 欧美午夜精品在线| 欧美日韩午夜激情| 亚洲精品高清在线观看| 亚洲精品免费一二三区| 欧美性色19p| 欧美一级bbbbb性bbbb喷潮片| 国产 中文 字幕 日韩 在线| 91麻豆精品在线观看| 日韩中文字幕在线视频| 能在线观看的av| 四虎成人永久免费视频| 国内成+人亚洲+欧美+综合在线| 成人免费公开视频| 久久综合久久久久88| 欧美mv日韩mv国产网站| 欧美在线激情网| 中文字幕中文字幕在线中一区高清| 精品一区二区成人免费视频| 亚洲国产午夜精品| 伊人成年综合网| 韩国成人福利片在线播放| 中文字幕第一区综合| 3d成人动漫网站| 欧美国产视频一区二区| 精品国产综合久久| 五月天久久狠狠| 国产伦理在线观看| 欧美一区二区三区不卡视频| 久久国产综合精品| 亚洲国产日韩一级| 亚洲欧美中文日韩在线| 久热99视频在线观看| 国产亚洲第一区| 九九热免费在线观看| xxxxxx国产| 久久久久久亚洲精品杨幂换脸| 久久精品日韩一区二区三区| 日本一区二区三区高清不卡| 日韩精品专区在线影院观看| 国产伦精品一区二区三区精品视频| 日韩精品手机在线观看| 欧美日韩国产一二三区| 久久中文在线| 色综合天天综合狠狠| 欧美极品美女视频网站在线观看免费| 欧美日韩综合久久| 亚洲精品乱码久久久久久蜜桃欧美| 亚洲午夜无码久久久久| 国产乱子伦一区二区三区国色天香 | avhd101老司机| 国产裸体歌舞团一区二区| 56国语精品自产拍在线观看| 国产精品综合久久久| 国产精品视频中文字幕| 看片网站在线观看| 成人妖精视频yjsp地址| 精品国产91乱码一区二区三区| 亚洲xxxxx性| 99精品一区二区三区无码吞精 | 日韩精品综合在线| 91精品国产乱码久久久张津瑜| 91在线看国产| 日韩一级黄色av| 日韩成人三级视频| 无码人妻精品一区二区三区9厂| 国产精品免费看片| 中文在线资源观看视频网站免费不卡| 免费在线观看91| 国产一级淫片久久久片a级| www.日韩精品| 不卡av在线网| 色综合久久久久久久久久久| 亚洲综合自拍一区| 日日碰狠狠添天天爽| 免费观看精品视频| 日韩精品1区2区3区| 欧美大片国产精品| 日本免费成人网| 免费不卡在线观看| 2020久久国产精品| 亚洲一二三精品| 婷婷综合另类小说色区| 欧美xxxx黑人又粗又长精品| 亚洲电影免费观看高清完整版在线观看| 狠狠躁天天躁日日躁欧美| 国产日韩精品推荐| 亚洲成人av影片| 欧美一区二区在线看| 日日噜噜夜夜狠狠久久丁香五月 | 久久精品国产精品亚洲精品| 久久成年人视频| 图片区偷拍区小说区| 精品人妻一区二区三区香蕉| 日本中文字幕在线| 在线观看欧美黄色| 综合色婷婷一区二区亚洲欧美国产| 中文无码精品一区二区三区| 日韩欧美专区在线| 天堂在线资源视频| 国产成人在线观看| 国产成人av在线| xxxx 国产| 亚洲精品一区二区三区香蕉| 日韩av手机版| 久久久99精品久久| 精品毛片久久久久久| xxxx18国产| av天堂一区二区三区| 欧洲av在线播放| 蜜月aⅴ免费一区二区三区 | 疯狂欧美牲乱大交777| 亚洲一区三区视频在线观看| 男人的天堂亚洲一区| 欧美最猛黑人xxxx黑人猛叫黄| 日韩久久久久久久久| 亚洲男人天天操| 亚洲区自拍偷拍| 欧美精品777| www国产视频| 日韩欧美精品在线观看| 国产淫片av片久久久久久| xf在线a精品一区二区视频网站| 久99久在线| 国产高清精品网站| 日韩高清dvd| 成人h动漫精品一区二| 日韩欧美精品一区二区| 成人av电影在线播放| 亚洲国产精品一区二区第四页av| 国产99精品国产| 欧美一区亚洲二区| 韩国精品免费视频| 久久久水蜜桃| 懂色av一区二区三区免费看| 色一情一乱一伦一区二区三区| 国产在线观看一区二区| 欧美国产综合视频| 91香蕉视频在线| 被灌满精子的波多野结衣| 亚洲女女做受ⅹxx高潮| 欧美激情精品久久久久久小说| 亚洲午夜日本在线观看| 亚洲制服在线观看| 91精品国产一区二区| 国产小视频你懂的| 中文字幕日韩在线视频| 精品免费囯产一区二区三区| 91成人免费观看网站| 国产在线精品免费av| 国产福利视频在线播放| 欧美不卡一区二区| 国产露脸91国语对白| 亚洲乱码日产精品bd在线观看| 91精品国产综合久久精品麻豆 | 丁香婷婷综合五月| 污视频网址在线观看| 亚洲男人天堂视频| 免费观看成人鲁鲁鲁鲁鲁视频| 成人性生活视频免费看| 亚洲国产精品yw在线观看 | 日韩国产欧美在线视频| 秋霞无码一区二区| 国产欧美日韩不卡| 中文字幕在线免费看线人| 亚洲精品一二区| 国内老熟妇对白hdxxxx| 欧美少妇一级片| 日韩欧美999| www.欧美色| 日本一区视频在线观看免费| 亚洲精品va在线观看| 扒开jk护士狂揉免费| 国产91精品青草社区| 国产精品一区二区果冻传媒| 久久久久久久片| 久久精品91久久香蕉加勒比| 久久99精品国产91久久来源| 国产午夜伦鲁鲁| 亚洲欧洲高清在线| 高清一区二区三区四区| 亚洲中文字幕无码专区| 精品国内片67194| 五月激情婷婷网| 日韩av在线中文| 久99久在线视频| 国产午夜精品久久久久久免费视| 精品国产av无码| 99久热re在线精品996热视频| 亚洲欧洲精品一区二区精品久久久| 美女网站视频色| 亚洲999一在线观看www| 日本韩国精品在线| www.桃色av嫩草.com| 成人综合视频在线| 欧美xxxx做受欧美| 国产欧美一区二区三区网站| 男人av资源站| 欧洲精品在线一区| 亚洲精品久久久久国产| 久久99在线观看| 97伦伦午夜电影理伦片| 国产精品10p综合二区| 色婷婷av一区二区三区gif| 一区二区日韩在线观看| 成人免费毛片在线观看| 欧美激情xxxx性bbbb| 亚洲欧美另类在线| 亚洲一区二区影视| 青青草精品视频在线观看| 91精品国产高清自在线| 欧美日韩免费看| 免费在线观看精品| 国产一级二级在线观看| 国产无套精品一区二区| 日韩精品视频免费| 91亚洲精品一区二区乱码| 九九九免费视频| 免费在线a视频| 成人亚洲激情网| 日韩黄色高清视频| 国产亚洲欧美日韩在线一区| 97免费观看视频| 亚洲AV无码国产精品| 亚洲午夜精品一区二区| 欧美激情精品久久久久久久变态 |