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

memcached源碼閱讀筆記

開發(fā) 項目管理
閱讀memcached最好有l(wèi)ibevent 基礎,memcached是基于libevent 構建起來的。通由libevent 提供的事件驅動機制觸發(fā) memcached中的IO事件。

閱讀 memcached ***有 libevent 基礎,memcached 是基于libevent 構建起來的。通由 libevent 提供的事件驅動機制觸發(fā) memcached 中的 IO 事件。

個人認為,閱讀源碼的起初最忌鉆牛角尖,如頭文件里天花亂墜的結構體到底有什么用。源文件里稀里嘩啦的函數(shù)是做什么的。剛開始并沒必要事無巨細弄清楚頭文件每個類型定義的具體用途;很可能那些是不緊要的工具函數(shù),知道他的功能和用法就沒他事了。

來看 memcached 內部做了什么事情。memcached 是用 c 語言實現(xiàn),必須有一個入口函數(shù)main(),memcached 的生命從這里開始。

初始化過程

建立并初始化 main_base,即主線程的事件中心,這是 libevent 里面的概念,可以把它理解為事件分發(fā)中心。

建立并初始化 memcached 內部容器數(shù)據結構。

建立并初始化空閑連接結構體數(shù)組。

建立并初始化線程結構數(shù)組,指定每個線程的入口函數(shù)是worker_libevent(),并創(chuàng)建工作線程。從worder_libevent()的實現(xiàn)來看,工作線程都會調用event_base_loop()進入自己的事件循環(huán)。

根據 memcached 配置,開啟以下兩種服務模式中的一種:

以 UNIX 域套接字的方式接受客戶的請求
以 TCP/UDP 套接字的方式接受客戶的請求
memcached 有可配置的兩種模式: UNIX 域套接字和 TCP/UDP,允許客戶端以兩種方式向 memcached 發(fā)起請求??蛻舳撕头掌髟谕粋€主機上的情況下可以用 UNIX 域套接字,否則可以采用 TCP/UDP 的模式。兩種模式是不兼容的。特別的,如果是 UNIX 域套接字或者 TCP 模式,需要建立監(jiān)聽套接字,并在事件中心注冊了讀事件,回調函數(shù)是event_handler(),我們會看到所有的連接都會被注冊回調函數(shù)是 event_handler()。

調用event_base_loop()開啟 libevent 的事件循環(huán)。到此,memcached 服務器的工作正式進入了工作。如果遇到致命錯誤或者客戶明令結束 memcached,那么才會進入接下來的清理工作。

UNIX 域套接字和 UDP/TCP 工作模式

在初始化過程中介紹了這兩種模式,memcached 這么做為的是讓其能更加可配置。TCP/UDP 自不用說,UNIX 域套接字有獨特的優(yōu)勢:

在同一臺主機上進行通信時,是不同主機間通信的兩倍
UNIX 域套接口可以在同一臺主機上,不同進程之間傳遞套接字描述符
UNIX 域套接字可以向服務器提供客戶的憑證(用戶id或者用戶組id)
其他關于 UNIX 域套接字優(yōu)缺點的請參看: https://pangea.stanford.edu/computing/UNIX/overview/advantages.php

工作線程管理和線程調配方式

在thread_init(),setup_thread()函數(shù)的實現(xiàn)中,memcached 的意圖是很清楚的。每個線程都有自己獨有的連接隊列,即 CQ,注意這個連接隊列中的對象并不是一個或者多個 memcached 命令,它對應一個客戶! 一旦一個客戶交給了一個線程,它的余生就屬于這個線程了! 線程只要被喚醒就立即進入工作狀態(tài),將自己 CQ 隊列的任務所有完完成。當然,每一個工作線程都有自己的 libevent 事件中心。

很關鍵的線索是thread_init()的實現(xiàn)中,每個工作線程都創(chuàng)建了讀寫管道,所能給我們的提示是: 只要利用 libevent 在工作線程的事件中心注冊讀管道的讀事件,就可以按需喚醒線程,完成工作,很有意思,而setup_thread()的工作正是讀管道的讀事件被注冊到線 程的事件中心,回調函數(shù)是thread_libevent_process().thread_libevent_process()的工作就是從工作線 程自己的 CQ 隊列中取出任務執(zhí)行,而往工作線程工作隊列中添加任務的是dispatch_conn_new(),此函數(shù)一般由主線程調用。下面是主線程和工作線程的工 作流程:

120131223103045

前幾天在微博上,看到 @高端小混混 的微博,轉發(fā)了:

“多任務并行處理的兩種方式,一種是將所有的任務用隊列存儲起來,每個工作者依次去 拿一個來處理,直到做完所有的>任務為止。另一種是將任務平均分給工作者,先做完任務的工作者就去別的工作者那里拿一些任務來做,同樣直到所有任務 做完為止。兩種方式的結果如何?根據自己的場景寫碼驗證。”

memcached 所采用的模式就是這里所說的第二種! memcached 的線程分配模式是:一個主線程和多個工作線程。主線程負責初始化和將接收的請求分派給工作線程,工作線程負責接收客戶的命令請求和回復客戶。

#p#

存儲容器

memcached 是做緩存用的,內部肯定有一個容器?;氐絤ain()中,調用assoc_init()初始化了容器–hashtable,采用頭插法插入新數(shù)據,因為頭 插法是最快的。memcached 只做了一級的索引,即 hash; 接下來的就靠 memcmp() 在鏈表中找數(shù)據所在的位置。memcached 容器管理的接口主要在 item.h .c 中.

220131223103240

 連接管理

每個連接都會建立一個連接結構體與之對應。main()中會調用conn_init()建立連接結構體數(shù)組。連接結構體 struct conn 記錄了連接套接字,讀取的數(shù)據,將要寫入的數(shù)據,libevent event 結構體以及所屬的線程信息。

當有新的連接時,主線程會被喚醒,主線程選定一個工作線程 thread0,在 thread0 的寫管道中寫入數(shù)據,特別的如果是接受新的連接而不是接受新的數(shù)據,寫入管道的數(shù)據是字符 ‘c’。工作線程因管道中有數(shù)據可讀被喚醒,thread_libevent_process()被調用,新連接套接字被注冊了 event_handler()回調函數(shù),這些工作在conn_new()中完成。因此,客戶端有命令請求的時候(譬如發(fā)起 get key 命令),工作線程都會被觸發(fā)調用event_handler()。

當出現(xiàn)致命錯誤或者客戶命令結束服務(quit 命令),關于此連接的結構體內部的數(shù)據會被釋放(譬如曾經讀取的數(shù)據),但結構體本身不釋放,等待下一次使用。如果有需要,連接結構體數(shù)組會指數(shù)自增。

一個請求的工作流程

memcached 服務一個客戶的時候,是怎么一個過程,試著去調試模擬一下。當一個客戶向 memcached 發(fā)起請求時,主線程會被喚醒,接受請求。接下來的工作在連接管理中有說到。

客戶已經與 memcached 服務器建立了連接,客戶在終端(黑框框)敲擊 get key + 回車鍵,一個請求包就發(fā)出去了。從連接管理中已經了解到所有連接套接字都會被注冊回調函數(shù)為event_handler(),因此 event_handler()會被觸發(fā)調用。

  1. void event_handler(const int fd,const short which,void *arg) { 
  2.     conn *c; 
  3.   
  4.     c = (conn *)arg; 
  5.     assert(c != NULL); 
  6.   
  7.     c->whichwhich = which; 
  8.   
  9.     /* sanity */ 
  10.     if (fd != c->sfd) { 
  11.         if (settings.verbose > 0) 
  12.             fprintf(stderr,"Catastrophic: event fd doesn't match conn fd!\n"); 
  13.         conn_close(c); 
  14.         return; 
  15.     } 
  16.   
  17.     drive_machine(c); 
  18.   
  19.     /* wait for next event */ 
  20.     return; 

event_handler()調用了drive_machine().drive_machine()是請求處理的開端,特別的當有新的連接 時,listen socket 也是有請求的,所以建立新的連接也會調用drive_machine(),這在連接管理有提到過。下面是drive_machine()函數(shù)的骨架:

  1. // 請求的開端。當有新的連接的時候 event_handler() 會調用此函數(shù)。 
  2. static void drive_machine(conn *c) { 
  3.     bool stop = false
  4.     int sfd,flags = 1
  5.     socklen_t addrlen; 
  6.     struct sockaddr_storage addr; 
  7.     int nreqs = settings.reqs_per_event; 
  8.     int res; 
  9.     const char *str; 
  10.   
  11.     assert(c != NULL); 
  12.   
  13.     while (!stop) { 
  14.         // while 能保證一個命令被執(zhí)行完成或者異常中斷(譬如 IO 操作次數(shù)超出了一定的限制) 
  15.   
  16.         switch(c->state) { 
  17.         // 正在連接,還沒有 accept 
  18.         case conn_listening: 
  19.   
  20.         // 等待新的命令請求 
  21.         case conn_waiting: 
  22.   
  23.         // 讀取數(shù)據 
  24.         case conn_read: 
  25.   
  26.         // 嘗試解析命令 
  27.         case conn_parse_cmd : 
  28.   
  29.         // 新的命令請求,只是負責轉變 conn 的狀態(tài) 
  30.         case conn_new_cmd: 
  31.   
  32.         // 真正執(zhí)行命令的地方 
  33.         case conn_nread: 
  34.   
  35.         // 讀取所有的數(shù)據,拋棄!!! 一般出錯的情況下會轉換到此狀態(tài) 
  36.         case conn_swallow: 
  37.   
  38.         // 數(shù)據回復 
  39.         case conn_write: 
  40.   
  41.         case conn_mwrite: 
  42.   
  43.         // 連接結束。一般出錯或者客戶顯示結束服務的情況下回轉換到此狀態(tài) 
  44.         case conn_closing: 
  45.         } 
  46.     } 
  47.     return

通過修改連接結構體狀態(tài) struct conn.state 執(zhí)行相應的操作,從而完成一個請求,完成后 stop 會被設置為 true,一個命令只有執(zhí)行結束(無論結果如何)才會跳出這個循環(huán)。我們看到 struct conn 有好多種狀態(tài),一個正常執(zhí)行的命令狀態(tài)的轉換是:

  1. conn_new_cmd->conn_waiting->conn_read->conn_parse_cmd->conn_nread->conn_mwrite->conn_close 

這個過程任何一個環(huán)節(jié)出了問題都會導致狀態(tài)轉變?yōu)?conn_close。帶著剛開始的問題把從客戶連接到一個命令執(zhí)行結束的過程是怎么樣的:

客戶connect()后,memcached 服務器主線程被喚醒,接下來的調用鏈是event_handler()->drive_machine()被調用,此時主線程對應 conn 狀態(tài)為 conn_listining,接受請求

  1. dispatch_conn_new(sfd,conn_new_cmd,EV_READ | EV_PERSIST,DATA_BUFFER_SIZE,tcp_transport); 

dispatch_conn_new()的工作是往工作線程工作隊列中添加任務(前面已經提到過),所以其中一個沉睡的工作線程會被喚醒,thread_libevent_process()會被工作線程調用,注意這些機制都是由 libevent 提供的。

thread_libevent_process()調用conn_new()新建 struct conn 結構體,且狀態(tài)為 conn_new_cmd,其對應的就是剛才accept()的連接套接字.conn_new()最關鍵的任務是將剛才接受的套接字在 libevent 中注冊一個事件,回調函數(shù)是event_handler()。循環(huán)繼續(xù),狀態(tài) conn_new_cmd 下的操作只是只是將 conn 的狀態(tài)轉換為 conn_waiting;

循環(huán)繼續(xù),conn_waiting 狀態(tài)下的操作只是將 conn 狀態(tài)轉換為 conn_read,循環(huán)退出。

此后,如果客戶端不請求服務,那么主線程和工作線程都會沉睡,注意這些機制都是由 libevent 提供的。

客戶敲擊命令「get key」后,工作線程會被喚醒,event_handler()被調用了??? 又被調用了.event_handler()->drive_machine(),此時 conn 的狀態(tài)為 conn_read。conn_read 下的操作就是讀數(shù)據了,如果讀取成功,conn 狀態(tài)被轉換為 conn_parse_cmd。

循環(huán)繼續(xù),conn_parse_cmd 狀態(tài)下的操作就是嘗試解析命令: 可能是較為簡單的命令,就直接回復,狀態(tài)轉換為 conn_close,循環(huán)接下去就結束了; 涉及存取操作的請求會導致 conn_parse_cmd 狀態(tài)轉換為 conn_nread。

循環(huán)繼續(xù),conn_nread 狀態(tài)下的操作是真正執(zhí)行存取命令的地方。里面的操作無非是在內存尋找數(shù)據項,返回數(shù)據。所以接下來的狀態(tài) conn_mwrite,它的操作是為客戶端回復數(shù)據。

狀態(tài)又回到了 conn_new_cmd 迎接新的請求,直到客戶命令結束服務或者發(fā)生致命錯誤。大概就是這么個過程。

#p#

memcached 的分布式

memcached 的服務器沒有向其他 memcached 服務器收發(fā)數(shù)據的功能,意即就算部署多個 memcached 服務器,他們之間也沒有任何的通信。memcached 所謂的分布式部署也是并非平時所說的分布式。所說的「分布式」是通過創(chuàng)建多個 memcached 服務器節(jié)點,在客戶端添加緩存請求分發(fā)器來實現(xiàn)的。memcached 的更多的時候限制是來自網絡 I/O,所以應該盡量減少網絡 I/O。

320131223103255

我在 github 上分享了 memcached 的源碼剖析注釋: 這里

原文鏈接:https://github.com/daoluan/decode-memcached

譯文鏈接:http://blog.jobbole.com/53861/

責任編輯:陳四芳 來源: 伯樂在線
相關推薦

2014-07-03 15:40:09

Apache Spar

2021-11-22 16:12:34

Axios Axios-Retry前端

2021-11-19 07:54:59

Axios網絡源碼

2018-11-16 16:35:19

Java源碼編程語言

2022-10-08 08:01:17

Spring源碼服務

2012-02-14 14:05:59

JavaSpring

2017-04-05 16:40:45

2017-03-16 11:39:33

Openstack源碼姿勢

2018-03-28 16:10:23

閱讀源碼境界

2021-08-02 09:50:47

Vetur源碼SMART

2017-04-13 19:26:21

2014-07-29 09:44:58

jQuery源碼

2021-03-13 14:08:00

Hadoop 源碼HDFS

2021-12-20 07:58:59

GitHub源碼代碼

2018-12-18 13:54:57

MVPGoogleAndroid

2020-12-07 11:29:24

ReactVueVue3

2017-03-27 15:15:43

Hive源碼編譯

2014-12-30 11:04:39

懶人筆記

2021-01-06 05:45:58

Dubbo源碼高并發(fā)

2021-03-13 11:23:51

源碼邏輯框架
點贊
收藏

51CTO技術棧公眾號

最新精品在线| 成黄免费在线| 亚洲国产高清视频| 亚洲乱码国产乱码精品精天堂| 国产中文字幕视频在线观看| 无码国精品一区二区免费蜜桃| 免播放器亚洲| 日韩亚洲欧美中文在线| 国产男女无遮挡猛进猛出| 91九色国产在线播放| 久久精品一区二区| 91亚洲精品一区| 国产精品2020| 日韩aaaa| 亚洲精品456在线播放狼人| 成人一级片网站| 国产日产一区二区| 91在线精品秘密一区二区| 成人精品一区二区三区| 日韩成人一区二区三区| 婷婷综合激情| 亚洲欧美一区二区激情| 天堂av.com| 国产精品av一区二区三区| 亚洲欧美日韩久久精品| 久久久婷婷一区二区三区不卡| 怡春院在线视频| 日韩一区二区免费看| 在线日韩av观看| 少妇一级淫免费观看| 99re8精品视频在线观看| 欧美性极品少妇精品网站| 致1999电视剧免费观看策驰影院| 无码国产精品一区二区色情男同 | 97精品久久久久中文字幕| 国产精品爽爽爽爽爽爽在线观看| 久热精品在线观看| 国产精品久久久久久久久妇女| 日韩精品免费电影| japan高清日本乱xxxxx| a成人v在线| 欧美视频专区一二在线观看| 欧洲精品在线播放| 好了av在线| 国产精品视频一区二区三区不卡| 久久久99爱| 国产自产一区二区| 国产麻豆精品一区二区| 国产欧美精品va在线观看| 精品国产一区二区三区四| 国产精品va| 久久影院资源网| www.日本高清视频| 精品美女视频| 亚洲人成网站免费播放| 国产精品无码一区二区三| 成人精品毛片| 精品国内二区三区| 91精品国产福利| 国产午夜久久久久| 国产高清精品一区| 亚洲自拍欧美另类| 国产 中文 字幕 日韩 在线| 4438五月综合| 国产精品久久久久无码av| 亚洲日韩欧美视频| 久久午夜夜伦鲁鲁片| 婷婷成人综合| 亚洲人成毛片在线播放| 成人无码av片在线观看| 国内精品久久久久久99蜜桃| 亚洲一区二区精品| 欧美a在线播放| 无码国模国产在线观看| 色欲综合视频天天天| 欧美极品少妇无套实战| 98在线视频| 成人综合在线视频| 好吊妞www.84com只有这里才有精品| 免费观看a视频| 久久亚洲一区二区三区四区| 欧美日韩国产一二| 18免费在线视频| 亚洲欧洲精品成人久久奇米网| 在线一区亚洲| 污污视频在线看| 五月天亚洲婷婷| 韩国日本在线视频| 日本免费在线一区| 欧美大片拔萝卜| 免费中文字幕av| 成人亚洲一区| 精品中文字幕在线2019| 西西44rtwww国产精品| 日韩在线观看一区二区| 91系列在线观看| 丁香六月色婷婷| 337p粉嫩大胆噜噜噜噜噜91av| 午夜精品一区二区在线观看| 国内精品久久久久久野外| 亚洲第一主播视频| 成人免费毛片播放| 国产乱码精品一区二区三区亚洲人 | av中文字幕在线看| 色综合色综合色综合| 亚洲人视频在线| 精品深夜福利视频| 色系列之999| www.99re7.com| 欧美aaaaaa午夜精品| 99国产超薄肉色丝袜交足的后果| 欧美一区二区少妇| 亚洲色图欧美在线| 无码aⅴ精品一区二区三区浪潮| 国产91亚洲精品久久久| 亚洲第一视频在线观看| 二区三区四区视频| 亚洲在线播放| 亚洲自拍偷拍在线| 黄色小视频在线免费观看| 亚洲精品高清视频在线观看| 国产精品亚洲a| 国产福利资源一区| 俺去亚洲欧洲欧美日韩| 日韩 国产 欧美| 成人听书哪个软件好| 亚洲一区3d动漫同人无遮挡 | 国产高清在线不卡| 亚洲黄色在线播放| 成人免费在线视频| 可以在线看的黄色网址| 国产伦乱精品| 久久亚洲精品视频| 免费看av在线| 久久综合九色综合久久久精品综合| 少妇久久久久久被弄到高潮| 欧美黄色网络| 国产午夜精品免费一区二区三区| 人人干人人干人人干| 国产成人免费在线| 宅男av一区二区三区| 国产综合av| 亚洲免费视频一区二区| 天海翼一区二区| 成人妖精视频yjsp地址| 欧美日韩中文字幕在线播放| 日韩在线激情| 日韩中文字幕视频在线| 伊人久久中文字幕| 久久久久久久久久久久久女国产乱| 欧美午夜性视频| 国产精品丝袜在线播放| 久久免费视频在线| 亚洲精品久久久久久无码色欲四季 | 校园春色亚洲| 精品在线小视频| 亚洲天堂视频网站| 26uuu另类欧美| 免费看一级大黄情大片| 欧美人体视频| 青青久久aⅴ北条麻妃| 四虎影视精品成人| 欧美日韩国产在线| 一本加勒比北条麻妃| 久久成人在线| 色一情一乱一伦一区二区三区 | 欧美三级网页| 国产美女精品在线观看| 国产ktv在线视频| 日韩精品一区二区三区第95| 日韩欧美亚洲一区二区三区| 91丨九色丨蝌蚪富婆spa| av黄色在线网站| 国产在视频线精品视频www666| 国产精品福利在线观看网址| 午夜毛片在线| 日韩精品在线网站| 色播视频在线播放| 久久久精品影视| 国产一级片自拍| 牛牛国产精品| 精品国产乱码久久久久久88av| 中国色在线日|韩| 国产一区二区av| 国产精品无码天天爽视频| 亚洲激情中文1区| 日本丰满少妇裸体自慰 | 一区二区三区四区精品在线视频 | 中文字幕亚洲无线码a| 国产又粗又猛又爽又黄的| 亚洲欧美激情小说另类| 国产免费一区二区三区最新6| 国产婷婷精品| 亚洲一区美女| 激情小说一区| 国产精品视频精品| 毛片在线导航| 一区二区三区亚洲| 亚洲精品久久久久久无码色欲四季 | 亚洲精品小视频| 11024精品一区二区三区日韩| 亚洲在线视频网站| 欧美特黄一区二区三区| 国产在线播放一区| 波多野结衣50连登视频| 天堂网在线观看国产精品| 国产精品大全| 国产精品66| 91tv亚洲精品香蕉国产一区7ujn| 亚洲欧美视频一区二区| 亚洲国产精品99久久| 依依成人在线视频| 欧美日韩亚洲精品内裤| 日本中文在线视频| 久久精品综合网| 中文字幕第3页| 久久99国产精品久久99| 成人久久久久久久久| 欧美另类综合| 亚洲一区二区精品在线观看| 亚洲尤物av| 成人蜜桃视频| 欧美黑粗硬大| 国产成人综合精品| 午夜不卡影院| 久久久久久免费精品| 黄色成年人视频在线观看| 亚洲社区在线观看| 日本波多野结衣在线| 91精品国产免费久久综合| 波多野结衣激情视频| 天天做天天摸天天爽国产一区| 成人在线观看小视频| 日本一区二区动态图| 免费在线观看你懂的| 成人午夜激情片| www.黄色网| 国产老女人精品毛片久久| 天天综合网日韩| 天堂久久久久va久久久久| 国产视频九色蝌蚪| 日韩午夜免费视频| 男女视频网站在线观看| 欧美日韩亚洲一区| a级黄色片免费| 我不卡神马影院| 小说区视频区图片区| 日本a口亚洲| 深田咏美在线x99av| 国产一区99| 日本欧洲国产一区二区| 久久av综合| 日本福利一区二区三区| 亚洲欧洲免费| 欧美在线播放一区| 精品午夜久久| 亚洲精品成人a8198a| 91日韩欧美| 国产一级黄色录像片| 欧美三级免费| 国产原创中文在线观看| 99精品视频免费全部在线| 成人免费在线小视频| 久久国产精品亚洲77777| 成人一级片网站| 日韩电影免费在线看| 99re精彩视频| 国产美女精品人人做人人爽| 人妻av一区二区三区| 成人福利视频在线看| 国产激情视频网站| 久久精品一二三| 91精品少妇一区二区三区蜜桃臀| 亚洲色图视频免费播放| 精品一区免费观看| 欧美性xxxxx极品| 亚洲天堂网视频| 日韩欧美aaaaaa| 日韩av资源| 日韩亚洲第一页| wwww在线观看免费视频| 日本一区二区三区四区视频| 另类一区二区| 国产精品v欧美精品v日韩| 国产一区二区精品福利地址| 亚洲免费av网| 在线观看视频日韩| 超碰在线97免费| 国产91精品精华液一区二区三区 | 国产精品美女视频| 最近中文字幕免费视频| 国产精品久久久久久亚洲毛片 | 88国产精品视频一区二区三区| 99久久99久久精品| 欧美色图麻豆| 尤蜜粉嫩av国产一区二区三区| 激情综合亚洲精品| 亚洲成人日韩在线| 中文字幕的久久| 欧美黑吊大战白妞| 日本韩国一区二区三区| 中文字幕乱码无码人妻系列蜜桃| 欧美一区二区三区的| 蝌蚪视频在线播放| 久久躁日日躁aaaaxxxx| 人在线成免费视频| 亚洲a∨日韩av高清在线观看| 狠狠久久伊人| 水蜜桃一区二区三区| 亚洲激情中文| 国产91在线免费| 国产黄色成人av| www色com| 亚洲成人第一页| 国产深喉视频一区二区| 亚洲国产日韩欧美综合久久 | 免费观看亚洲天堂| 日韩高清国产精品| 亚洲视频综合| 中文字幕成人在线视频| 91免费观看在线| 欧美 日韩 国产 一区二区三区| 亚洲成人黄色影院| 精品黑人一区二区三区在线观看| 日韩精品久久久久| 欧美a在线看| 欧美在线国产精品| 久久九九精品视频| 一本久道久久综合狠狠爱亚洲精品| 极品少妇一区二区三区| 日韩欧美国产片| 国产午夜精品一区二区三区嫩草| 免费在线观看h片| 欧美日韩国产天堂| 天堂v视频永久在线播放| 久久精品成人欧美大片| 99热播精品免费| 久久综合色一本| 尤物在线精品| 妖精视频在线观看| 中文字幕亚洲一区二区av在线| 波多野结衣二区三区| 日韩国产一区三区| 丁香高清在线观看完整电影视频| 亚洲自拍高清视频网站| 97精品视频在线看| 波多野结衣家庭教师视频| 26uuu精品一区二区| 久久精品久久国产| 日韩欧美一级精品久久| 免费人成在线观看播放视频| 国产精品自产拍在线观看| 国产aⅴ精品一区二区三区久久| 男人天堂网视频| 国产清纯在线一区二区www| 国产成人精品一区二三区| 日韩av在线免费观看| 四季久久免费一区二区三区四区| 国产精品专区第二| 99久久激情| 午夜久久福利视频| 亚洲日本va在线观看| 国产精品毛片一区二区在线看舒淇| 亚洲男人av在线| 成人国产一区二区三区精品麻豆| 日本一区二区不卡高清更新| 快she精品国产999| 日本激情小视频| 在线观看免费亚洲| 色哟哟免费在线观看| 91色视频在线导航| 欧美午夜一区| 日本wwwwwww| 亚洲动漫第一页| 头脑特工队2在线播放| 91产国在线观看动作片喷水| 日韩欧美黄色| 爱情岛论坛vip永久入口| 国产精品麻豆网站| 国产女人高潮时对白| 97在线免费观看| 日本中文字幕在线一区| 亚洲少妇久久久| 亚洲人成亚洲人成在线观看图片 | 裸体丰满少妇做受久久99精品| 久久久亚洲一区| 中文字幕 自拍| 欧美一区二区在线视频| 黑人精品视频| 久久久水蜜桃| 另类调教123区| 精品无码在线观看| 日韩欧美的一区| 少妇视频一区| 欧美日韩视频免费在线观看| 国产成人综合亚洲网站| 91视频在线视频| 亚洲国产福利在线| 96视频在线观看欧美| 隔壁人妻偷人bd中字|