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

討論一下LRU緩存的實現算法

開發 開發工具 算法
本文將討論一下LRU緩存的實現算法,LRU是Least Recently Used最近最久未使用算法。Oracle系統使用的一種算法,對于在內存中但最近又不用的數據塊(內存塊)叫做LRU。

業務模型

讀、寫、刪的比例大致是7:3:1,至少要支持500w條緩存,平均每條緩存6k,要求設計一套性能比較好的緩存算法。

算法分析

不考慮MemCached,Velocity等現成的key-value緩存方案,也不考慮脫離.NET gc自己管理內存,不考慮隨機讀取數據及順序讀取數據的場景,目前想到的有如下幾種LRU緩存方案

算法

分析

SortedDictionary

.NET自帶的,內部用二叉搜索樹(應該不是普通樹,至少是做過優化的樹)實現的,檢索為O(log n),比普通的Dictionay(O(1))慢一點。
插入和刪除都是O(log n),而且插入和刪除,會實時排序。
但是.NET 2.0的這個類沒有First屬性

Dictionary + PriorityQueue

Dictionay可以保證檢索是O(1);
優先隊列可以保證插入和刪除都為O(log n);
但是優先隊列刪除指定的項不支持(至少我找到的優先隊列不支持),所以在刪除緩存的時候不知道咋實現

Dictionay + Binary heap

二叉堆也是優先隊列,分析應該同上,我沒有詳細評估。

b樹

查找,刪除,插入效率都很好,數據庫都用它,但實現復雜,寫一個沒有BUG的B樹幾乎不可能。有人提到stl:map是自頂向下的紅黑樹,查找,刪除,插入都是O(log n),但咱不懂c++,沒做詳細測試。

Dictionay + List

Dict用來檢索;
List用來排序;
檢索、添加、刪除都沒問題,只有在清空的時候需要執行List的排序方法,這時候緩存條目比較多的話,可能比較慢。

Dictionay + LinkedList

Dict用來檢索;
LinkedList的添加和刪除都是O(1),添加緩存時在鏈表頭加節點,獲取緩存時把特定節點移動(先刪除特定節點(O(n)),再到頭部添加節點(O(1)))到頭,緩存滿地時候截斷掉尾部的一些節點。

目前幾種方案在多線程下應該都需要加鎖,不太好設計無鎖的方案,下面這個鏈接是一個支持多線程的方案,但原理至今沒搞特明白

A High Performance Multi-Threaded LRU Cache
http://www.codeproject.com/KB/recipes/LRUCache.aspx

用普通鏈表簡單實現LRU緩存

以下是最后一種方案的簡單實現,大家討論下這個方案值不值得優化,或者其它的哪個方案比較合適 

  1. public class LRUCacheHelper {  
  2.     readonly Dictionary _dict;  
  3.     readonly LinkedList _queue = new LinkedList();  
  4.     readonly object _syncRoot = new object();  
  5.     private readonly int _max;  
  6.     public LRUCacheHelper(int capacity, int max) {  
  7.         _dict = new Dictionary(capacity);  
  8.         _max = max;  
  9.     }  
  10.    
  11.     public void Add(K key, V value) {  
  12.         lock (_syncRoot) {  
  13.             checkAndTruncate();  
  14.             _queue.AddFirst(key);   //O(1)  
  15.             _dict[key] = value;     //O(1)  
  16.         }  
  17.     }  
  18.    
  19.     private void checkAndTruncate() {  
  20.         lock (_syncRoot) {  
  21.             int count = _dict.Count;                        //O(1)  
  22.             if (count >= _max) {  
  23.                 int needRemoveCount = count / 10;  
  24.                 for (int i = 0; i < needRemoveCount; i++) {  
  25.                     _dict.Remove(_queue.Last.Value);        //O(1)  
  26.                     _queue.RemoveLast();                    //O(1)  
  27.                 }  
  28.             }  
  29.         }  
  30.     }  
  31.    
  32.     public void Delete(K key) {  
  33.         lock (_syncRoot) {  
  34.             _dict.Remove(key); //(1)  
  35.             _queue.Remove(key); // O(n)  
  36.         }  
  37.     }  
  38.     public V Get(K key) {  
  39.         lock (_syncRoot) {  
  40.             V ret;  
  41.             _dict.TryGetValue(key, out ret);    //O(1)  
  42.             _queue.Remove(key);                 //O(n)  
  43.             _queue.AddFirst(key);               //(1)  
  44.             return ret;  
  45.         }  
  46.     }  
  47. }  
用雙頭鏈表代替普通鏈表
 
突然想起來了,可以把鏈表換成雙頭鏈表,然后在字典里保存鏈表節點,在Get方法的時候直接從字典里獲取到要移動的節點,然后把這個節點的上一個節點的Next指針指向給下一個節點,下一個節點的Previous指針指向上一個節點,這樣就把移動節點的操作簡化成O(1)了,提高了緩存讀取的效率。

_dict.TryGetValue(key, out ret);    //O(1)
ret.Next.Previous = ret.Previous     //O(1)
ret. Previous.Next. = ret.Next         //O(1)
  _queue.AddFirst(key);                      //O(1)

我改進后的鏈表就差不多滿足需求了,

操作

基本操作

復雜度

讀取

Dict.Get

Queue.Move

O 1

O 1

刪除

Dict.Remove

Queue.Remove

O 1

O 1

增加

Dict.Add

Queue.AddFirst

O 1

O 1

截斷

Dict.Remove

Queue.RemoveLast

O k

O k

K表示截斷緩存元素的個數

其中截斷的時候可以指定當緩存滿的時候截斷百分之多少的最少使用的緩存項。

其它的就是多線程的時候鎖再看看怎么優化,字典有線程安全的版本,就把.NET 3.0的讀寫鎖扣出來再把普通的泛型字典保證成ThreadSafelyDictionay就行了,性能應該挺好的。

鏈表的話不太好用讀寫鎖來做線程同步,大不了用互斥鎖,但得考慮下鎖的粒度,Move,AddFirst,RemoveLast的時候只操作一兩個節點,是不是想辦法只lock這幾個節點就行了,Truncate的時候因為要批量操作很多節點,所以要上個大多鏈表鎖,但這時候怎么讓其它操作停止得考慮考慮,類似數據庫的表鎖和行鎖。

LRU緩存實現代碼

  1. public class DoubleLinkedListNode {  
  2.     public T Value { get; set; }  
  3.    
  4.     public DoubleLinkedListNode Next { get; set; }  
  5.    
  6.     public DoubleLinkedListNode Prior { get; set; }  
  7.    
  8.     public DoubleLinkedListNode(T t) { Value = t; }  
  9.    
  10.     public DoubleLinkedListNode() { }  
  11.    
  12.     public void RemoveSelf() {  
  13.         Prior.Next = Next;  
  14.         Next.Prior = Prior;  
  15.     }  
  16.    
  17. }  
  18. public class DoubleLinkedList {  
  19.     protected DoubleLinkedListNode m_Head;  
  20.     private DoubleLinkedListNode m_Tail;  
  21.    
  22.     public DoubleLinkedList() {  
  23.         m_Head = new DoubleLinkedListNode();  
  24.         m_Tail = m_Head;  
  25.     }  
  26.    
  27.     public DoubleLinkedList(T t)  
  28.         : this() {  
  29.         m_Head.Next = new DoubleLinkedListNode(t);  
  30.         m_Tail = m_Head.Next;  
  31.         m_Tail.Prior = m_Head;  
  32.     }  
  33.    
  34.     public DoubleLinkedListNode Tail {  
  35.         get { return m_Tail; }  
  36.     }  
  37.    
  38.     public DoubleLinkedListNode AddHead(T t) {  
  39.         DoubleLinkedListNode insertNode = new DoubleLinkedListNode(t);  
  40.         DoubleLinkedListNode currentNode = m_Head;  
  41.         insertNode.Prior = null;  
  42.         insertNode.Next = currentNode;  
  43.         currentNode.Prior = insertNode;  
  44.         m_Head = insertNode;  
  45.         return insertNode;  
  46.     }  
  47.     public void RemoveTail() {  
  48.         m_Tail = m_Tail.Prior;  
  49.         m_Tail.Next = null;  
  50.         return;  
  51.     }  
  52. }  
  53. public class LRUCacheHelper {  
  54.     class DictItem {  
  55.         public DoubleLinkedListNode Node { get; set; }  
  56.         public V Value { get; set; }  
  57.     }  
  58.     readonly Dictionary _dict;  
  59.     readonly DoubleLinkedList _queue = new DoubleLinkedList();  
  60.     readonly object _syncRoot = new object();  
  61.     private readonly int _max;  
  62.     public LRUCacheHelper(int capacity, int max) {  
  63.         _dict = new Dictionary(capacity);  
  64.         _max = max;  
  65.     }  
  66.    
  67.     public void Add(K key, V value) {  
  68.         lock (this)  
  69.         {  
  70.    
  71.             checkAndTruncate();  
  72.             DoubleLinkedListNode v = _queue.AddHead(key);   //O(1)  
  73.             _dict[key] = new DictItem() { Node = v, Value = value }; //O(1)  
  74.         }  
  75.     }  
  76.    
  77.     private void checkAndTruncate() {  
  78.         int count = _dict.Count;                        //O(1)  
  79.         if (count >= _max) {  
  80.             int needRemoveCount = count / 10;  
  81.             for (int i = 0; i < needRemoveCount; i++) {  
  82.                 _dict.Remove(_queue.Tail.Value);        //O(1)  
  83.                 _queue.RemoveTail();                    //O(1)  
  84.             }  
  85.         }  
  86.     }  
  87.    
  88.     public void Delete(K key) {  
  89.         lock (this) {  
  90.             _dict[key].Node.RemoveSelf();  
  91.             _dict.Remove(key); //(1)   
  92.         }  
  93.     }  
  94.     public V Get(K key) {  
  95.         lock (this) {  
  96.             DictItem ret;  
  97.             if (_dict.TryGetValue(key, out ret)) {  
  98.                 ret.Node.RemoveSelf();  
  99.                 _queue.AddHead(key);  
  100.                 return ret.Value;  
  101.             }  
  102.             return default(V);   
  103.         }  
  104.     }  
 
LRU緩存性能測試

用雙頭鏈表測試了一下,感覺性能還可以接受,每秒鐘讀取可達80w,每秒鐘寫操作越20w。

程序初始化200w條緩存,然后不斷的加,每加到500w,截斷掉10分之一,然后繼續加。

測試模型中每秒鐘的讀和寫的比例是7:3,以下是依次在3個時間點截取的性能計數器圖。
圖1

性能計數器圖1

圖2

性能計數器圖2


圖3

性能計數器圖3


內存最高會達到1g,cpu也平均百分之90以上,但測試到后期會發現每隔一段時間,就會有一兩秒,吞吐量為0,如最后一張截圖,后來觀察發現,停頓的那一兩秒是二代內存在回收,等不停頓的時候# gen 2 collections就會加1,這個原因應該是鏈表引起的,對鏈表中節點的添加和刪除是很耗費GC的,因為會頻繁的創建和銷毀對象。 

LRU緩存后續改進

1、 用游標鏈表來代替普通的雙頭鏈表,程序起來就收工分配固定大小的數組,然后用數組的索引來做鏈表,省得每次添加和刪除節點都要GC的參與,這相當于手工管理內存了,但目前我還沒找到c#合適的實現。

 

2、 有人說鏈表不適合用在多線程環境中,因為對鏈表的每個操作都要加互斥鎖,連讀寫鎖都用不上,我目前的實現是直接用互斥鎖做的線程同步,每秒的吞吐量七八十萬,感覺lock也不是瓶頸,如果要改進的話可以把Dictionary用ThreadSafelyDictionary來代替,然后鏈表還用互斥鎖(剛開始設想的鏈表操作只鎖要操作的幾個節點以降低并發沖突的想法應該不可取,不嚴謹)。

3、 還有一個地方就是把鎖細分以下,鏈表還用鏈表,但每個鏈表的節點是個HashSet,對HashSet的操作如果只有讀,寫,刪,沒有遍歷的話應該不需要做線程同步(我感覺不用,因為Set就是一個集合,一個線程往里插入,一個線程往里刪除,一個線程讀取應該沒問題,頂多讀進來的數據可能馬上就刪除了,而整個Set的結構不會破壞)。然后新增數據的時候往鏈表頭頂Set里插入,讀取某個數據的時候把它所在的節點的Set里刪除該數據,然后再鏈表頭的Set里插入一個數據,這樣反復操作后,鏈表的最后一個節點的Set里的數據都是舊數據了,可以安全的刪除了,當然這個刪除的時候應該是要鎖整個鏈表的。每個Set應該有個大小上限,比如20w,但set不能安全的遍歷,就不能得到當前大小,所以添加、刪除Set的數據的時候應該用Interlocked.Decrement()和 Interlocked.Increment()維護一個Count,一遍一個Set滿的時候,再到鏈表的頭新增一個Set節點。

LRU緩存性能測試腳本

  1. class Program {  
  2.     private static PerformanceCounter _addCounter;  
  3.     private static PerformanceCounter _getCounter;  
  4.    
  5.     static void Main(string[] args) {  
  6.         SetupCategory();  
  7.         _addCounter = new PerformanceCounter("wawasoft.lrucache""add/sec"false);  
  8.         _getCounter = new PerformanceCounter("wawasoft.lrucache""get/sec"false);  
  9.         _addCounter.RawValue = 0;  
  10.         _getCounter.RawValue = 0;  
  11.    
  12.         Random rnd = new Random();  
  13.         const int max = 500 * 10000;  
  14.    
  15.    
  16.         LRUCacheHelper<intint> cache = new LRUCacheHelper<intint>(200 * 10000, max);  
  17.    
  18.         for (int i = 10000*100000 - 1; i >= 0; i--)  
  19.         {  
  20.             if(i % 10 > 7)  
  21.             {  
  22.                 ThreadPool.QueueUserWorkItem(  
  23.                     delegate  
  24.                         {  
  25.                             cache.Add(rnd.Next(010000), 0);  
  26.                             _addCounter.Increment();   
  27.                         });  
  28.             }  
  29.             else 
  30.             {  
  31.                 ThreadPool.QueueUserWorkItem(  
  32.                    delegate  
  33.                    {  
  34.                        int pop = cache.Get(i);  
  35.                        _getCounter.Increment();  
  36.                    });  
  37.             }  
  38.         }  
  39.         Console.ReadKey();  
  40.     }  
  41.    
  42.     private static void SetupCategory() {  
  43.         if (!PerformanceCounterCategory.Exists("wawasoft.lrucache")) {  
  44.    
  45.             CounterCreationDataCollection CCDC = new CounterCreationDataCollection();  
  46.    
  47.             CounterCreationData addcounter = new CounterCreationData();  
  48.             addcounter.CounterType = PerformanceCounterType.RateOfCountsPerSecond32;  
  49.             addcounter.CounterName = "add/sec";  
  50.             CCDC.Add(addcounter);  
  51.    
  52.    
  53.             CounterCreationData getcounter = new CounterCreationData();  
  54.             getcounter.CounterType = PerformanceCounterType.RateOfCountsPerSecond32;  
  55.             getcounter.CounterName = "get/sec";  
  56.             CCDC.Add(getcounter);  
  57.    
  58.             PerformanceCounterCategory.Create("wawasoft.lrucache","lrucache",CCDC);  
  59.    
  60.         }  
  61.     }  
  62.    

【編輯推薦】

  1. .net緩存應用與分析
  2. Hibernate緩存機制探討
  3. 充分利用ASP.NET的三種緩存提高站點性能
  4. ASP.NET緩存使用中的幾點建議
  5. 緩存設計詳解:低成本的高性能Web應用解決方案
責任編輯:彭凡 來源: cnblogs
相關推薦

2009-07-06 13:23:12

C#面向集合

2020-07-29 10:20:28

Redis數據庫字符串

2022-06-17 07:49:14

緩存LRU

2022-03-08 08:02:44

Java系統錯誤碼

2020-10-30 11:30:15

Least Recen

2020-02-19 19:18:02

緩存查詢速度淘汰算法

2015-07-29 10:31:16

Java緩存算法

2023-04-14 07:34:19

2022-03-31 09:13:49

Cache緩存高并發

2021-05-18 08:31:46

緩存HTTP服務器

2021-07-26 21:15:10

LRU緩存MongoDB

2023-09-12 14:56:13

MyBatis緩存機制

2023-07-06 12:39:14

RedisLRULFU

2025-03-10 07:05:07

2024-09-19 09:30:39

緩存框架抽象

2020-09-18 10:31:47

LRU算法數組

2015-07-15 10:19:16

Java代碼使用緩存

2023-09-06 07:58:45

數據緩存Redis

2020-07-30 07:58:36

加密算法

2024-03-15 07:17:51

MySQLLRU算法緩存池
點贊
收藏

51CTO技術棧公眾號

亚洲成人福利在线| 亚洲一区二区三区久久| 人人妻人人藻人人爽欧美一区| 忘忧草在线日韩www影院| 久久久国产一区二区三区四区小说| 日本一区二区在线免费播放| 国精产品一区一区| 欧美经典影片视频网站| 无吗不卡中文字幕| 亚洲图片都市激情| 成人免费观看在线视频| 爽爽淫人综合网网站| 久久精品电影网| 亚洲天堂美女视频| 另类一区二区| 欧美日韩在线视频一区| 中文字幕一区二区三区四区五区六区| 国产91免费看| 久久草av在线| 日本国产高清不卡| 麻豆精品一区二区三区视频| 久久黄色影视| 欧美一区二区三区在| 97av视频在线观看| 亚洲丝袜精品| 国产精品久久影院| 久久久一本精品99久久精品| 国产精品无码AV| 日日噜噜夜夜狠狠视频欧美人| 精品中文字幕视频| 精品一区二区三孕妇视频| 国产精品丝袜在线播放| 51精品久久久久久久蜜臀| 国产精品亚洲二区在线观看 | 久久品道一品道久久精品| 91久久综合亚洲鲁鲁五月天| 中文字幕69页| 日韩一级精品| 久久免费视频网站| 亚洲最大的黄色网址| 成人黄色av| 亚洲人成在线观看| 亚洲熟妇一区二区三区| 久久av国产紧身裤| 亚洲国产天堂久久国产91| 国产又黄又嫩又滑又白| 伊人久久综合网另类网站| 91高清在线观看| 成人羞羞国产免费网站| 在线能看的av网址| 欧美日韩国产专区| 青娱乐自拍偷拍| 国产高清中文字幕在线| 亚洲国产日韩综合久久精品| 中文精品无码中文字幕无码专区| 国产欧美久久久久久久久| 国产精品女同互慰在线看| 日本一区视频在线播放| 国产二区视频在线观看| 久久精品一级爱片| 日韩国产欧美一区| h视频网站在线观看| 中文成人综合网| 亚洲自拍三区| a视频在线观看| 一区二区日韩av| 欧美久久在线观看| 精精国产xxx在线视频app| 疯狂做受xxxx欧美肥白少妇 | 糖心vlog免费在线观看| 91精品推荐| 欧美日韩国产二区| 久草精品视频在线观看| 国产手机视频一区二区| 国产91亚洲精品| 做爰无遮挡三级| 国产曰批免费观看久久久| 亚洲xxxx在线| 亚洲日本香蕉视频| 欧美韩国日本综合| 国产日本欧美在线| 国产精品186在线观看在线播放| 亚洲风情在线资源站| 日本三级免费网站| 成人国产精品| 欧美大胆人体bbbb| 熟女人妻在线视频| 日韩电影二区| 欧美高清一级大片| 国产中文字幕视频| 精品亚洲成a人在线观看| 成人自拍爱视频| 国产综合在线观看| 亚洲精品视频一区二区| 日本国产在线播放| 成人全视频免费观看在线看| 日韩欧美黄色影院| 久久精品国产亚洲av久| 亚洲综合色网| 清纯唯美日韩制服另类| 国产99对白在线播放| 91在线视频18| 91香蕉视频网址| 成人ssswww在线播放| 欧美色图在线观看| 影音先锋资源av| 青青草成人影院| 久久久久久久久久久免费| 亚洲大尺度在线观看| 国产成人综合在线播放| 日本一区免费看| 美女尤物在线视频| 欧美日韩一二三| 一本加勒比波多野结衣| 亚洲精品一区二区妖精| 热草久综合在线| 亚洲av无码乱码国产麻豆| 国产三级精品在线| 国产美女网站在线观看| 亚洲成a人片777777久久| 日韩精品福利在线| 久草免费新视频| 久88久久88久久久| 日本亚洲导航| 午夜伦理福利在线| 日韩精品一区国产麻豆| 久久久久麻豆v国产| 久久精品一区二区三区中文字幕| 91九色偷拍| 欧美jizzhd69巨大| 在线观看日韩高清av| 欧美无人区码suv| 欧美精品色网| 91嫩草在线视频| 欧美日韩在线资源| 在线观看不卡一区| 性欧美精品中出| 国产精品普通话对白| 国产精品一区视频| 免费污视频在线| 91精品蜜臀在线一区尤物| 亚洲色图日韩精品| 日本成人超碰在线观看| 欧美一区二区高清在线观看| 老色鬼在线视频| 欧美精品一区二区三区一线天视频 | 久久久一区二区| 浮妇高潮喷白浆视频| 9l亚洲国产成人精品一区二三 | 希岛爱理中文字幕| 久久精品国产一区二区三| 日本一区不卡| 91欧美精品| 最近2019中文字幕大全第二页| 日韩中文字幕高清| 国产无人区一区二区三区| 三级4级全黄60分钟| 在线观看欧美理论a影院| 日本三级韩国三级久久| 你懂的视频在线| 在线精品亚洲一区二区不卡| 亚洲色成人网站www永久四虎 | 中文字幕一二三区| 欧美午夜视频| 精品一区二区不卡| sis001欧美| 中文字幕欧美日韩精品| 一区二区三区免费在线| 亚洲久草在线视频| 逼特逼视频在线观看| 国产一区二区三区的电影| 免费在线成人av| 国产91亚洲精品久久久| 不用播放器成人网| 高清国产mv在线观看| 欧美日韩在线免费观看| av免费播放网站| 国产一区二区三区不卡在线观看| 黑人巨茎大战欧美白妇| 女仆av观看一区| 国产精品久久电影观看| 好操啊在线观看免费视频| 欧美成人免费网站| 精品国产xxx| 国产精品国产三级国产普通话三级| 久久久精品视频国产| 在线精品在线| 天天综合狠狠精品| 日韩08精品| 欧美中文在线观看国产| 午夜视频在线观看免费视频| 日韩欧美国产一二三区| 久久久久久少妇| 亚洲欧美在线另类| 污污内射在线观看一区二区少妇| 日韩精品一级中文字幕精品视频免费观看| 一区二区成人国产精品| 9999久久久久| 欧美一级免费视频| av在线播放观看| 亚洲图片欧美午夜| 国产黄色免费大片| 日韩欧美在线免费观看| 五月天婷婷色综合| 久久久久久久久久电影| 亚洲国产欧美日韩在线| 久久久久久网| 日本阿v视频在线观看| 成人羞羞视频播放网站| 国产精品一级久久久| 欧美天堂一区二区| 91精品国产沙发| 成人a在线视频免费观看| 亚洲欧美日韩国产中文专区| 亚洲黄色小说网址| 欧美少妇一区二区| 国产精品男女视频| 一区二区久久久久久| 亚洲欧美日韩第一页| 91在线观看免费视频| 佐山爱在线视频| 麻豆一区二区99久久久久| 精品这里只有精品| 综合日韩在线| 一级日韩一区在线观看| 国产精品亚洲二区| 快播日韩欧美| 久久午夜影院| 国产日韩一区二区| 香港久久久电影| 91久久久久久久久久| 69堂精品视频在线播放| 国产91色在线播放| 日韩精品一区二区三区| 人人澡人人澡人人看欧美| 7777kkk亚洲综合欧美网站| 欧美成人免费一级人片100| 麻豆传媒在线观看| 日韩中文字幕在线观看| 97视频在线观看网站| 国产一区二区三区在线观看视频 | 国产精品大尺度| 国产探花视频在线播放| 欧美高清在线精品一区| 国产一级久久久久毛片精品| 久久久久久一二三区| 久久久精品人妻无码专区| 91麻豆福利精品推荐| 国产精品探花一区二区在线观看| av在线不卡观看免费观看| 国产二级一片内射视频播放| 成人精品免费视频| 国产又粗又长又爽| 久久青草欧美一区二区三区| 国产精品天天干| 欧美国产欧美综合| 永久免费观看片现看| 亚洲欧洲精品一区二区三区 | 偷偷色噜狠狠狠狠的777米奇| 成人中文字幕合集| 最近中文字幕无免费| 99亚偷拍自图区亚洲| 中文字幕乱码在线| 99久久精品国产导航| 亚洲精品成人无码熟妇在线| 91丨porny丨最新| 成人午夜剧场视频网站| 中文乱码免费一区二区| 日本伦理一区二区三区| 成人欧美一区二区三区小说| 九九九在线视频| 亚洲综合在线第一页| 久久精品亚洲无码| 欧美性猛交xxxxx免费看| 伊人中文字幕在线观看 | 亚洲裸体xxxx| 天堂网在线播放| 国产亚洲a∨片在线观看| 福利片在线观看| 精品久久久91| hd国产人妖ts另类视频| 欧美最顶级丰满的aⅴ艳星| 黄色软件视频在线观看| 国产精品狠色婷| 日韩国产大片| 国产综合在线观看视频| 成人激情自拍| 欧美 日韩 国产在线| 精品久久久久久久| 免费日韩在线观看| 亚洲大胆在线| 欧美亚洲国产成人| 韩国av一区二区三区四区| 性xxxxxxxxx| 国产欧美日韩亚州综合| 男女性高潮免费网站| 亚洲一级二级在线| 国产乡下妇女三片| 日韩一区二区影院| 日本国产在线| 久久久久999| 久草免费在线视频| 国产精品亚洲аv天堂网| 黄色美女久久久| 亚洲三区在线| 夜夜嗨一区二区| 999热精品视频| 久久久久久久久一| 国产一区二区视频在线观看免费| 日韩欧美在线免费| 精品人妻一区二区三区浪潮在线| 精品国产百合女同互慰| 婷婷免费在线视频| 国内精品久久久久| 在线观看欧美| 久久综合九色99| 亚洲最新av| 手机版av在线| jizz一区二区| 永久免费看mv网站入口| 在线观看免费成人| 天天干,夜夜操| 夜夜躁日日躁狠狠久久88av| 波多野结衣视频一区二区| 91精品久久久久| 青青草国产成人a∨下载安卓| 人妻夜夜添夜夜无码av| 久久精品国产在热久久| 欧美a在线播放| 精品日本美女福利在线观看| 国产日韩在线观看一区| 日韩在线观看精品| 美女福利一区二区三区| 久久精品人人做人人爽电影| 欧美成人69| 午夜精品中文字幕| 国产精品欧美久久久久无广告| 成人午夜视频精品一区| 在线观看三级视频欧美| 国产九色在线| 欧美在线视频一二三| 亚洲日本三级| 成人午夜免费在线| 国产成人精品免费| 国产一级视频在线播放| 欧美一区二区久久久| youjizz在线播放| 国产精品久久色| 国产麻豆精品久久| 韩国日本美国免费毛片| 久久综合狠狠综合久久激情| 色播视频在线播放| 日韩av网站导航| 24小时免费看片在线观看| 成人久久久久爱| 日本不卡高清| 小泽玛利亚视频在线观看| 国产精品日产欧美久久久久| 波多野结衣人妻| 国产亚洲精品激情久久| 99久久精品一区二区成人| 日韩精品无码一区二区三区| 裸体在线国模精品偷拍| 五月婷婷欧美激情| 欧美在线观看视频一区二区 | 国产精品久久久久久久久久久久午夜片 | 日本新janpanese乱熟| 久久日一线二线三线suv| 国产美女激情视频| 欧美成人精品1314www| 国产福利片在线观看| 蜜桃91精品入口| 蜜臂av日日欢夜夜爽一区| 亚洲欧美另类日本| 欧美午夜视频网站| 性欧美videos高清hd4k| 国产精品日韩一区二区免费视频 | 久久久久久高潮国产精品视| 亚洲一区二区三区四区电影| 丰满的少妇愉情hd高清果冻传媒| 99精品视频在线观看免费| 国产超碰人人爽人人做人人爱| 亚洲精品98久久久久久中文字幕| 欧美日韩视频免费观看| 亚洲第一在线综合在线| 高清不卡在线观看av| 日韩免费一级片| 亚洲国产精品成人av| 国产成人精品一区二区三区在线| 在线免费观看成人网| 成人v精品蜜桃久久一区| 日本高清不卡码| 亚洲三级av在线| 一区二区三区在线免费看| 欧美网站免费观看| 亚洲日本青草视频在线怡红院| 丰满人妻一区二区三区四区53| 国产成人av网址| 亚洲精品国产首次亮相| 漂亮人妻被黑人久久精品|