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

高并發高性能的定時器實現

開發 架構
我們經常都會碰到延遲任務,定時任務這種需求。在網絡連接的場景中,常常會出現一些超時控制。隨著連接數量的增加,這些超時任務的數量往往也是很龐大的。實現對大量任務的超時管理并不是一個容易的事情。

[[413551]]

前言

我們經常都會碰到延遲任務,定時任務這種需求。在網絡連接的場景中,常常會出現一些超時控制。隨著連接數量的增加,這些超時任務的數量往往也是很龐大的。實現對大量任務的超時管理并不是一個容易的事情。

幾種定時任務的實現

java.util.Timer

JDK 在 1.3 的時候引入了Timer數據結構用于實現定時任務。Timer的實現思路比較簡單,其內部有兩個主要屬性:

  • TaskQueue:定時任務抽象類TimeTask的列表。
  • TimerThread:用于執行定時任務的線程。
  1. private final TaskQueue queue = new TaskQueue();   
  2.     private final TimerThread thread = new TimerThread(queue); 

Timer結構還定義了一個抽象類TimerTask并且繼承了Runnable接口。業務系統實現了這個抽象類的run方法用于提供具體的延時任務邏輯。

TaskQueue內部采用大頂堆的方式,依據任務的觸發時間進行排序。而TimerThread則以死循環的方式從TaskQueue獲取隊列頭,等待隊列頭的任務的超時時間到達后觸發該任務,并且將任務從隊列中移除。

Timer的數據結構和算法都很容易理解。所有的超時任務都首先進入延時隊列。后臺超時線程不斷的從延遲隊列中獲取任務并且等待超時時間到達后執行任務。延遲隊列采用大頂堆排序,在延遲任務的場景中有三種操作,分別是:添加任務,提取隊列頭任務,查看隊列頭任務。

查看隊列頭任務的事件復雜度是 O(1) 。而添加任務和提取隊列頭任務的時間復雜度都是 O(Logn) 。當任務數量較大時,添加和刪除的開銷也是比較大的。此外,由于Timer內部只有一個處理線程,如果有一個延遲任務的處理消耗了較多的時間,會對應的延遲后續任務的處理。

代碼如下:

  1. public static void main(String[] args) { 
  2.         Timer timer = new Timer(); 
  3.         // 延遲 1秒 執行任務 
  4.         timer.schedule( 
  5.                 new java.util.TimerTask() { 
  6.                     @Override 
  7.                     public void run() { 
  8.                         System.out.println("延遲 1秒 執行任務"+System.currentTimeMillis()); 
  9.                     } 
  10.                 } 
  11.         ,1000); 
  12.  
  13.         timer.schedule( 
  14.                 new java.util.TimerTask() { 
  15.                     @Override 
  16.                     public void run() { 
  17.                         System.out.println("延遲 2秒 執行任務"+System.currentTimeMillis()); 
  18.                     } 
  19.                 } 
  20.                 ,2000); 
  21.         try { 
  22.             Thread.sleep(5000); 
  23.         } catch (InterruptedException e) { 
  24.             e.printStackTrace(); 
  25.         } 
  26.         timer.cancel(); 
  27.     } 

ScheduledThreadPoolExecutor

由于Timer只有一個線程用來處理延遲任務,在任務數量很多的時候顯然是不足夠的。在 JDK1.5 引入線程池接口ExecutorService后,也對應的提供了一個用于處理延時任務的ScheduledExecutorService子類接口。該接口內部也一樣使用了一個使用小頂堆進行排序的延遲隊列存放任務。線程池中的線程會在這個隊列上等待直到有任務可以提取。

整體來說,ScheduledExecutorService 區別于 Timer 的地方就在于前者依賴了線程池來執行任務,而任務本身會判斷是什么類型的任務,需要重復執行的在任務執行結束后會被重新添加到任務隊列。

而對于后者來說,它只依賴一個線程不停的去獲取隊列首部的任務并嘗試執行它,無論是效率上、還是安全性上都比不上前者。

ScheduledExecutorService的實現上有一些特殊,只有一個線程能夠提取到延遲隊列頭的任務,并且根據任務的超時時間進行等待。在這個等待期間,其他的線程是無法獲取任務的。這樣的實現是為了避免多個線程同時獲取任務,導致超時時間未到達就任務觸發或者在等待任務超時時間時有新的任務被加入而無法響應。

由于ScheduledExecutorService可以使用多個線程,這樣也緩解了因為個別任務執行時間長導致的后續任務被阻塞的情況。不過延遲隊列也是一樣采用小頂堆的排序方式,因此添加任務和刪除任務的時間復雜度都是 O(Logn) 。在任務數量很大的情況下,性能表現比較差。

代碼如下:

  1. public class ScheduledThreadPoolServiceTest { 
  2.     // 參數代表可以同時執行的定時任務個數 
  3.     private ScheduledExecutorService service = Executors.newScheduledThreadPool(3); 
  4.     /** 
  5.      * schedule:延時2秒執行一次任務 
  6.      */ 
  7.     public void task0() { 
  8.         service.schedule(() -> { 
  9.             System.out.println("task0-start"); 
  10.             sleep(2); 
  11.             System.out.println("task0-end"); 
  12.         }, 2, TimeUnit.SECONDS); 
  13.     } 
  14.  
  15.     /** 
  16.      * scheduleAtFixedRate:2秒后,每間隔4秒執行一次任務 
  17.      * 注意,如果任務的執行時間(例如6秒)大于間隔時間,則會等待任務執行結束后直接開始下次任務 
  18.      */ 
  19.     public void task1() { 
  20.         service.scheduleAtFixedRate(() -> { 
  21.             System.out.println("task1-start"); 
  22.             sleep(2); 
  23.             System.out.println("task1-end"); 
  24.         }, 2, 4, TimeUnit.SECONDS); 
  25.     } 
  26.  
  27.     /** 
  28.      * scheduleWithFixedDelay:2秒后,每次延時4秒執行一次任務 
  29.      * 注意,這里是等待上次任務執行結束后,再延時固定時間后開始下次任務 
  30.      */ 
  31.     public void task2() { 
  32.         service.scheduleWithFixedDelay(() -> { 
  33.             System.out.println("task2-start"); 
  34.             sleep(2); 
  35.             System.out.println("task2-end"); 
  36.         }, 2, 4, TimeUnit.SECONDS); 
  37.     } 
  38.  
  39.     private void sleep(long time) { 
  40.         try { 
  41.             TimeUnit.SECONDS.sleep(time); 
  42.         } catch (InterruptedException e) { 
  43.             e.printStackTrace(); 
  44.         } 
  45.     } 
  46.  
  47.     public static void main(String[] args) { 
  48.         ScheduledThreadPoolServiceTest test = new ScheduledThreadPoolServiceTest(); 
  49.         System.out.println("main start"); 
  50.         test.task0(); 
  51.         //test.task1(); 
  52.        // test.task2(); 
  53.         test.sleep(10); 
  54.         System.out.println("main end"); 
  55.     } 

DelayQueue

Java 中還有個延遲隊列 DelayQueue,加入延遲隊列的元素都必須實現 Delayed 接口。延遲隊列內部是利用 PriorityQueue 實現的,所以還是利用優先隊列!Delayed 接口繼承了Comparable 因此優先隊列是通過 delay 來排序的。

Redis sorted set

Redis的數據結構Zset,同樣可以實現延遲隊列的效果,主要利用它的score屬性,redis通過score來為集合中的成員進行從小到大的排序。zset 內部是用跳表實現的。

跳表數據結構的示意圖:

總體上,跳躍表刪除操作的時間復雜度是O(logN)。

有沒有更高效的數據結構?

Timer 、ScheduledThreadPool 、 DelayQueue,總結的說下它們都是通過優先隊列來獲取最早需要執行的任務,因此插入和刪除任務的時間復雜度都為O(logn),并且 Timer 、ScheduledThreadPool 的周期性任務是通過重置任務的下一次執行時間來完成的。

但是由于新增任務和提取任務的時間復雜度都是 O(Logn) ,在任務數量很大,比如幾萬,十幾萬的時候,性能的開銷就變得很巨大。

問題就出在時間復雜度上,插入刪除時間復雜度是O(logn),那么假設頻繁插入刪除次數為 m,總的時間復雜度就是O(mlogn)

那么,是否存在新增任務和提取任務比 O(Log2n) 復雜度更低的數據結構呢?答案是存在的。在論文《Hashed and Hierarchical Timing Wheels》中設計了一種名為時間輪( Timing Wheels )的數據結構,這種結構在處理延遲任務時,其新增任務和刪除任務的時間復雜度降低到了 O(1) 。

時間輪算法

基本原理

見名知意,時間輪的數據結構很類似于我們鐘表上的數據指針。

時間輪用環形數組實現,數組的每個元素可以稱為槽,和 HashMap一樣稱呼。

槽的內部用雙向鏈表存著待執行的任務,添加和刪除的鏈表操作時間復雜度都是 O(1),槽位本身也指代時間精度,比如一秒掃一個槽,那么這個時間輪的最高精度就是 1 秒。

也就是說延遲 1.2 秒的任務和 1.5 秒的任務會被加入到同一個槽中,然后在 1 秒的時候遍歷這個槽中的鏈表執行任務。

任務插入

當有一個延遲任務要插入時間輪時,首先計算其延遲時間與單位時間的余值,從指針指向的當前槽位移動余值的個數槽位,就是該延遲任務需要被放入的槽位。

舉個例子,時間輪有8個槽位,編號為 0 ~ 7 。指針當前指向槽位 2 。新增一個延遲時間為 4 秒的延遲任務,4 % 8 = 4,因此該任務會被插入 4 + 2 = 6,也就是槽位6的延遲任務隊列。

時間槽位的實現

時間輪的槽位實現可以采用循環數組的方式達成,也就是讓指針在越過數組的邊界后重新回到起始下標。概括來說,可以將時間輪的算法描述為:

用隊列來存儲延遲任務,同一個隊列中的任務,其延遲時間相同。用循環數組的方式來存儲元素,數組中的每一個元素都指向一個延遲任務隊列。

有一個當前指針指向數組中的某一個槽位,每間隔一個單位時間,指針就移動到下一個槽位。被指針指向的槽位的延遲隊列,其中的延遲任務全部被觸發。

在時間輪中新增一個延遲任務,將其延遲時間除以單位時間得到的余值,從當前指針開始,移動余值對應個數的槽位,就是延遲任務被放入的槽位。

基于這樣的數據結構,插入一個延遲任務的時間復雜度就下降到 O(1) 。而當指針指向到一個槽位時,該槽位連接的延遲任務隊列中的延遲任務全部被觸發。

延遲任務的觸發和執行不應該影響指針向后移動的時間精確性。因此一般情況下,用于移動指針的線程只負責任務的觸發,任務的執行交由其他的線程來完成。比如,可以將槽位上的延遲任務隊列放入到額外的線程池中執行,然后在槽位上新建一個空白的新的延遲任務隊列用于后續任務的添加。

關于擴容

那假設現在要加入一個50秒后執行的任務怎么辦?這槽好像不夠啊?難道要加槽嘛?和HashMap一樣擴容?

假設要求精度為 1 秒,要能支持延遲時間為 1 天的延遲任務,時間輪的槽位數需要 60 × 60 × 24 = 86400 。這就需要消耗更多的內存。顯然,單純增加槽位數并不是一個好的解決方案。

常見有兩種方式:

通過增加輪次。50 % 8 + 1 = 3,即應該放在槽位是 3,下標是 2 的位置。然后 (50 - 1) / 8 = 6,即輪數記為 6。也就是說當循環 6 輪之后掃到下標的 2 的這個槽位會觸發這個任務。Netty 中的 HashedWheelTimer 使用的就是這種方式。

通過多層次。這個和我們的手表就更像了,像我們秒針走一圈,分針走一格,分針走一圈,時針走一格。

多層次時間輪就是這樣實現的。假設上圖就是第一層,那么第一層走了一圈,第二層就走一格。

可以得知第二層的一格就是8秒,假設第二層也是 8 個槽,那么第二層走一圈,第三層走一格,可以得知第三層一格就是 64 秒。

那么一格三層,每層8個槽,一共 24 個槽時間輪就可以處理最多延遲 512 秒的任務。

而多層次時間輪還會有降級的操作,假設一個任務延遲 500 秒執行,那么剛開始加進來肯定是放在第三層的,當時間過了 436 秒后,此時還需要 64 秒就會觸發任務的執行,而此時相對而言它就是個延遲 64 秒后的任務,因此它會被降低放在第二層中,第一層還放不下它。

再過個 56 秒,相對而言它就是個延遲 8 秒后執行的任務,因此它會再被降級放在第一層中,等待執行。

降級是為了保證時間精度一致性。Kafka內部用的就是多層次的時間輪算法。

降級過程:

本文轉載自微信公眾號「小汪哥寫代碼」,可以通過以下二維碼關注。轉載本文請聯系小汪哥寫代碼公眾號。

 

責任編輯:武曉燕 來源: 小汪哥寫代碼
相關推薦

2020-11-10 07:46:09

服務器高并發高性能

2023-11-01 11:13:58

Linux信號處理定時器

2021-05-24 09:28:41

軟件開發 技術

2024-12-04 10:58:57

TomcatJetty高并發

2016-12-21 09:33:40

2017-11-27 09:14:29

2023-11-06 08:32:17

FastAPIPython

2022-06-02 12:56:25

容器網絡云原生

2010-07-28 15:56:22

FlexTimer定時

2009-11-11 10:14:10

linux定時器操作系統

2009-06-18 11:07:17

Spring fram

2018-05-13 22:23:32

2009-06-15 15:02:48

Spring定時器

2021-08-11 10:10:26

Linux定時器數組

2022-11-02 11:40:16

Flowable定時器流程

2023-12-11 09:50:35

Linux定時器

2021-09-22 16:25:17

服務器戴爾科技集團

2021-06-28 06:00:11

systemd定時器系統運維

2016-09-12 14:07:14

Android 定時器

2019-12-31 10:33:57

Netty高性能內存
點贊
收藏

51CTO技術棧公眾號

婷婷六月综合亚洲| 不卡一区综合视频| 亚洲一区二区三区视频在线播放| 高清不卡日本v二区在线| 精品91久久久| 波多野结衣一区| 欧美一级高清大全免费观看| 九一国产精品视频| 成年人在线观看视频| 狠狠色丁香婷婷综合久久片| 久久全国免费视频| 日韩欧美黄色网址| 亚洲一区二区三区在线免费| 欧美午夜精品久久久久久浪潮| 亚洲高清精品中出| 亚洲老妇色熟女老太| 日韩影院在线观看| 久久久久久久一| 中文字幕第24页| 凹凸成人在线| 欧美日韩国产影片| 男女激情无遮挡| 黄色片免费在线观看| 91蜜桃传媒精品久久久一区二区| 91亚洲精品在线| 无码人妻精品一区二区50| 午夜久久福利| 色狠狠久久aa北条麻妃| 国产麻豆xxxvideo实拍| 97精品资源在线观看| 色噜噜偷拍精品综合在线| 农民人伦一区二区三区| 免费在线看黄| 国产人成一区二区三区影院| 激情久久av| xxxx18国产| 国内精品写真在线观看| 国产精品网红直播| 亚洲 欧美 成人| 在线成人黄色| 欧美风情在线观看| 国产黄在线免费观看| 久久精品国产99久久| 国产亚洲成av人片在线观看桃| 中文字幕乱码一区| 99re热精品视频| 日韩视频免费观看高清完整版在线观看 | 国产乱色精品成人免费视频| 丝袜亚洲精品中文字幕一区| 91tv亚洲精品香蕉国产一区7ujn| 久久精品视频久久| 黄色日韩在线| 欧美黑人性视频| 欧美日韩免费做爰视频| 中文字幕一区二区三区乱码图片| 久久午夜a级毛片| 免费高清在线观看电视| 亚洲澳门在线| 欧美国产在线电影| 国产一级一片免费播放| jizz一区二区| 中文字幕最新精品| 手机看片福利视频| 欧美美女视频| 色伦专区97中文字幕| eeuss中文字幕| 日韩欧美网址| 久久在线精品视频| 青娱乐在线视频免费观看| 午夜天堂精品久久久久| 欧美激情亚洲视频| 日韩欧美亚洲一区二区三区| 香蕉成人久久| 国产精品日韩专区| 中国女人真人一级毛片| 久久成人免费网站| 91免费在线观看网站| 免费看av毛片| 久久精品亚洲乱码伦伦中文| 亚洲精品日韩在线观看| 超碰免费公开在线| 亚洲午夜久久久久久久久电影院| 国产午夜大地久久| 欧美日韩在线精品一区二区三区激情综合| 欧美自拍偷拍午夜视频| 午夜一区二区视频| 成人福利一区| 一区二区在线视频播放| 国产大片免费看| 国产欧美精品| 国产精品欧美日韩一区二区| 国产偷拍一区二区| 91女厕偷拍女厕偷拍高清| 亚洲在线色站| a级片免费在线观看| 精品久久久久久久中文字幕| 一区二区三区 欧美| 午夜视频一区二区在线观看| 亚洲精品小视频在线观看| 91大神福利视频| 亚洲美女黄网| 91香蕉国产在线观看| 视频污在线观看| 国产精品乱码一区二区三区软件 | 久cao在线| 天天综合网 天天综合色| 午夜视频你懂的| 懂色av一区二区| www.日本久久久久com.| 中文字幕亚洲精品在线| 精品在线播放免费| 蜜桃在线一区二区三区精品| 91麻豆一二三四在线| 在线视频欧美精品| 亚洲一区二区在线免费| 天天揉久久久久亚洲精品| 欧美在线视频在线播放完整版免费观看 | 国产综合亚洲精品一区二| 日本aⅴ大伊香蕉精品视频| 国产成人精品一区二区无码呦| 国产日韩v精品一区二区| 妞干网在线观看视频| 成人免费91| 中文字幕精品在线| 日韩不卡视频在线| 高清免费成人av| 最新视频 - x88av| 黄色日韩网站| 一区二区三区国产视频| wwwxxx亚洲| 成人国产精品免费| 国产91在线亚洲| www999久久| 色999日韩欧美国产| 日韩乱码一区二区三区| 2024国产精品| 欧美a v在线播放| 久久草在线视频| 欧美极品欧美精品欧美视频| www.久久久久久| 亚洲欧洲综合另类| 久久久久久久久久久久久久久国产| 欧美日韩激情在线一区二区三区| 5566日本婷婷色中文字幕97| 四虎精品成人免费网站| 无码av中文一区二区三区桃花岛| 国产精品久久久久久亚洲色| 亚洲一级影院| 国产午夜精品在线| av在线最新| 亚洲高清色综合| 日本a在线观看| 97久久人人超碰| 丝袜老师办公室里做好紧好爽| 亚洲精品小区久久久久久| 欧美中文在线字幕| 免费在线观看污视频| 91福利精品第一导航| 极品人妻videosss人妻| 久久精品国产亚洲一区二区三区| 亚洲人成影视在线观看| 日韩黄色碟片| 欧美成人精品一区二区三区| www.中文字幕| 国产精品一区二区婷婷| 麻豆精品国产传媒mv男同| 日韩av一级大片| 超碰这里只有精品| 久久久国产一区二区三区| 国产视频第二页| 亚洲一二三四区| 日本黄色片在线播放| 老妇喷水一区二区三区| 亚洲国产精品久久久久久女王| 国产成人精品一区二区三区视频| 久久精品最新地址| 亚洲av综合色区无码一二三区| 天天操天天干天天综合网| 国产成人av一区二区三区不卡| 青青草精品视频| 日韩亚洲欧美一区二区| 亚洲自拍电影| 成人网中文字幕| 爱啪啪综合导航| 中文字幕亚洲综合| 精品久久国产视频| 姬川优奈aav一区二区| 国产又大又粗又爽的毛片| 黑人巨大精品欧美一区| 久久久亚洲国产精品| 欧美日韩高清| 国产另类自拍| 久久亚洲精品人成综合网| 欧美激情网友自拍| 激情小视频在线| 日韩欧美在线影院| 无码任你躁久久久久久久| 亚洲欧洲精品一区二区精品久久久 | 日本亚州欧洲精品不卡| 国内精品小视频在线观看| 精品影院一区| 日韩色在线观看| 久久精品视频2| 一区二区三区免费看视频| 亚洲成人日韩在线| 九九**精品视频免费播放| 国产原创popny丨九色| 久久久久久美女精品 | 热久久免费国产视频| 肉体视频在线| 中文字幕在线日韩| 青青草超碰在线| 日韩小视频在线观看专区| 欧美brazzers| 亚洲成人777| www.99re7| 国产精品久线在线观看| www.久久av| 粉嫩一区二区三区性色av| 五月婷婷丁香色| 久久国产精品99国产| 你真棒插曲来救救我在线观看| 91精品福利| 色综合久久久久久久久五月| 日本欧美高清| 国产另类自拍| 这里视频有精品| 亚洲一区亚洲二区| 91成人福利社区| 国产在线观看精品| 精品123区| 国产精欧美一区二区三区| 韩日毛片在线观看| 欧美激情精品久久久久久免费印度 | 色播一区二区| 国产在线拍揄自揄视频不卡99| 成人黄色免费短视频| 97精品视频在线| xxxx视频在线| 欧美俄罗斯乱妇| 1stkiss在线漫画| 欧美高清第一页| 视频在线这里都是精品| 欧美成人黄色小视频| 成人video亚洲精品| 久久精品久久精品亚洲人| 三区四区在线视频| 色噜噜狠狠狠综合曰曰曰88av| 午夜老司机在线观看| 久久精品国产96久久久香蕉| 色欧美激情视频在线| 日韩中文理论片| 免费在线观看av| 久久久国产精品一区| 国产网站在线免费观看| 欧美成人精品三级在线观看| 日韩欧美一起| 隔壁老王国产在线精品| av影院在线免费观看| 日本精品久久电影| free欧美| 成人黄色免费网站在线观看| 久久在线观看| 国产另类自拍| 国产成人精品三级高清久久91| 欧美主播一区二区三区美女 久久精品人 | 天堂蜜桃一区二区三区 | 国产一级精品在线| 女王人厕视频2ⅴk| 成人免费观看视频| 91网站免费入口| 国产精品的网站| 九九在线观看视频| 五月婷婷另类国产| 午夜精品久久久久久久蜜桃| 欧美乱熟臀69xxxxxx| www.我爱av| 精品中文字幕久久久久久| 91福利在线视频| 精品中文字幕在线2019| 免费高潮视频95在线观看网站| 国产精品96久久久久久又黄又硬| 99精品美女视频在线观看热舞| 国产二区不卡| 欧美猛男同性videos| 只有这里有精品| 一区二区高清| 亚洲综合av在线播放| 成人黄色在线网站| 99久久99久久精品免费| 夜夜揉揉日日人人青青一国产精品| av黄色在线播放| 日韩一区二区视频| 欧美孕妇孕交| 欧美日产国产成人免费图片| 欧美香蕉视频| av一区二区在线看| 精品国产网站| 人妻久久久一区二区三区| 美国十次了思思久久精品导航| 国产婷婷在线观看| 国产精品久久精品日日| 色播视频在线播放| 91精品蜜臀在线一区尤物| 人成在线免费视频| 九九热视频这里只有精品| 日本另类视频| 精品欧美日韩| 欧美精品97| 日韩高清第一页| 久久尤物电影视频在线观看| 91麻豆免费视频网站| 日本国产一区二区| 蜜桃在线一区二区| 成年人精品视频| 福利一区和二区| 日本成人看片网址| 99国产精品久久久久久久| 人妻换人妻仑乱| 中文字幕在线免费不卡| 凹凸精品一区二区三区| 日韩精品视频在线免费观看| 日本三级在线观看网站| 91精品综合视频| 91一区二区| 九色porny自拍| 国产三级三级三级精品8ⅰ区| 日韩少妇高潮抽搐| 精品99一区二区三区| 欧美性受ⅹ╳╳╳黑人a性爽| 国产日韩视频在线观看| 欧美系列电影免费观看| 精品免费国产一区二区| 久久这里只有精品首页| 在线一区二区三区| 国产老妇伦国产熟女老妇视频| 亚洲欧美在线看| 菠萝蜜视频在线观看www入口| 亚洲在线第一页| 精品国产伦一区二区三| 日韩精品视频免费| 2021天堂中文幕一二区在线观| 91亚洲精品视频| 你懂的网址国产 欧美| 91亚洲一区二区| 亚洲三级在线免费观看| 99久久久久久久| 久久av红桃一区二区小说| 精品视频成人| 乱熟女高潮一区二区在线| 国产精品亚洲综合一区在线观看| 国产成人综合在线视频| 日韩三级视频在线看| 韩国成人免费视频| 精品国产_亚洲人成在线| 一本久道综合久久精品| 美女又爽又黄视频毛茸茸| 色综合一个色综合亚洲| 国产精品二线| 成人黄色免费网站在线观看| 欧美成熟视频| 黄色在线免费播放| 欧美日韩亚洲成人| 久久精品a一级国产免视看成人 | 精品极品在线| 欧美激情视频一区二区三区| 奇米色777欧美一区二区| 最新日韩免费视频| 欧美一区二区国产| a'aaa级片在线观看| 欧美日韩电影一区二区| 美国毛片一区二区三区| 可以直接看的黄色网址| 精品999久久久| japanese23hdxxxx日韩 | 国产精品分类| 成人网站免费观看| 欧美精品在线观看播放| 国产网红在线观看| 欧美日韩高清免费| 韩国三级电影一区二区| 成人在线视频观看| 色狠狠久久av五月综合| 喷水一区二区三区| 91视频青青草| 精品国精品国产| 欧美粗大gay| 99久久久无码国产精品性色戒| 国产不卡视频在线播放| av大片在线免费观看| 日韩在线观看网站| 狼人精品一区二区三区在线 | 欧美丰满艳妇bbwbbw| 日韩精品在线免费| 成人97精品毛片免费看| 日本欧美黄色片| 中文字幕一区二区三区四区不卡| 五月婷婷在线播放| 国产日韩精品在线播放| 国产婷婷精品|