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

C# .NET 中的緩存實現

開發 后端
緩存非常適用于不經常更改的數據。或者甚至更好,永遠不會改變。不斷變化的數據,比如當前機器的時間不應該被緩存,否則你會得到錯誤的結果。

[[423388]]

軟件開發中最常用的模式之一是緩存。這是一個簡單但非常有效的概念,這個想法的核心是記錄過程數據,重用操作結果。當執行繁重的操作時,我們會將結果保存在我們的緩存容器中。下次我們需要該結果時,我們將從緩存容器中拉出它,而不是再次執行繁重的操作。

例如,要獲取一個人的頭像,您可能需要訪問數據庫。我們不會每次都執行那次旅行,而是將 Avatar 保存在緩存中,每次需要時從內存中提取它。

緩存非常適用于不經常更改的數據。或者甚至更好,永遠不會改變。不斷變化的數據,比如當前機器的時間不應該被緩存,否則你會得到錯誤的結果。

進程內緩存、持久性進程內緩存和分布式緩存

有 3 種類型的緩存:

  • In-Memory Cache用于在單個進程中實現緩存。當進程終止時,緩存也隨之終止。如果您在多臺服務器上運行相同的進程,您將為每臺服務器提供一個單獨的緩存。
  • 持久性進程內緩存是指在進程內存之外備份緩存。它可能在文件中,也可能在數據庫中。這比較困難,但如果您的進程重新啟動,緩存不會丟失。最適合在獲取緩存項的情況下使用范圍廣泛,并且您的進程往往會重新啟動很多。
  • 分布式緩存是指您希望為多臺機器共享緩存。通常,它將是多個服務器。使用分布式緩存,它存儲在外部服務中。這意味著如果一臺服務器保存了一個緩存項,其他服務器也可以使用它。像Redis[1]這樣的服務非常適合這一點。

我們將只討論進程內緩存。

早期做法

讓我們用 C# 創建一個非常簡單的緩存實現:

  1. public class NaiveCache<TItem> 
  2.     Dictionary<object, TItem> _cache = new Dictionary<object, TItem>(); 
  3.  
  4.     public TItem GetOrCreate(object key, Func<TItem> createItem) 
  5.     { 
  6.         if (!_cache.ContainsKey(key)) 
  7.         { 
  8.             _cache[key] = createItem(); 
  9.         } 
  10.         return _cache[key]; 
  11.     } 

用法:

  1. var _avatarCache = new NaiveCache<byte[]>(); 
  2. // ... 
  3. var myAvatar = _avatarCache.GetOrCreate(userId, () => _database.GetAvatar(userId)); 

這個簡單的代碼解決了一個關鍵問題。要獲取用戶的頭像,只有第一個請求才會真正執行到數據庫的訪問。然后將頭像數據 ( byte[]) 保存在進程內存中。對頭像的所有后續請求都將從內存中提取,從而節省時間和資源。

但是,正如編程中的大多數事情一樣,沒有什么是那么簡單的。由于多種原因,上述解決方案并不好。一方面,這個實現不是線程安全的。從多個線程使用時可能會發生異常。除此之外,緩存的項目將永遠留在內存中,這實際上非常糟糕。

這就是我們應該從緩存中刪除項目的原因:

1.緩存會占用大量內存,最終導致內存不足異常和崩潰。

2.高內存消耗會導致GC 壓力(又名內存壓力)。在這種狀態下,垃圾收集器的工作量超出其應有的水平,從而損害了性能。

3.如果數據發生變化,可能需要刷新緩存。我們的緩存基礎設施應該支持這種能力。

為了處理這些問題,緩存框架具有驅逐策略(又名移除策略)。這些是根據某些邏輯從緩存中刪除項目的規則。常見的驅逐政策有:

  • 無論如何,絕對過期策略將在固定時間后從緩存中刪除項目。
  • 如果在固定的時間段內未訪問某個項目,則滑動過期策略將從緩存中刪除該項目。因此,如果我將過期時間設置為 1 分鐘,只要我每 30 秒使用一次,該項目就會一直保留在緩存中。一旦我超過一分鐘不使用它,該物品就會被驅逐。
  • 大小限制策略將限制緩存內存大小。

現在我們知道我們需要什么,讓我們繼續尋找更好的解決方案。

更好的解決方案

作為一名博主,令我非常沮喪的是,微軟已經創建了一個很棒的緩存實現。這剝奪了我自己創建類似實現的樂趣,但至少我寫這篇博文的工作量減少了。

我將向您展示微軟的解決方案,如何有效地使用它,然后在某些場景中如何改進它。

System.Runtime.Caching/MemoryCache 與 Microsoft.Extensions.Caching.Memory

Microsoft 有 2 個解決方案 2 個不同的 NuGet 包用于緩存。兩者都很棒。根據 Microsoft 的建議[2],更喜歡使用,Microsoft.Extensions.Caching.Memory因為它與 Asp.NET Core 集成得更好。它可以很容易地注入[3]到 Asp .NET Core 的依賴注入機制中。

這是一個基本示例Microsoft.Extensions.Caching.Memory:

  1. public class SimpleMemoryCache<TItem> 
  2.     private MemoryCache _cache = new MemoryCache(new MemoryCacheOptions()); 
  3.  
  4.     public TItem GetOrCreate(object key, Func<TItem> createItem) 
  5.     { 
  6.         TItem cacheEntry; 
  7.         if (!_cache.TryGetValue(keyout cacheEntry))// Look for cache key
  8.         { 
  9.             // Key not in cache, so get data. 
  10.             cacheEntry = createItem(); 
  11.  
  12.             // Save data in cache. 
  13.             _cache.Set(key, cacheEntry); 
  14.         } 
  15.         return cacheEntry; 
  16.     } 

用法:

  1. var _avatarCache = new SimpleMemoryCache<byte[]>(); 
  2. // ... 
  3. var myAvatar = _avatarCache.GetOrCreate(userId, () => _database.GetAvatar(userId)); 

這和我自己的非常相似NaiveCache,所以有什么改變?嗯,一方面,這是一個線程安全的實現。您可以一次從多個線程安全地調用它。

第二件事是MemoryCache允許我們之前談到的所有驅逐政策。下面是一個例子:

具有驅逐策略的 IMemoryCache:

  1. public class MemoryCacheWithPolicy<TItem> 
  2.     private MemoryCache _cache = new MemoryCache(new MemoryCacheOptions() 
  3.     { 
  4.         SizeLimit = 1024 
  5.     }); 
  6.  
  7.     public TItem GetOrCreate(object key, Func<TItem> createItem) 
  8.     { 
  9.         TItem cacheEntry; 
  10.         if (!_cache.TryGetValue(keyout cacheEntry))// Look for cache key
  11.         { 
  12.             // Key not in cache, so get data. 
  13.             cacheEntry = createItem(); 
  14.  
  15.             var cacheEntryOptions = new MemoryCacheEntryOptions() 
  16.              .SetSize(1)//Size amount 
  17.              //Priority on removing when reaching size limit (memory pressure) 
  18.                 .SetPriority(CacheItemPriority.High) 
  19.                 // Keep in cache for this time, reset time if accessed. 
  20.                 .SetSlidingExpiration(TimeSpan.FromSeconds(2)) 
  21.                 // Remove from cache after this time, regardless of sliding expiration 
  22.                 .SetAbsoluteExpiration(TimeSpan.FromSeconds(10)); 
  23.  
  24.             // Save data in cache. 
  25.             _cache.Set(key, cacheEntry, cacheEntryOptions); 
  26.         } 
  27.         return cacheEntry; 
  28.     } 

1.SizeLimit被添加到MemoryCacheOptions. 這為我們的緩存容器添加了基于大小的策略。大小沒有單位。相反,我們需要在每個緩存條目上設置大小數量。在這種情況下,我們每次將金額設置為 1 SetSize(1)。這意味著緩存限制為 1024 個項目。

2.當我們達到大小限制時,應該刪除哪個緩存項?您實際上可以使用.SetPriority(CacheItemPriority.High). 級別為Low、Normal、High和NeverRemove。

3.SetSlidingExpiration(TimeSpan.FromSeconds(2))添加了,它將滑動過期時間設置為 2 秒。這意味著如果一個項目在 2 秒內未被訪問,它將被刪除。

4.SetAbsoluteExpiration(TimeSpan.FromSeconds(10))添加了,將絕對過期時間設置為 10 秒。這意味著該項目將在 10 秒內被驅逐,如果它還沒有。

除了示例中的選項之外,您還可以設置一個RegisterPostEvictionCallback委托,該委托將在項目被驅逐時調用。

這是一個非常全面的功能集。它讓你想知道是否還有什么要添加的。實際上有幾件事。

問題和缺失的功能

在這個實現中有幾個重要的缺失部分。

1.雖然您可以設置大小限制,但緩存實際上并不監控 gc 壓力。如果真的監測,壓力大的時候可以收緊政策,壓力小的時候可以放松政策。

2.當多個線程同時請求同一個項目時,請求不會等待第一個完成。該項目將被創建多次。例如,假設我們正在緩存頭像,從數據庫中獲取頭像需要 10 秒。如果我們在第一次請求后 2 秒請求頭像,它將檢查頭像是否已緩存(尚未緩存),并開始另一次訪問數據庫。

關于GC壓力的第一個問題:可以使用多種技術和啟發式方法來監控GC壓力。這篇博文與此無關,但您可以閱讀我的文章在 C# .NET 中查找、修復和避免內存泄漏:8 個最佳實踐[4]以了解一些有用的方法。

第二個問題更容易解決。事實上,這是一個MemoryCache完全解決它的實現:

  1. public class WaitToFinishMemoryCache<TItem> 
  2.     private MemoryCache _cache = new MemoryCache(new MemoryCacheOptions()); 
  3.     private ConcurrentDictionary<object, SemaphoreSlim> _locks = new ConcurrentDictionary<object, SemaphoreSlim>(); 
  4.  
  5.     public async Task<TItem> GetOrCreate(object key, Func<Task<TItem>> createItem) 
  6.     { 
  7.         TItem cacheEntry; 
  8.  
  9.         if (!_cache.TryGetValue(keyout cacheEntry))// Look for cache key
  10.         { 
  11.             SemaphoreSlim mylock = _locks.GetOrAdd(key, k => new SemaphoreSlim(1, 1)); 
  12.  
  13.             await mylock.WaitAsync(); 
  14.             try 
  15.             { 
  16.                 if (!_cache.TryGetValue(keyout cacheEntry)) 
  17.                 { 
  18.                     // Key not in cache, so get data. 
  19.                     cacheEntry = await createItem(); 
  20.                     _cache.Set(key, cacheEntry); 
  21.                 } 
  22.             } 
  23.             finally 
  24.             { 
  25.                 mylock.Release(); 
  26.             } 
  27.         } 
  28.         return cacheEntry; 
  29.     } 

用法:

  1. var _avatarCache = new WaitToFinishMemoryCache<byte[]>(); 
  2. // ... 
  3. var myAvatar =  
  4.  await _avatarCache.GetOrCreate(userId, async () => await _database.GetAvatar(userId)); 

代碼說明

此實現鎖定項目的創建。鎖是特定于鑰匙的。例如,如果我們正在等待獲取 Alex 的 Avatar,我們仍然可以在另一個線程上獲取 John 或 Sarah 的緩存值。

字典_locks存儲了所有的鎖。常規鎖不適用于async/await,因此我們需要使用SemaphoreSlim[5].

如果 (!_cache.TryGetValue(key, out cacheEntry)),有 2 次檢查以查看該值是否已被緩存。鎖內的那個是確保只有一個創建的那個。鎖外面的那個是為了優化。

何時使用 WaitToFinishMemoryCache

這個實現顯然有一些開銷。讓我們考慮什么時候甚至有必要。

在以下情況下使用 WaitToFinishMemoryCache:

  • 當項目的創建時間具有某種成本時,您希望盡可能減少創建。
  • 當一個項目的創建時間很長時。
  • 當必須確保每個鍵都創建一個項目時。

在以下情況下不要使用 WaitToFinishMemoryCache:

  • 沒有多個線程訪問同一個緩存項的危險。

?您不介意多次創建該項目。例如,如果對數據庫的額外訪問不會有太大變化。

概括

緩存是一種非常強大的模式,它也很危險,并且有其自身的復雜性。緩存太多,可能會導致 GC 壓力,緩存太少會導致性能問題。而分布式緩存,這是一個需要探索的全新世界。軟件開發職業就這樣,總是有新的東西要學習。

References

[1] Redis: https://redis.io/

[2] 建議: https://docs.microsoft.com/en-us/aspnet/core/performance/caching/memory?view=aspnetcore-2.2#systemruntimecachingmemorycache

[3] 容易地注入: https://docs.microsoft.com/en-us/aspnet/core/performance/caching/memory?view=aspnetcore-2.2#using-imemorycache

[4] 在 C# .NET 中查找、修復和避免內存泄漏:8 個最佳實踐: https://michaelscodingspot.com/find-fix-and-avoid-memory-leaks-in-c-net-8-best-practices/

 

[5] SemaphoreSlim: https://blog.cdemi.io/async-waiting-inside-c-sharp-locks/

 

責任編輯:武曉燕 來源: DotNET技術圈
相關推薦

2019-07-02 15:21:39

緩存NET單線程

2024-10-16 11:28:42

2011-06-08 13:50:39

C#類型轉換

2009-08-12 14:10:37

asp.net分頁代碼

2014-03-11 11:35:00

.NETC#

2009-09-04 15:45:29

C#緩存流

2015-07-28 10:06:03

C#內部實現剖析

2009-09-01 16:29:03

QuickSort C

2024-06-12 07:48:24

C#WebService.NET

2009-08-26 15:25:06

.NET Framew

2009-08-06 16:36:20

研究C#和.Net

2009-08-26 15:10:34

脫離.net fram

2023-09-08 09:12:57

內存緩存圖像

2014-04-17 10:37:43

C++.NET Native

2009-08-20 10:13:49

ASP.NET和C#的

2024-07-22 14:34:20

簡單工廠模式C#

2024-12-20 09:48:47

C#Python代碼

2009-07-15 18:25:52

ASP.NET控件數組

2009-07-27 14:13:56

調用c#方法Java scriptASP.NET

2009-08-12 17:19:51

ASP.NET圖片加水
點贊
收藏

51CTO技術棧公眾號

国产xxx69麻豆国语对白| 日韩风俗一区 二区| 国产奶头好大揉着好爽视频| 国产毛片久久久久| 亚洲第一在线| 在线观看亚洲视频| 丰满少妇一区二区三区专区 | 哺乳挤奶一区二区三区免费看| 亚洲成人一二三| 视频一区亚洲 | 日韩成人在线观看| 日日躁夜夜躁aaaabbbb| h片在线观看| 国产精品美女久久久久久| 成人欧美一区二区三区视频xxx| 日韩不卡在线播放| 欧美在线不卡| 在线国产精品视频| 五月天激情小说| 欧美一区二区三区婷婷| 激情久久av一区av二区av三区| 亚洲无玛一区| 日韩一二三四| 国产成人精品aa毛片| 国产精品久久久久久网站| 日韩成人免费在线视频| 91九色精品| 一区二区成人精品| 久久一区二区电影| 草草视频在线一区二区| 91精品国产综合久久久久久久| 麻豆av免费在线| 理论不卡电影大全神| 亚洲最色的网站| 好吊色这里只有精品| 国产黄色片在线观看| 久久婷婷久久一区二区三区| 电影午夜精品一区二区三区| 99精品在线视频观看| 久久精品国产一区二区| 国产成人精品av在线| 91精品国产乱码在线观看| 国产精品v欧美精品v日本精品动漫| 色播久久人人爽人人爽人人片视av| 国产精品久久久久无码av色戒| 加勒比久久高清| 精品久久人人做人人爱| 天天色天天干天天色| 日日夜夜精品| 911精品产国品一二三产区| 久久久国产欧美| 五月激情久久| 欧美系列一区二区| 91蝌蚪视频在线观看| 欧美magnet| 在线免费观看不卡av| 久久精品一区二| 人人鲁人人莫人人爱精品| 色婷婷精品大在线视频| 成人精品视频一区二区| 亚洲成人av观看| 欧美私人免费视频| 污污网站在线观看视频| 国产成人视屏| 精品日韩在线一区| 欲求不满的岳中文字幕| 清纯唯美亚洲经典中文字幕| 国产网站欧美日韩免费精品在线观看 | 一区二区三区黄色| 中国女人特级毛片| 久久福利影院| 欧美黑人又粗大| 日韩av大片在线观看| 日日夜夜一区二区| 国产欧美在线播放| av 一区二区三区| 懂色av一区二区三区蜜臀| 国内一区二区三区在线视频| 欧洲免费在线视频| 国产精品成人一区二区艾草| 成人在线免费观看网址| av在线不卡免费| 色综合久久六月婷婷中文字幕| 少妇黄色一级片| 日日夜夜精品| 亚洲国产精品va| 色一情一交一乱一区二区三区| 999久久久免费精品国产| 欧美日韩国产二区| 中文字幕在线欧美| 国产中文一区二区三区| 国产精品一区二区三区在线| 国产永久免费高清在线观看| 综合久久久久久久| 国产深夜男女无套内射| 成人国产激情在线| 欧美精品一区二区精品网| 日韩福利在线视频| 亚洲啪啪91| 国产日韩在线免费| 日韩三级电影网| 亚洲欧美一区二区不卡| 日韩精品xxxx| 日本免费精品| 中文字幕亚洲自拍| 中文字幕一区二区三区手机版| 日本成人中文字幕在线视频| 成人免费视频观看视频| avtt亚洲| 色综合久久久久综合99| 苍井空张开腿实干12次| 色喇叭免费久久综合| 欧美亚洲成人xxx| 精品乱子伦一区二区| 国产精品毛片久久久久久久| 日韩在线综合网| 日本精品视频| 久久精视频免费在线久久完整在线看| 日韩熟女一区二区| 成人av网在线| 欧美黑人在线观看| 亚洲欧美在线人成swag| 亚洲性69xxxbbb| 欧美精品亚洲精品日韩精品| 懂色av一区二区三区免费看| av动漫免费观看| 成人性片免费| 亚洲日本中文字幕免费在线不卡| 国产午夜视频在线播放| 国产精品99久久久久| 伊人av成人| 99riav视频一区二区| 亚洲精品在线91| 97超碰人人干| 成人精品一区二区三区四区 | 911国产精品| 青青草华人在线视频| 天堂av在线一区| 欧美下载看逼逼| 自由日本语热亚洲人| 亚洲精品乱码久久久久久金桔影视 | 自拍偷拍一区二区三区四区| 国产精品一区二区av日韩在线 | 韩国无码av片在线观看网站| 精品久久在线| 日韩在线免费视频观看| 一级黄色录像大片| 国产精品久久久久久久久免费丝袜 | 欧美少妇一级片| 成人免费91| 欧美精品手机在线| 亚洲男女视频在线观看| 午夜视频在线免费观看| 欧美性xxxxx极品| japanese中文字幕| 日本不卡的三区四区五区| 亚洲aⅴ天堂av在线电影软件| 99久久久国产精品免费调教网站| 在线观看久久av| 国产精品久久婷婷| 一区二区三区四区视频精品免费 | 欧美经典一区二区| 色婷婷狠狠18| 91精品国产调教在线观看| 成人午夜黄色影院| 日本无删减在线| 日韩av在线网址| 国产免费一区二区三区四区五区| 国产欧美一区二区精品仙草咪| 色婷婷成人在线| 欧美在线网站| 国产综合av一区二区三区| 波多野结衣亚洲一二三| 日韩在线中文字| 成人爽a毛片一区二区| 欧美日韩国产专区| 欧美一区二区三区粗大| 国产成人在线色| 无码人妻h动漫| 婷婷伊人综合| 快播日韩欧美| 日日夜夜精品| 538国产精品一区二区免费视频| 成人高清网站| 欧美大片日本大片免费观看| 国产精品21p| 亚洲私人影院在线观看| 国产人妻人伦精品1国产丝袜| 美女性感视频久久| 久久99中文字幕| 日韩成人综合| 精品国产一区二区三| 成人国产精品入口免费视频| 欧美精品电影免费在线观看| 国产系列在线观看| 欧美大片免费久久精品三p| 激情网站在线观看| 亚洲午夜日本在线观看| 在线观看免费黄色网址| 成人国产精品免费网站| 中文字幕22页| 久久aⅴ国产紧身牛仔裤| 麻豆映画在线观看| 国产精品亚洲人成在99www| 成人在线观看91| 欧洲美女精品免费观看视频| 69av成年福利视频| 高清全集视频免费在线| 亚洲欧洲一区二区三区久久| 午夜老司机福利| 欧美日韩激情一区二区三区| 成年人免费高清视频| 一区二区成人在线观看| 特级西西人体高清大胆| 91片黄在线观看| 麻豆tv在线观看| 精品一区二区三区免费观看 | 欧美一级高潮片| 亚洲私人黄色宅男| 一级片久久久久| 久久毛片高清国产| 妖精视频一区二区| 国产成人在线看| 日本精品一区在线| 久久国产婷婷国产香蕉| 成人中文字幕av| 亚洲一区二区三区免费在线观看| 成人国产在线看| 亚洲91视频| 在线观看精品视频| 日韩片欧美片| 香蕉久久夜色| 欧美日韩在线二区| 日本一区二区三区精品视频| 亚洲第一福利社区| 开心色怡人综合网站| 嫩草国产精品入口| 国产一区自拍视频| 精品国产一区二区三区成人影院| 91福利入口| 欧美电影在线观看一区| 亚洲va欧美va国产综合剧情| 四虎地址8848精品| 国产日韩欧美日韩大片| 国产成人毛片| 国产在线精品播放| 国产激情综合| 亚洲综合日韩在线| 亚洲性视频在线| 国产九色精品| 精品深夜福利视频| 久久久婷婷一区二区三区不卡| 校园春色另类视频| 免费国产一区| 精品中文字幕一区二区三区av| 久久艳妇乳肉豪妇荡乳av| 欧美一级色片| 午夜精品一区二区在线观看 | 久久久久久久久网站| 国产第一页在线视频| 国内精品小视频在线观看| 136福利第一导航国产在线| 97超级碰碰碰| av亚洲一区二区三区| 国产自摸综合网| 91成人噜噜噜在线播放| 久精品国产欧美| jizzjizz欧美69巨大| 手机福利在线视频| 亚洲国产mv| 青青青在线视频免费观看| 免费成人av在线播放| 日本中文字幕精品| 99re热这里只有精品视频| 先锋影音av在线| 亚洲精品视频自拍| 日本熟女一区二区| 在线观看国产精品网站| 国产偷人妻精品一区二区在线| 亚洲成年人影院在线| 成人动漫在线免费观看| 久久99久久99精品免观看粉嫩| a天堂资源在线| 国产精品亚发布| 一区中文字幕| 日本免费高清一区| 欧美激情第10页| 欧美性猛交久久久乱大交小说 | 欧美亚洲国产一区二区三区va| 国产普通话bbwbbwbbw| 日韩国产精品视频| 麻豆免费在线观看| 欧美在线亚洲在线| 国产精品18| 青青草成人激情在线| 小说区亚洲自拍另类图片专区| 国自产拍偷拍精品啪啪一区二区| 麻豆高清免费国产一区| v天堂中文在线| 亚洲人123区| 99re这里只有精品在线| 精品国产91久久久久久久妲己 | 国产精品免费丝袜| 国产精品9191| 欧美一级一区二区| 在线观看免费版| 国产99久久精品一区二区| 77成人影视| 日本三级福利片| 日韩成人av影视| jizz日本免费| 亚洲一区二区欧美日韩 | 欧美大片免费| 国产一区二区三区无遮挡 | 国产精品亚洲欧美在线播放| 亚洲欧美精品中文字幕在线| 免费毛片在线看片免费丝瓜视频 | 成人av二区| 国产男女在线观看| 国产aⅴ综合色| 卡通动漫亚洲综合| 欧美性大战久久久久久久| 清纯唯美亚洲色图| 91精品国产高清| 欧美a大片欧美片| www.男人天堂网| 国产一区二区成人久久免费影院 | 欧美视频在线免费看| 六月丁香色婷婷| 草民午夜欧美限制a级福利片| 国产精品久久久久久久久免费高清 | 久久久久久久人妻无码中文字幕爆| 亚洲色图20p| 国产精品久久影视| 久久精品国产视频| 亚洲美女色播| 亚洲AV无码成人精品一区| 麻豆精品一区二区三区| 摸摸摸bbb毛毛毛片| 在线亚洲人成电影网站色www| 美国一级片在线免费观看视频| 青草青草久热精品视频在线网站| 欧美电影在线观看免费| 激情伊人五月天| 久久影视一区二区| jizz国产在线观看| 亚洲日本成人女熟在线观看| 国产一区二区主播在线| 色婷婷精品国产一区二区三区| 日韩精品高清不卡| 男人的天堂官网| 欧美色倩网站大全免费| 婷婷在线视频观看| 91最新国产视频| 国产精品大片| 国产又粗又猛又色| 一本大道久久a久久精品综合| 国产天堂素人系列在线视频| 国产精品露脸av在线| 999久久久91| 亚洲美女高潮久久久| 五月激情综合色| 国产综合在线观看| 国产精品美女久久久久av超清| 999久久久亚洲| jjzz黄色片| 色婷婷综合五月| 欧美成人视屏| 国产精品久久久久久免费观看 | 久草视频福利在线| 色婷婷综合激情| 国产美女在线观看| 国产视色精品亚洲一区二区| 久久中文字幕一区二区三区| 波多野结衣家庭教师在线观看| 欧美成人免费网站| 在线黄色的网站| 日本特级黄色大片| caoporn国产一区二区| 无码人妻丰满熟妇区五十路| 久久精品91久久久久久再现| 精品久久对白| www.xxx亚洲| 亚洲福利视频导航| www.视频在线.com| 国产 高清 精品 在线 a| 美女视频一区免费观看| jizz亚洲少妇| 亚洲欧洲成视频免费观看| www.久久99| 日韩中文字幕组| 亚洲综合免费观看高清完整版在线| 蜜桃视频在线观看网站| 亚洲aⅴ男人的天堂在线观看| 国产午夜久久| 欧美激情精品久久| 国产亚洲视频在线| 国产欧美自拍一区| 特级西西444www| 在线观看亚洲成人|