日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

ASP.NET 缓存技术分析

發(fā)布時間:2023/12/13 asp.net 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ASP.NET 缓存技术分析 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

緩存功能是大型網站設計一個很重要的部分。由數(shù)據(jù)庫驅動的Web應用程序,如果需要改善其性能,最好的方法是使用緩存功能??赡艿那闆r下盡量使用緩 存,從內存中返回數(shù)據(jù)的速度始終比去數(shù)據(jù)庫查的速度快,因而可以大大提供應用程序的性能。畢竟現(xiàn)在內存非常便宜,用空間換取時間效率應該是非常劃算的。尤 其是對耗時比較長的、需要建立網絡鏈接的數(shù)據(jù)庫查詢操作等。 對于web頁面的緩存,WebForm與ASP.NET MVC有不同的語法。在WebForm中,?<%@ OutputCache Duration="60" VaryByParam="none" %> ?來進行頁面緩存或者局部頁面緩存,在ASP.NET MVC中,針對Action使用Attribute進行頁面緩存。這些都是Web框架封裝好的,而對于Web Application來講,需要緩存的不僅僅是頁面,很多時候還需要定制的去緩存一些內容,這時候就需要用到HttpRun.Cache對象。

以下內容轉自 ??細說 ASP.NET Cache 及其高級用法

許多做過程序性能優(yōu)化的人,或者關注過程程序性能的人,應該都使用過各類緩存技術。 而我今天所說的Cache是專指ASP.NET的Cache,我們可以使用HttpRuntime.Cache訪問到的那個Cache,而不是其它的緩存技術。

Cache的基本用途

提到Cache,不得不說說它的主要功能:改善程序性能。
ASP.NET是一種動態(tài)頁面技術,用ASP.NET技術做出來的網頁幾乎都是動態(tài)的,所謂動態(tài)是指:頁面的內容會隨著不同的用戶或者持續(xù)更新的數(shù)據(jù), 而呈現(xiàn)出不同的顯示結果。既然是動態(tài)的,那么這些動態(tài)的內容是從哪里來的呢?我想絕大多數(shù)網站都有自己的數(shù)據(jù)源, 程序通過訪問數(shù)據(jù)源獲取頁面所需的數(shù)據(jù),然后根據(jù)一些業(yè)務規(guī)則的計算處理,最后變成適合頁面展示的內容。

由于這種動態(tài)頁面技術通常需要從數(shù)據(jù)源獲取數(shù)據(jù),并經過一些計算邏輯,最終變成一些HTML代碼發(fā)給客戶端顯示。而這些計算過程顯然也是有成本的。 這些處理成本最直接可表現(xiàn)為影響服務器的響應速度,尤其是當數(shù)據(jù)的處理過程變得復雜以及訪問量變大時,會變得比較明顯。 另一方面,有些數(shù)據(jù)并非時刻在發(fā)生變化,如果我們可以將一些變化不頻繁的數(shù)據(jù)的最終計算結果(包括頁面輸出)緩存起來, 就可以非常明顯地提升程序的性能,緩存的最常見且最重要的用途就體現(xiàn)在這個方面。 這也是為什么一說到性能優(yōu)化時,一般都將緩存擺在第一位的原因。 我今天要說到的ASP.NET Cache也是可以實現(xiàn)這種緩存的一種技術。 不過,它還有其它的一些功能,有些是其它緩存技術所沒有的。

Cache的定義

在介紹Cache的用法前,我們先來看一下Cache的定義:(說明:我忽略了一些意義不大的成員)

// 實現(xiàn)用于 Web 應用程序的緩存。無法繼承此類。 public sealed class Cache : IEnumerable {// 用于 Cache.Insert(...) 方法調用中的 absoluteExpiration 參數(shù)中以指示項從不過期。public static readonly DateTime NoAbsoluteExpiration; // 用作 Cache.Insert(...) 或 Cache.Add(...) // 方法調用中的 slidingExpiration 參數(shù),以禁用可調過期。 public static readonly TimeSpan NoSlidingExpiration; // 獲取或設置指定鍵處的緩存項。 public object this[string key] { get; set; } // 將指定項添加到 System.Web.Caching.Cache 對象,該對象具有依賴項、過期和優(yōu)先級策略 // 以及一個委托(可用于在從 Cache 移除插入項時通知應用程序)。 public object Add(string key, object value, CacheDependency dependencies, DateTime absoluteExpiration, TimeSpan slidingExpiration, CacheItemPriority priority, CacheItemRemovedCallback onRemoveCallback); // 從 System.Web.Caching.Cache 對象檢索指定項。 // key: 要檢索的緩存項的標識符。 // 返回結果: 檢索到的緩存項,未找到該鍵時為 null。 public object Get(string key); public void Insert(string key, object value); public void Insert(string key, object value, CacheDependency dependencies); public void Insert(string key, object value, CacheDependency dependencies, DateTime absoluteExpiration, TimeSpan slidingExpiration); // 摘要: // 向 System.Web.Caching.Cache 對象中插入對象,后者具有依賴項、過期和優(yōu)先級策略 // 以及一個委托(可用于在從 Cache 移除插入項時通知應用程序)。 // // 參數(shù): // key: // 用于引用該對象的緩存鍵。 // // value: // 要插入緩存中的對象。 // // dependencies: // 該項的文件依賴項或緩存鍵依賴項。當任何依賴項更改時,該對象即無效, // 并從緩存中移除。如果沒有依賴項,則此參數(shù)包含 null。 // // absoluteExpiration: // 所插入對象將過期并被從緩存中移除的時間。 // 如果使用絕對過期,則 slidingExpiration 參數(shù)必須為 Cache.NoSlidingExpiration。 // // slidingExpiration: // 最后一次訪問所插入對象時與該對象過期時之間的時間間隔。如果該值等效于 20 分鐘, // 則對象在最后一次被訪問 20 分鐘之后將過期并被從緩存中移除。如果使用可調過期,則 // absoluteExpiration 參數(shù)必須為 System.Web.Caching.Cache.NoAbsoluteExpiration。 // // priority: // 該對象相對于緩存中存儲的其他項的成本,由 System.Web.Caching.CacheItemPriority 枚舉表示。 // 該值由緩存在退出對象時使用;具有較低成本的對象在具有較高成本的對象之前被從緩存移除。 // // onRemoveCallback: // 在從緩存中移除對象時將調用的委托(如果提供)。 // 當從緩存中刪除應用程序的對象時,可使用它來通知應用程序。 // // 異常: // System.ArgumentException: // 為要添加到 Cache 中的項設置 absoluteExpiration 和 slidingExpiration 參數(shù)。 // // System.ArgumentNullException: // key 或 value 參數(shù)為 null。 // // System.ArgumentOutOfRangeException: // 將 slidingExpiration 參數(shù)設置為小于 TimeSpan.Zero 或大于一年的等效值。 public void Insert(string key, object value, CacheDependency dependencies, DateTime absoluteExpiration, TimeSpan slidingExpiration, CacheItemPriority priority, CacheItemRemovedCallback onRemoveCallback); // 從應用程序的 System.Web.Caching.Cache 對象移除指定項。 public object Remove(string key); // 將對象與依賴項策略、到期策略和優(yōu)先級策略 // 以及可用來在從緩存中移除項【之前】通知應用程序的委托一起插入到 Cache 對象中。 // 注意:此方法受以下版本支持:3.5 SP1、3.0 SP1、2.0 SP1 public void Insert(string key, object value, CacheDependency dependencies, DateTime absoluteExpiration, TimeSpan slidingExpiration, CacheItemUpdateCallback onUpdateCallback); }

ASP.NET為了方便我們訪問Cache,在HttpRuntime類中加了一個靜態(tài)屬性Cache,這樣,我們就可以在任意地方使用Cache的功 能。 而且,ASP.NET還給它增加了二個“快捷方式”:Page.Cache, HttpContext.Cache,我們通過這二個對象也可以訪問到HttpRuntime.Cache, 注意:這三者是在訪問同一個對象。Page.Cache訪問了HttpContext.Cache,而HttpContext.Cache又直接訪問 HttpRuntime.Cache

Cache常見用法

通常,我們使用Cache時,一般只有二個操作:讀,寫。
要從Cache中獲取一個緩存項,我們可以調用Cache.Get(key)方法,要將一個對象放入緩存,我們可以調用Add, Insert方法。 然而,Add, Insert方法都有許多參數(shù),有時我們或許只是想簡單地放入緩存,一切接受默認值,那么還可以調用它的默認索引器, 我們來看一下這個索引器是如何工作的:

public object this[string key] {get{return this.Get(key);}set { this.Insert(key, value); } }

可以看到:讀緩存,其實是在調用Get方法,而寫緩存則是在調用Insert方法的最簡單的那個重載版本。

注意了:Add方法也可以將一個對象放入緩存,這個方法有7個參數(shù),而Insert也有一個簽名類似的重載版本, 它們有著類似的功能:將指定項添加到 System.Web.Caching.Cache 對象,該對象具有依賴項、過期和優(yōu)先級策略以及一個委托(可用于在從 Cache 移除插入項時通知應用程序)。?然而,它們有一點小的區(qū)別:當要加入的緩存項已經在Cache中存在時,Insert將會覆蓋原有的緩存項目,而Add則不會修改原有緩存項。

也就是說:如果您希望某個緩存項目一旦放入緩存后,就不要再被修改,那么調用Add確實可以防止后來的修改操作。 而調用Insert方法,則永遠會覆蓋已存在項(哪怕以前是調用Add加入的)。

從另一個角度看,Add的效果更像是 static readonly 的行為,而Insert的效果則像 static 的行為。
注意:我只是說【像】,事實上它們比一般的static成員有著更靈活的用法。

由于緩存項可以讓我們隨時訪問,看起來確實有點static成員的味道,但它們有著更高級的特性,比如: 緩存過期(絕對過期,滑動過期),緩存依賴(依賴文件,依賴其它緩存項),移除優(yōu)先級,緩存移除前后的通知等等。 后面我將會分別介紹這四大類特性。

Cache類的特點

Cache類有一個很難得的優(yōu)點,用MSDN上的說話就是:

此類型是線程安全的。

為什么這是個難得的優(yōu)點呢?因為在.net中,絕大多數(shù)類在實現(xiàn)時,都只是保證靜態(tài)類型的方法是線程安全, 而不考慮實例方法是線程安全。這也算是一條基本的.NET設計規(guī)范原則。
對于那些類型,MSDN通常會用這樣的話來描述:

此類型的公共靜態(tài)(在 Visual Basic 中為 Shared)成員是線程安全的。但不能保證任何實例成員是線程安全的。

所以,這就意味著我們可以在任何地方讀寫Cache都不用擔心Cache的數(shù)據(jù)在多線程環(huán)境下的數(shù)據(jù)同步問題。 多線程編程中,最復雜的問題就是數(shù)據(jù)的同步問題,而Cache已經為我們解決了這些問題。

不過我要提醒您:ASP.NET本身就是一個多線程的編程模型,所有的請求是由線程池的線程來處理的。 通常,我們在多線程環(huán)境中為了解決數(shù)據(jù)同步問題,一般是采用鎖來保證數(shù)據(jù)同步, 自然地,ASP.NET也不例外,它為了解決數(shù)據(jù)的同步問題,內部也是采用了鎖。

說到這里,或許有些人會想:既然只一個Cache的靜態(tài)實例,那么這種鎖會不會影響并發(fā)?
答案是肯定的,有鎖肯定會在一定程度上影響并發(fā),這是沒有辦法的事情。
然而,ASP.NET在實現(xiàn)Cache時,會根據(jù)CPU的個數(shù)創(chuàng)建多個緩存容器,盡量可能地減小沖突, 以下就是Cache創(chuàng)建的核心過程:

internal static CacheInternal Create() {CacheInternal internal2;int numSingleCaches = 0; if( numSingleCaches == 0 ) { uint numProcessCPUs = (uint)SystemInfo.GetNumProcessCPUs(); numSingleCaches = 1; for( numProcessCPUs -= 1; numProcessCPUs > 0; numProcessCPUs = numProcessCPUs >> 1 ) { numSingleCaches = numSingleCaches << 1; } } CacheCommon cacheCommon = new CacheCommon(); if( numSingleCaches == 1 ) { internal2 = new CacheSingle(cacheCommon, null, 0); } else { internal2 = new CacheMultiple(cacheCommon, numSingleCaches); } cacheCommon.SetCacheInternal(internal2); cacheCommon.ResetFromConfigSettings(); return internal2; }

說明:CacheInternal是個內部用的包裝類,Cache的許多操作都要由它來完成。

在上面的代碼中,numSingleCaches的計算過程很重要,如果上面代碼不容易理解,那么請看我下面的示例代碼:?

static void Main() {for( uint i = 1; i <= 20; i++ ) ShowCount(i); } static void ShowCount(uint numProcessCPUs) { int numSingleCaches = 1; for( numProcessCPUs -= 1; numProcessCPUs > 0; numProcessCPUs = numProcessCPUs >> 1 ) { numSingleCaches = numSingleCaches << 1; } Console.Write(numSingleCaches + ","); }

程序將會輸出:

1,2,4,4,8,8,8,8,16,16,16,16,16,16,16,16,32,32,32,32

CacheMultiple的構造函數(shù)如下:

internal CacheMultiple(CacheCommon cacheCommon, int numSingleCaches) : base(cacheCommon) {this._cacheIndexMask = numSingleCaches - 1; this._caches = new CacheSingle[numSingleCaches]; for (int i = 0; i < numSingleCaches; i++) { this._caches[i] = new CacheSingle(cacheCommon, this, i); } }

現(xiàn)在您應該明白了吧:CacheSingle其實是ASP.NET內部使用的緩存容器,多個CPU時,它會創(chuàng)建多個緩存容器。
在寫入時,它是如何定位這些容器的呢?請繼續(xù)看代碼:

internal CacheSingle GetCacheSingle(int hashCode) {hashCode = Math.Abs(hashCode); int index = hashCode & this._cacheIndexMask; return this._caches[index]; }

說明:參數(shù)中的hashCode是直接調用我們傳的key.GetHashCode() ,GetHashCode是由Object類定義的。

所以,從這個角度看,雖然ASP.NET的Cache只有一個HttpRuntime.Cache靜態(tài)成員,但它的內部卻可能會包含多個緩存容器, 這種設計可以在一定程度上減少并發(fā)的影響。

不管如何設計,在多線程環(huán)境下,共用一個容器,沖突是免不了的。如果您只是希望簡單的緩存一些數(shù)據(jù), 不需要Cache的許多高級特性,那么,可以考慮不用Cache 。 比如:可以創(chuàng)建一個Dictionary或者Hashtable的靜態(tài)實例,它也可以完成一些基本的緩存工作, 不過,我要提醒您:您要自己處理多線程訪問數(shù)據(jù)時的數(shù)據(jù)同步問題。
順便說一句:Hashtable.Synchronized(new Hashtable())也是一個線程安全的集合,如果想簡單點,可以考慮它。

接下來,我們來看一下Cache的高級特性,這些都是Dictionary或者Hashtable不能完成的。

緩存項的過期時間

ASP.NET支持二種緩存項的過期策略:絕對過期和滑動過期。
1. 絕對過期,這個容易理解:就是在緩存放入Cache時,指定一個具體的時間。當時間到達指定的時間的時,緩存項自動從Cache中移除。
2. 滑動過期:某些緩存項,我們可能只希望在有用戶在訪問時,就盡量保留在緩存中,只有當一段時間內用戶不再訪問該緩存項時,才移除它, 這樣可以優(yōu)化內存的使用,因為這種策略可以保證緩存的內容都是【很熱門】的。 操作系統(tǒng)的內存以及磁盤的緩存不都是這樣設計的嗎?而這一非常有用的特性,Cache也為我們準備好了,只要在將緩存項放入緩存時, 指定一個滑動過期時間就可以實現(xiàn)了。

以上二個選項分別對應Add, Insert方法中的DateTime absoluteExpiration, TimeSpan slidingExpiration這二個參數(shù)。
注意:這二個參數(shù)都是成對使用的,但不能同時指定它們?yōu)橐粋€【有效】值,最多只能一個參數(shù)值有效。 當不使用另一個參數(shù)項時,請用Cache類定義二個static readonly字段賦值。

這二個參數(shù)比較簡單,我就不多說了,只說一句:如果都使用Noxxxxx這二個選項,那么緩存項就一直保存在緩存中。(或許也會被移除)

緩存項的依賴關系 - 依賴其它緩存項

ASP.NET Cache有個很強大的功能,那就是緩存依賴。一個緩存項可以依賴于另一個緩存項。 以下示例代碼創(chuàng)建了二個緩存項,且它們間有依賴關系。首先請看頁面代碼:

<body><p>Key1 的緩存內容:= HttpRuntime.Cache["key1"] </p> <hr /> <form action="CacheDependencyDemo.aspx" method="post"> <input type="submit" name="SetKey1Cache" value="設置Key1的值" /> <input type="submit" name="SetKey2Cache" value="設置Key2的值" /> </form> </body>

頁面后臺代碼:

public partial class CacheDependencyDemo : System.Web.UI.Page { [SubmitMethod(AutoRedirect=true)] private void SetKey1Cache() { SetKey2Cache(); CacheDependency dep = new CacheDependency(null, new string[] { "key2" }); HttpRuntime.Cache.Insert("key1", DateTime.Now.ToString(), dep, Cache.NoAbsoluteExpiration, Cache.NoSlidingExpiration); } [SubmitMethod(AutoRedirect=true)] private void SetKey2Cache() { HttpRuntime.Cache.Insert("key2", Guid.NewGuid().ToString()); } }

當運行這個示例頁面時,運行結果如下圖所示, 點擊按鈕【設置Key1的值】時,將會出現(xiàn)緩存項的內容(左圖)。點擊按鈕【設置Key2的值】時,此時將獲取不到緩存項的內容(右圖)。

根據(jù)結果并分析代碼,我們可以看出,在創(chuàng)建Key1的緩存項時,我們使用了這種緩存依賴關系:

CacheDependency dep = new CacheDependency(null, new string[] { "key2" });

所以,當我們更新Key2的緩存項時,Key1的緩存就失效了(不存在)。

不要小看了這個示例。的確,僅看這幾行示例代碼,或許它們實在是沒有什么意義。 那么,我就舉個實際的使用場景來說明它的使用價值。

上面這幅圖是我寫的一個小工具。在示意圖中,左下角是一個緩存表CacheTable,它由一個叫Table1BLL的類來維護。 CacheTable的數(shù)據(jù)來源于Table1,由Table1.aspx頁面顯示出來。 同時,ReportA, ReportB的數(shù)據(jù)也主要來源于Table1,由于Table1的訪問幾乎絕大多數(shù)都是讀多寫少,所以,我將Table1的數(shù)據(jù)緩存起來了。 而且,ReportA, ReportB這二個報表采用GDI直接畫出(由報表模塊生成,可認是Table1BLL的上層類),鑒于這二個報表的瀏覽次數(shù)較多且數(shù)據(jù)源是讀多寫少, 因此,這二個報表的輸出結果,我也將它們緩存起來。

在這個場景中,我們可以想像一下:如果希望在Table1的數(shù)據(jù)發(fā)生修改后,如何讓二個報表的緩存結果失效?
讓Table1BLL去通知那二個報表模塊,還是Table1BLL去直接刪除二個報表的緩存?
其實,不管是選擇前者還是后者,當以后還需要在Table1的CacheTable上做其它的緩存實現(xiàn)時(可能是其它的新報表), 那么,勢必都要修改Table1BLL,那絕對是個失敗的設計。 這也算是模塊間耦合的所帶來的惡果。

幸好,ASP.NET Cache支持一種叫做緩存依賴的特性,我們只需要讓Table1BLL公開它緩存CacheTable的KEY就可以了(假設KEY為 CacheTableKey), 然后,其它的緩存結果如果要基于CacheTable,設置一下對【CacheTableKey】的依賴就可以實現(xiàn)這樣的效果:?當CacheTable更新后,被依賴的緩存結果將會自動清除。這樣就徹底地解決了模塊間的緩存數(shù)據(jù)依賴問題。

緩存項的依賴關系 - 文件依賴

我希望在用戶修改了配置文件后,程序能立刻以最新的參數(shù)運行,而且不用重啟網站。
首先,我要說明一點,雖然解決方案與Cache的文件依賴有關,但還需與緩存的移除通知配合使用才能完美的解決問題。 為了便于內容的安排,我先使用Cache的文件依賴來簡單的實現(xiàn)一個粗糙的版本,在本文的后續(xù)部分再來完善這個實現(xiàn)。

先來看個粗糙的版本。假如我的網站中有這樣一個配置參數(shù)類型:

/// <summary> /// 模擬網站所需的運行參數(shù) /// </summary> public class RunOptions {public string WebSiteUrl; public string UserName; }

我可以將它配置在這樣一個XML文件中:

<?xml version="1.0" encoding="utf-8"?> <RunOptions xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <WebSiteUrl>http://www.cnblogs.com/fish-li</WebSiteUrl> <UserName>fish li</UserName> </RunOptions>

再來一個用于顯示運行參數(shù)的頁面:?

<body><p>WebSiteUrl: = WebSiteApp.RunOptions.WebSiteUrl </p> <p>UserName: = WebSiteApp.RunOptions.UserName </p> </body>

下面的代碼就可以實現(xiàn):在XML修改后,瀏覽頁面就能立即看到最新的參數(shù)值

public static class WebSiteApp {private static readonly string RunOptionsCacheKey = Guid.NewGuid().ToString(); public static RunOptions RunOptions { get { // 首先嘗試從緩存中獲取運行參數(shù) RunOptions options = HttpRuntime.Cache[RunOptionsCacheKey] as RunOptions; if( options == null ) { // 緩存中沒有,則從文件中加載 string path = HttpContext.Current.Server.MapPath("~/App_Data/RunOptions.xml"); options = RwConfigDemo.XmlHelper.XmlDeserializeFromFile<RunOptions>(path, Encoding.UTF8); // 把從文件中讀到的結果放入緩存,并設置與文件的依賴關系。 CacheDependency dep = new CacheDependency(path); // 如果您的參數(shù)較復雜,與多個文件相關,那么也可以使用下面的方式,傳遞多個文件路徑。 //CacheDependency dep = new CacheDependency(new string[] { path }); HttpRuntime.Cache.Insert(RunOptionsCacheKey, options, dep); } return options; } } }

注意:這里仍然是在使用CacheDependency,只是我們現(xiàn)在是給它的構造函數(shù)的第一個參數(shù)傳遞要依賴的文件名。

在即將結束對緩存的依賴介紹之前,還要補充二點:
1. CacheDependency還支持【嵌套】,即:CacheDependency的構造函數(shù)中支持傳入其它的CacheDependency實例,這樣可以構成一種非常復雜的樹狀依賴關系。
2. 緩存依賴的對象還可以是SQL SERVER,具體可參考SqlCacheDependency

緩存項的移除優(yōu)先級

緩存的做法有很多種,一個靜態(tài)變量也可以稱為是一個緩存。一個靜態(tài)的集合就是一個緩存的容器了。 我想很多人都用Dictionary,List,或者Hashtable做過緩存容器,我們可以使用它們來保存各種數(shù)據(jù),改善程序的性能。 一般情況下,如果我們直接使用這類集合去緩存各類數(shù)據(jù),那么,那些數(shù)據(jù)所占用的內存將不會被回收,哪怕它們的使用機會并不是很多。 當緩存數(shù)據(jù)越來越多時,它們所消耗的內存自然也會越來越多。那么,能不能在內存不充足時,釋放掉一些訪問不頻繁的緩存項呢?

這個問題也確實是個較現(xiàn)實的問題。雖然,使用緩存會使用程序運行更快,但是,我們數(shù)據(jù)會無限大,不可能統(tǒng)統(tǒng)緩存起來, 畢竟,內存空間是有限的。因此,我們可以使用前面所說的基于一段時間內不再訪問就 刪除的策略來解決這個問題。 然而,在我們編碼時,根本不知道我們的程序會運行在什么配置標準的計算機上,因此,根本不可能會對內存的大小作出任何假設, 此時,我們可能會希望當緩存占用過多的內存時,且當內存不夠時,能自動移除一些不太重要的緩存項,這或許也比較有意義。

對于這個需求,在.net framework提供了二種解決辦法,一種是使用WeakReference類,另一種是使用Cache 。 不過,既然我們是在使用ASP.NET,選擇Cache當然會更方便。 在Cache的Add, Insert方法的某些重載版本中,可以指定緩存項的保存優(yōu)先級策略,由參數(shù)CacheItemPriority priority來傳入。 其中,CacheItemPriority是一個枚舉類型,它包含了如下枚舉值:

// 指定 Cache 對象中存儲的項的相對優(yōu)先級。 public enum CacheItemPriority {// 在服務器釋放系統(tǒng)內存時,具有該優(yōu)先級級別的緩存項最有可能被從緩存刪除。Low = 1, // 在服務器釋放系統(tǒng)內存時,具有該優(yōu)先級級別的緩存項比分配了 CacheItemPriority.Normal // 優(yōu)先級的項更有可能被從緩存刪除。 BelowNormal = 2, // 在服務器釋放系統(tǒng)內存時,具有該優(yōu)先級級別的緩存項很有可能被從緩存刪除, // 其被刪除的可能性僅次于具有 CacheItemPriority.Low // 或 CacheItemPriority.BelowNormal 優(yōu)先級的那些項。這是默認選項。 Normal = 3, // 緩存項優(yōu)先級的默認值為 CacheItemPriority.Normal。 Default = 3, // 在服務器釋放系統(tǒng)內存時,具有該優(yōu)先級級別的緩存項被刪除的可能性 // 比分配了 CacheItemPriority.Normal 優(yōu)先級的項要小。 AboveNormal = 4, // 在服務器釋放系統(tǒng)內存時,具有該優(yōu)先級級別的緩存項最不可能被從緩存刪除。 High = 5, // 在服務器釋放系統(tǒng)內存時,具有該優(yōu)先級級別的緩存項將不會被自動從緩存刪除。 // 但是,具有該優(yōu)先級級別的項會根據(jù)項的絕對到期時間或可調整到期時間與其他項一起被移除。 NotRemovable = 6, }

說明:當我們調用Cache的Add, Insert方法時,如果不指定CacheItemPriority選項,最終使用Normal所代表的優(yōu)先級。 如果我們希望將某個可能不太重要的數(shù)據(jù)放入緩存時,可以指定優(yōu)先級為Low或者BelowNormal。 如果想讓緩存項在內存不足時,也不會被移除(除非到期或者依賴項有改變),可使用NotRemovable。

顯然,我們可以使用這個特性來控制緩存對內存壓力的影響。 其它的緩存方案,如static Collection + WeakReference也較難實現(xiàn)這樣靈活的控制。

緩存項的移除通知

ASP.NET Cache與一些static變量所實現(xiàn)的緩存效果并不相同,它的緩存項是可以根據(jù)一些特定的條件失效的,那些失效的緩存將會從內存中移除。 雖然,某些移除條件并不是由我們的代碼直接解發(fā)的,但ASP.NET還是提供一種方法讓我們可以在緩存項在移除時,能通知我們的代碼。

注意哦:ASP.NET Cache支持移除【前】通知 和 移除【后】通知二種通知方式。

我們可以在調用Add, Insert方法時,通過參數(shù)onRemoveCallback傳遞一個CacheItemRemovedCallback類型的委托,以便在移除指定的緩存項時, 能夠通知我們。這個委托的定義如下:

/// <summary> /// 定義在從 System.Web.Caching.Cache 移除緩存項時通知應用程序的回調方法。 /// </summary> /// <param name="key">從緩存中移除的鍵(當初由Add, Insert傳入的)。</param> /// <param name="value">與從緩存中移除的鍵關聯(lián)的緩存項(當初由Add, Insert傳入的)。</param> /// <param name="reason">從緩存移除項的原因。 </param> public delegate void CacheItemRemovedCallback(string key, object value, CacheItemRemovedReason reason); // 指定從 System.Web.Caching.Cache 對象移除項的原因。 public enum CacheItemRemovedReason { // 該項是通過指定相同鍵的 Cache.Insert(System.String,System.Object) // 方法調用或 Cache.Remove(System.String) 方法調用從緩存中移除的。 Removed = 1, // 從緩存移除該項的原因是它已過期。 Expired = 2, // 之所以從緩存中移除該項,是因為系統(tǒng)要通過移除該項來釋放內存。 Underused = 3, // 從緩存移除該項的原因是與之關聯(lián)的緩存依賴項已更改。 DependencyChanged = 4, }

委托的各個參數(shù)的含義以及移除原因,在注釋中都有明確的解釋,我也不再重復了。
我想:有很多人知道Cache的Add, Insert方法有這個參數(shù),也知道有這個委托,但是,它們有什么用呢? 在后面的二個小節(jié)中,我將提供二個示例來演示這一強大的功能。

通常,我們會以下面這種方式從Cache中獲取結果:

RunOptions options = HttpRuntime.Cache[RunOptionsCacheKey] as RunOptions; if( options == null ) { // 緩存中沒有,則從文件中加載 // .................................. HttpRuntime.Cache.Insert(RunOptionsCacheKey, options, dep); } return options;

這其實也是一個慣用法了:先嘗試從緩存中獲取,如果沒有,則從數(shù)據(jù)源中加載,并再次放入緩存。

為什么會在訪問Cache時返回null呢?答案無非就是二種原因:1. 根本沒有放入Cache,2. 緩存項失效被移除了。
這種寫法本身是沒有問題,可是,如果從數(shù)據(jù)源中加載數(shù)據(jù)的時間較長,情況會怎樣呢?
顯然,會影響后面第一次的訪問請求。您有沒有想過,如果緩存項能一直放在Cache中,那不就可以了嘛。 是的,通常來說,只要您在將一個對象放入Cache時,不指定過期時間,不指定緩存依賴,且設置為永不移除,那么對象確實會一直在Cache中, 可是,過期時間和緩存依賴也很有用哦。如何能二者兼得呢?

與 CacheItemRemovedReason 枚舉不同,此枚舉不包含 Removed 或 Underused 值??筛碌木彺骓検遣豢梢瞥?#xff0c;因而絕不會被 ASP.NET 自動移除,即使需要釋放內存也是如此。

再一次提醒:有時我們確實需要緩存失效這個特性,但是,緩存失效后會被移除。 雖然我們可以讓后續(xù)的請求在獲取不到緩存數(shù)據(jù)時,從數(shù)據(jù)源中加載,也可以在CacheItemRemovedCallback回調委托中, 重新加載緩存數(shù)據(jù)到Cache中,但是在數(shù)據(jù)的加載過程中,Cache并不包含我們所期望的緩存數(shù)據(jù),如果加載時間越長,這種【空缺】效果也會越明顯。?這樣會影響(后續(xù)的)其它請求的訪問。為了保證讓我們所期望的緩存數(shù)據(jù)能夠一直存在于Cahce中,且仍有失效機制,我們可以使用【移除前通知】功能。

巧用緩存項的移除通知 實現(xiàn)【延遲操作】

我看過一些ASP.NET的書,也看過一些人寫的關于Cache方面的文章,基本上,要么是一帶而過,要么只是舉個毫無實際意義的示例。 可惜啊,這么強大的特性,我很少見到有人把它用起來。

今天,我就舉個有實際意義的示例,再現(xiàn)Cache的強大功能!

我有這樣一個頁面,可以讓用戶調整(上下移動)某個項目分支記錄的上線順序:

當用戶需要調整某條記錄的位置時,頁面會彈出一個對話框,要求輸入一個調整原因,并會發(fā)郵件通知所有相關人員。

由于界面的限制,一次操作(點擊上下鍵頭)只是將一條記錄移動一個位置,當要對某條記錄執(zhí)行跨越多行移動時,必須進行多次移動。 考慮到操作的方便性以及不受重復郵件的影響,程序需要實現(xiàn)這樣一個需求: 頁面只要求輸入一次原因便可以對一條記錄執(zhí)行多次移動操作,并且不要多次發(fā)重復郵件,而且要求將最后的移動結果在郵件中發(fā)出來。

這個需求很合理,畢竟誰都希望操作簡單。

那么如何實現(xiàn)這個需求呢?這里要從二個方面來實現(xiàn),首先,在頁面上我們應該要完成這個功能,對一條記錄只彈一次對話框。 由于頁面與服務端的交互全部采用Ajax方式進行(不刷新),狀態(tài)可以采用JS變量來維持,所以這個功能在頁面中是很容易實現(xiàn)。 再來看一下服務端,由于服務端并沒有任何狀態(tài),當然也可以由頁面把它的狀態(tài)傳給服務端,但是,哪次操作是最后一次呢? 顯然,這是無法知道的,最后只能修改需求,如果用戶在2分鐘之內不再操作某條記錄時,便將最近一次操作視為最后一次操作。

基于新的需求,程序必須記錄用戶的最近一次操作,以便在2分鐘不操作后,發(fā)出一次郵件,但要包含第一次輸入的原因, 還應包含最后的修改結果哦。

該怎么實現(xiàn)這個需求呢? 我立即就想到了ASP.NET Cache,因為我了解它,知道它能幫我完成這個功能。下面我來說說在服務端是如何實現(xiàn)的。

整個實現(xiàn)的思路是:
1. 客戶端頁面還是每次將記錄的RowGuid, 調整方向,調整原因,這三個參數(shù)發(fā)到服務端。
2. 服務端在處理完順序調整操作后,將要發(fā)送的郵件信息Insert到Cache中,同時提供slidingExpiration和onRemoveCallback參數(shù)。
3. 在CacheItemRemovedCallback回調委托中,忽略CacheItemRemovedReason.Removed的通知,如果是其它的通知,則發(fā)郵件。

為了便于理解,我特意為大家準備了一個示例。整個示例由三部分組成:一個頁面,一個JS文件,服務端代碼。先來看頁面代碼:?

頁面的顯示效果如下:

處理頁面中二個按鈕的JS代碼如下:?

// 用戶輸入的調整記錄的原因 var g_reason = null;$(function(){$("#btnMoveUp").click( function() { MoveRec(-1); } ); $("#btnMoveDown").click( function() { MoveRec(1); } ); }); function MoveRec(direction){ if( ~~($("#spanSequence").text()) + direction < 0 ){ alert("已經不能上移了。"); return; } if( g_reason == null ){ g_reason = prompt("請輸入調整記錄順序的原因:", "由于什么什么原因,我要調整..."); if( g_reason == null ) return; } $.ajax({ url: "/AjaxDelaySendMail/MoveRec.fish", data: { RowGuid: $("#spanRowGuid").text(), Direction: direction, Reason: g_reason }, type: "POST", dataType: "text", success: function(responseText){ $("#spanSequence").text(responseText); } }); }

說明:在服務端,我使用了我在【用Asp.net寫自己的服務框架】那篇博客中提供的服務框架, 服務端的全部代碼是這個樣子的:(注意代碼中的注釋)?

/// <summary> /// 移動記錄的相關信息。 /// </summary> public class MoveRecInfo {public string RowGuid; public int Direction; public string Reason; } [MyService] public class AjaxDelaySendMail { [MyServiceMethod] public int MoveRec(MoveRecInfo info) { // 這里就不驗證從客戶端傳入的參數(shù)了。實際開發(fā)中這個是必須的。 // 先來調整記錄的順序,示例程序沒有數(shù)據(jù)庫,就用Cache來代替。 int sequence = 0; int.TryParse(HttpRuntime.Cache[info.RowGuid] as string, out sequence); // 簡單地示例一下調整順序。 sequence += info.Direction; HttpRuntime.Cache[info.RowGuid] = sequence.ToString(); string key = info.RowGuid +"_DelaySendMail"; // 這里我不直接發(fā)郵件,而是把這個信息放入Cache中,并設置2秒的滑過過期時間,并指定移除通知委托 // 將操作信息放在緩存,并且以覆蓋形式放入,這樣便可以實現(xiàn)保存最后狀態(tài)。 // 注意:這里我用Insert方法。 HttpRuntime.Cache.Insert(key, info, null, Cache.NoAbsoluteExpiration, TimeSpan.FromMinutes(2.0), CacheItemPriority.NotRemovable, MoveRecInfoRemovedCallback); return sequence; } private void MoveRecInfoRemovedCallback(string key, object value, CacheItemRemovedReason reason) { if( reason == CacheItemRemovedReason.Removed ) return; // 忽略后續(xù)調用HttpRuntime.Cache.Insert()所觸發(fā)的操作 // 能運行到這里,就表示是肯定是緩存過期了。 // 換句話說就是:用戶2分鐘再也沒操作過了。 // 從參數(shù)value取回操作信息 MoveRecInfo info = (MoveRecInfo)value; // 這里可以對info做其它的處理。 // 最后發(fā)一次郵件。整個延遲發(fā)郵件的過程就處理完了。 MailSender.SendMail(info); } }

為了能讓JavaScript能直接調用C#中的方法,還需要在web.config中加入如下配置:

<httpHandlers><add path="*.fish" verb="*" validate="false" type="MySimpleServiceFramework.AjaxServiceHandler"/> </httpHandlers>

好了,示例代碼就是這些。如果您有興趣,可以在本文的結尾處下載這些示例代碼,自己親自感受一下利用Cache實現(xiàn)的【延遲處理】的功能。

其實這種【延遲處理】的功能是很有用的,比如還有一種適用場景:有些數(shù)據(jù)記錄可能需要頻繁更新,如果每次更新都去寫數(shù)據(jù)庫,肯定會對數(shù)據(jù)庫造成一定的壓力,?但由于這些數(shù)據(jù)也不是特別重要,因此,我們可以利用這種【延遲處理】來將寫數(shù)據(jù)庫的時機進行合并處理, 最終我們可以實現(xiàn):將多次的寫入變成一次或者少量的寫入操作,我稱這樣效果為:延遲合并寫入

這里我就對數(shù)據(jù)庫的延遲合并寫入提 供一個思路:將需要寫入的數(shù)據(jù)記錄放入Cache,調用Insert方法并提供slidingExpiration和onRemoveCallback參 數(shù), 然后在CacheItemRemovedCallback回調委托中,模仿我前面的示例代碼,將多次變成一次。不過,這樣可能會有一個問題:如果數(shù)據(jù)是一 直在修改,那么就一直不會寫入數(shù)據(jù)庫。 最后如果網站重啟了,數(shù)據(jù)可能會丟失。如果擔心這個問題,那么,可以在回調委托中,遇到CacheItemRemovedReason.Removed 時,使用計數(shù)累加的方式,當?shù)竭_一定數(shù)量后, 再寫入數(shù)據(jù)庫。比如:遇到10次CacheItemRemovedReason.Removed我就寫一次數(shù)據(jù)庫,這樣就會將原來需要寫10次的數(shù)據(jù)庫操 作變成一次了。 當然了,如果是其它移除原因,寫數(shù)據(jù)庫總是必要的。注意:對于金額這類敏感的數(shù)據(jù),絕對不要使用這種方法。

再補充二點:
1. 當CacheItemRemovedCallback回調委托被調用時,緩存項已經不在Cache中了。
2. 在CacheItemRemovedCallback回調委托中,我們還可以將緩存項重新放入緩存。
有沒有想過:這種設計可以構成一個循環(huán)?如果再結合參數(shù)slidingExpiration便可實現(xiàn)一個定時器的效果。

關于緩存的失效時間,我要再提醒一點:通過absoluteExpiration, slidingExpiration參數(shù)所傳入的時間,當緩存時間生效時,緩存對象并不會立即移除,?ASP.NET Cache大約以20秒的頻率去檢查這些已過時的緩存項。

巧用緩存項的移除通知 實現(xiàn)【自動加載配置文件】

在本文的前部分的【文件依賴】小節(jié)中,有一個示例演示了:當配置文件更新后,頁面可以顯示最新的修改結果。 在那個示例中,為了簡單,我直接將配置參數(shù)放在Cache中,每次使用時再從Cache中獲取。 如果配置參數(shù)較多,這種做法或許也會影響性能,畢竟配置參數(shù)并不會經常修改,如果能直接訪問一個靜態(tài)變量就能獲取到,應該會更快。 通常,我們可能會這樣做:

private static RunOptions s_RunOptions;public static RunOptions RunOptions {// s_RunOptions 的初始化放在Init方法中了,會在Global.asax的Application_Start事件中調用。get { return s_RunOptions; } } public static RunOptions LoadRunOptions() { string path = Path.Combine(AppDataPath, "RunOptions.xml"); return RwConfigDemo.XmlHelper.XmlDeserializeFromFile<RunOptions>(path, Encoding.UTF8); }

但是,這種做法有一缺點就是:不能在配置文件更新后,自動加載最新的配置結果。

為了解決這個問題,我們可以使用Cache提供的文件依賴以及移除通知功能。 前面的示例演示了移除后通知功能,這里我再演示一下移除前通知功能。
說明:事實上,完成這個功能,可以仍然使用移除后通知,只是移除前通知我還沒有演示,然而,這里使用移除前通知并沒有顯示它的獨有的功能。

下面的代碼演示了在配置文件修改后,自動更新運行參數(shù)的實現(xiàn)方式:(注意代碼中的注釋)

private static int s_RunOptionsCacheDependencyFlag = 0;public static RunOptions LoadRunOptions() {string path = Path.Combine(AppDataPath, "RunOptions.xml"); // 注意啦:訪問文件是可能會出現(xiàn)異常。不要學我,我寫的是示例代碼。 RunOptions options = RwConfigDemo.XmlHelper.XmlDeserializeFromFile<RunOptions>(path, Encoding.UTF8); int flag = System.Threading.Interlocked.CompareExchange(ref s_RunOptionsCacheDependencyFlag, 1, 0); // 確保只調用一次就可以了。 if( flag == 0 ) { // 讓Cache幫我們盯住這個配置文件。 CacheDependency dep = new CacheDependency(path); HttpRuntime.Cache.Insert(RunOptionsCacheKey, "Fish Li", dep, Cache.NoAbsoluteExpiration, Cache.NoSlidingExpiration, RunOptionsUpdateCallback); } return options; } public static void RunOptionsUpdateCallback( string key, CacheItemUpdateReason reason, out object expensiveObject, out CacheDependency dependency, out DateTime absoluteExpiration, out TimeSpan slidingExpiration) { // 注意哦:在這個方法中,不要出現(xiàn)【未處理異?!?#xff0c;否則緩存對象將被移除。 // 說明:這里我并不關心參數(shù)reason,因為我根本就沒有使用過期時間 // 所以,只有一種原因:依賴的文件發(fā)生了改變。 // 參數(shù)key我也不關心,因為這個方法是【專用】的。 expensiveObject = "http://www.cnblogs.com/fish-li/"; dependency = new CacheDependency(Path.Combine(AppDataPath, "RunOptions.xml")); absoluteExpiration = Cache.NoAbsoluteExpiration; slidingExpiration = Cache.NoSlidingExpiration; // 重新加載配置參數(shù) s_RunOptions = LoadRunOptions(); }

改動很小,只是LoadRunOptions方法做了修改了而已,但是效果卻很酷。

還記得我在上篇博客【在.net中讀寫config文件的各種方法】的結尾處留下來的問題嗎? 這個示例就是我的解決方案。

文件監(jiān)視技術的選擇

對于文件監(jiān)視,我想有人或許會想到FileSystemWatcher。正好我就來說說關于【文件監(jiān)視技術】的選擇問題。
說明,本文所有結論均為我個人的觀點,僅供參考。

這個組件,早在做WinForm開發(fā)時就用過了,對它也是印象比較深的。
它有一個包裝不好的地方是:事件會重復發(fā)出。比如:一次文件的保存操作,它卻引發(fā)了二次事件。
什么,你不信? 正好,我還準備了一個示例程序。

說明:圖片中顯示了發(fā)生過二次事件,但我只是在修改了文件后,做了一次保存操作而已。 本文的結尾處有我的示例程序,您可以自己去試一下。這里為了方便,還是貼出相關代碼:?

private void Form1_Shown(object sender, EventArgs e) {this.fileSystemWatcher1.Path = Environment.CurrentDirectory; this.fileSystemWatcher1.Filter = "RunOptions.xml"; this.fileSystemWatcher1.NotifyFilter = System.IO.NotifyFilters.LastWrite; this.fileSystemWatcher1.EnableRaisingEvents = true; } private void fileSystemWatcher1_Changed(object sender, System.IO.FileSystemEventArgs e) { string message = string.Format("{0} {1}.", e.Name, e.ChangeType); this.listBox1.Items.Add(message); }

對于這個類的使用,只想說一點:會引發(fā)的事件很多,因此一定要注意過濾。以下引用MSDN的一段說明:

Windows 操作系統(tǒng)在 FileSystemWatcher 創(chuàng)建的緩沖區(qū)中通知組件文件發(fā)生更改。如果短時間內有很多更改,則緩沖區(qū)可能會溢出。這將導致組件失去對目錄更改的跟蹤,并且它將只提供一般性通知。使用 InternalBufferSize 屬性來增加緩沖區(qū)大小的開銷較大,因為它來自無法換出到磁盤的非頁面內存,所以應確保緩沖區(qū)大小適中(盡量小,但也要有足夠大小以便不會丟失任何文件更改 事件)。若要避免緩沖區(qū)溢出,請使用 NotifyFilter 和 IncludeSubdirectories 屬性,以便可以篩選掉不想要的更改通知。

幸運的是,ASP.NET Cache并沒有使用這個組件,我們不用擔心文件依賴而引發(fā)的重復操作問題。 它直接依賴于webengine.dll所提供的API,因此,建議在ASP.NET應用程序中,優(yōu)先使用Cache所提供的文件依賴功能。

各種緩存方案的共存

ASP.NET Cache是一種緩存技術,然而,我們在ASP.NET程序中還可以使用其它的緩存技術, 這些不同的緩存也各有各自的長處。由于ASP.NET Cache不能提供對外訪問能力,因此,它不可能取代以memcached為代表的分布式緩存技術, 但它由于是不需要跨進程訪問,效率也比分布式緩存的速度更快。如果將ASP.NET Cache設計成【一級緩存】, 分布式緩存設計成【二級緩存】,就像CPU的緩存那樣,那么將能同時利用二者的所有的優(yōu)點,實現(xiàn)更完美的功能以及速度。

其實緩存是沒有一個明確定義的技術,一個static變量也是一個緩存,一個static集合就是一個緩存容器了。 這種緩存與ASP.NET Cache相比起來,顯然static變量的訪問速度會更快,如果static集合不是設計得很差的話, 并發(fā)的沖突也可能會比ASP.NET Cache小,也正是因為這一點,static集合也有著廣泛的使用。 然而,ASP.NET Cache的一些高級功能,如:過期時間,緩存依賴(包含文件依賴),移除通知,也是static集合不具備的。 因此,合理地同時使用它們,會讓程序有著最好的性能,也同時擁有更強大的功能。

轉載于:https://www.cnblogs.com/xhety/p/3986782.html

總結

以上是生活随笔為你收集整理的ASP.NET 缓存技术分析的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

九九热免费精品视频 | 狠狠色狠狠色 | 亚洲精品午夜aaa久久久 | 国产精品九九久久久久久久 | 日韩久久网站 | 久久精品99北条麻妃 | 久久九九影视 | 激情久久伊人 | 99精品视频在线免费观看 | 国产理论一区二区三区 | 日韩大片在线观看 | 成人午夜免费剧场 | 免费看黄20分钟 | 97国产电影 | 狠狠色免费 | 中文字幕乱码电影 | 亚洲精品乱码久久久久久久久久 | 久久免费成人网 | 日韩欧美精品一区二区三区经典 | 黄色免费在线视频 | 日韩在线观看网址 | 久久精彩视频 | 在线视频一区观看 | 日日骑| 欧美日韩久| 成人91在线观看 | 欧美激情精品久久久久久 | 国产69精品久久久久9999apgf | 中文字幕av网站 | 国产精品美女久久久久久 | www.香蕉视频| 在线播放国产精品 | 久久久久日本精品一区二区三区 | 欧美另类xxxxx | 91麻豆精品国产91久久久久久久久 | 91视频啊啊啊 | 色五月激情五月 | 91成人区| 欧美xxxxx在线视频 | 天天爱天天操天天爽 | 久久免费试看 | 99在线免费视频观看 | av中文字幕在线播放 | 91精品系列 | 婷婷日 | 国产精品免费在线播放 | 香蕉视频在线播放 | 综合网欧美 | 久久色中文字幕 | 日韩r级电影在线观看 | 亚洲资源一区 | 中文字幕一区二区三区久久 | 免费视频一区二区 | 精品免费99久久 | 久久久久综合精品福利啪啪 | 色噜噜日韩精品一区二区三区视频 | 日韩av网站在线播放 | 在线亚洲午夜片av大片 | 四虎成人免费影院 | 日韩三级.com| 中文字幕综合在线 | 91人人澡人人爽人人精品 | 日韩肉感妇bbwbbwbbw | 国产黄影院色大全免费 | 色www免费视频 | 免费国产一区二区视频 | 在线观看中文 | 99热九九这里只有精品10 | 久久免费公开视频 | 成片视频免费观看 | 久久国产剧场电影 | 久久天天躁狠狠躁亚洲综合公司 | 怡红院av久久久久久久 | 日韩久久精品一区二区三区 | 在线免费试看 | 91九色网站| 狠狠狠干狠狠 | 日韩99热 | 成人午夜影院 | 伊人天天狠天天添日日拍 | 激情综合网色播五月 | 狠狠网站 | 久久第四色 | 五月婷婷综 | 欧美日韩观看 | 7777精品伊人久久久大香线蕉 | 亚洲精品高清一区二区三区四区 | 欧美日韩天堂 | 欧美三级在线播放 | 精品久久一区二区三区 | 在线观看色视频 | 日韩av福利在线 | av在线免费在线 | 91视频三区 | 在线观看完整版 | 国产日韩精品一区二区三区在线 | 国产日韩精品一区二区在线观看播放 | 91精品婷婷国产综合久久蝌蚪 | 韩日精品视频 | 亚洲欧洲一区二区在线观看 | 亚洲婷婷综合色高清在线 | 久久综合欧美 | 国产午夜视频在线观看 | 国产精品一区二区久久精品爱涩 | 亚洲成人黄色在线观看 | 国产视频导航 | 国产九九九视频 | 在线亚洲激情 | 日韩成人精品一区二区 | 久热免费在线观看 | 免费日韩 精品中文字幕视频在线 | 亚洲一区日韩在线 | 91刺激视频| 免费福利片2019潦草影视午夜 | 亚洲精选在线观看 | 免费99| 91一区在线观看 | 国产精品久久久久一区 | 国产成人综合在线观看 | 久久免费视频99 | 中文av在线播放 | 国产美女精品 | 人人澡人人草 | 最近中文字幕国语免费高清6 | 黄色资源在线观看 | 狠狠狠色丁香婷婷综合久久88 | 国产传媒一区在线 | 欧美国产大片 | 日韩免费区 | 亚洲国产欧美在线人成大黄瓜 | 天天av天天 | 国产色视频123区 | 91精品久久久久久久久 | 久久亚洲私人国产精品va | 永久免费毛片在线观看 | 亚洲精品小视频在线观看 | 欧美一区二区三区在线 | 97福利在线观看 | 国产在线999 | www.夜色321.com | 成人黄色小说在线观看 | 久久婷婷视频 | 色综合久久久久综合 | 亚洲永久精品在线 | 中文字幕在线视频国产 | 欧美成人一区二区 | 摸阴视频 | 久久香蕉国产 | 黄色aaa级片| 亚洲国产中文字幕在线观看 | 精品国产区 | 91精品蜜桃| 在线成人看片 | 亚洲精品乱码久久久久v最新版 | 天堂va在线观看 | 一区二区三区国产精品 | 国产精品中文 | a色视频 | 在线观看av大片 | 国产精品美女久久 | 综合精品在线 | 日本中文字幕网站 | 日韩欧美在线中文字幕 | 欧美日韩在线免费视频 | 欧美日韩国产精品爽爽 | 午夜精品一区二区三区在线视频 | 四虎影视精品 | 在线观av | 丰满少妇一级片 | 色综合婷婷 | 亚洲视频 视频在线 | 国产色a在线观看 | 天天操天天射天天爱 | 久久免费视频2 | 欧美精品一区在线 | 国产视频精品免费 | 亚洲 欧美 国产 va在线影院 | 在线看片成人 | 久久精品三级 | 国内精品视频一区二区三区八戒 | 国产精品6999成人免费视频 | 一区久久久 | av电影在线免费 | 国产成人久久久久 | 日韩中文字幕免费在线观看 | 久久久男人的天堂 | 精品五月天 | 亚洲欧洲久久久 | 国产精品18久久久久久vr | 久久亚洲成人网 | 四虎永久免费 | 欧美午夜a | 精品999国产| 免费看在线看www777 | www.亚洲视频 | 国产精品久久久av | 最新国产福利 | 97超碰.com| 99精品国产99久久久久久福利 | 亚洲日本中文字幕在线观看 | 久久不卡av| 96亚洲精品久久 | 日韩一二区在线观看 | 天天操天天干天天爽 | 久久视频一区 | 精品久久久免费 | 色婷婷视频在线观看 | 国产福利一区在线观看 | 狠狠躁夜夜躁人人爽视频 | 色婷婷成人网 | 51久久成人国产精品麻豆 | 久久婷婷综合激情 | 精品国产亚洲在线 | 欧美日一级片 | 网址你懂的在线观看 | 久久精品视频免费播放 | 97涩涩视频 | 青青草国产成人99久久 | 99视频精品免费视频 | 91九色蝌蚪视频 | 91精品系列| 日韩免费看的电影 | 久久免费中文视频 | 国产正在播放 | 久久国产精品成人免费浪潮 | 国产精品原创av片国产免费 | 日韩偷拍精品 | 91麻豆精品国产91久久久久久 | 免费久久网 | 天天拍天天操 | 不卡电影免费在线播放一区 | 亚洲国产精品成人女人久久 | 日韩电影一区二区三区 | 久久99久国产精品黄毛片入口 | 国产精品美女在线 | 亚洲天天 | 国产在线不卡一区 | 成人片在线播放 | 婷婷性综合 | 亚洲欧美日韩精品一区二区 | 美女黄频视频大全 | 国产一级视频在线观看 | 久久免费电影网 | av在线播放亚洲 | 啪一啪在线 | 天天拍天天操 | 欧美精品少妇xxxxx喷水 | 狠狠操狠狠干2017 | 国产精品午夜久久久久久99热 | 久草电影网 | 胖bbbb搡bbbb擦bbbb | 欧美久久久久久久久久久 | 国产精品一区二区久久精品 | 中文字幕在线观看资源 | 婷婷免费在线视频 | 国产精品视频永久免费播放 | 九九热.com| 中文字幕 国产精品 | 免费人成网 | 激情伊人五月天 | 91传媒91久久久 | 国产精品 亚洲精品 | 在线播放 亚洲 | 最近最新mv字幕免费观看 | 美女在线免费观看视频 | 日韩欧美在线观看一区二区三区 | 免费激情网 | 欧美大荫蒂xxx | 区一区二在线 | 亚a在线 | 在线观看视频一区二区三区 | 视频在线99re | 国内精品久久久久影院一蜜桃 | 久久黄色网 | 韩日电影在线免费看 | 在线播放精品一区二区三区 | 国产精品 中文字幕 亚洲 欧美 | 精品国产99国产精品 | 国产精品 久久 | 看黄色91| 天天综合天天综合 | 欧美激情精品久久久久久变态 | 麻豆91在线播放 | 国产最新在线观看 | 夜色在线资源 | 久久国产精品99久久久久久丝袜 | 99av在线视频 | 视频在线91| 在线看片成人 | 免费国产黄线在线观看视频 | 成人精品久久 | 精品一区二区三区在线播放 | 五月天久久综合 | 国产不卡在线观看 | 中文字幕在线高清 | 热热热热热色 | 国产色爽 | 免费黄色特级片 | 国产69久久久欧美一级 | 久久激情五月激情 | 狠狠色丁香婷婷综合橹88 | 6080yy精品一区二区三区 | 九色91av| 91精品在线播放 | 色黄www小说| 国产一区免费观看 | www色综合 | 欧美国产日韩一区二区 | 国产97在线看| 亚洲va在线va天堂 | 亚洲精品久久视频 | 国产在线观看你懂得 | 黄色免费在线视频 | 三级黄色免费片 | 日韩高清精品一区二区 | 亚洲精品tv久久久久久久久久 | 午夜丰满寂寞少妇精品 | 色综合久久中文综合久久牛 | 国内外成人在线视频 | 一本一本久久a久久精品综合小说 | 国产91精品看黄网站在线观看动漫 | 97超级碰 | 国产精品18久久久久久首页狼 | 国产视频资源 | 日韩三级一区 | 99视频精品 | 亚洲一区av| 国产美女免费 | 国产精品午夜久久久久久99热 | 欧美日韩国语 | 日韩欧美大片免费观看 | 久久少妇免费视频 | 成年人在线电影 | 国产福利资源 | 91成人精品观看 | www.av免费 | 日本bbbb摸bbbb| 91av在线电影 | 国产精品久久久久高潮 | 日韩av在线网站 | 成人黄色电影视频 | 色成人亚洲网 | sesese图片| 西西4444www大胆无视频 | 狠狠狠干狠狠 | 日韩av图片 | 人人干干人人 | 99久久er热在这里只有精品15 | 日韩理论在线观看 | 成 人 黄 色 视频 免费观看 | 欧美一级久久久 | 久久视频在线免费观看 | 一级黄色电影网站 | 丰满少妇在线观看网站 | 91探花在线视频 | 亚洲国内精品在线 | 久草视频免费在线播放 | 黄色网大全| 色婷婷国产精品 | 免费福利在线视频 | 免费在线一区二区三区 | 亚洲黄色在线播放 | 国产精品1000| 毛片基地黄久久久久久天堂 | 国内精品久久久久久久久久久 | 在线观看免费av网 | a v在线视频 | 久久久国产精品电影 | 97香蕉超级碰碰久久免费软件 | 国产精品破处视频 | 国产明星视频三级a三级点| 亚洲精品视频一 | 麻豆视频免费在线播放 | 久久九九免费 | 亚洲精品在线视频播放 | 91女神的呻吟细腰翘臀美女 | 国产污视频在线观看 | 97免费在线观看 | 中文视频一区二区 | 免费黄色网止 | 久久r精品 | 97视频在线观看免费 | 日韩小视频网站 | a级国产乱理伦片在线播放 久久久久国产精品一区 | 亚洲特级毛片 | 又色又爽又黄 | 在线观看自拍 | 18女毛片 | 亚洲黄色区| 九色激情网 | 91久久奴性调教 | 久久一视频 | 亚洲伦理精品 | 人人澡人摸人人添学生av | 欧美一级片在线免费观看 | 97超碰人人澡人人 | 777视频在线观看 | 天天插天天射 | 一区电影| 亚洲国内精品 | 99久高清在线观看视频99精品热在线观看视频 | 国产在线精品二区 | 国产专区欧美专区 | 色婷婷综合久久久中文字幕 | 大荫蒂欧美视频另类xxxx | 国产日韩精品一区二区三区在线 | 亚洲黄色高清 | 99草视频在线观看 | 国产精品资源 | 色婷婷中文 | 人人草人人草 | 91毛片在线| 国产中文字幕视频在线观看 | 超碰在线99 | 日日操网站 | 亚洲一区欧美激情 | 成人影音av | 激情视频在线高清看 | 91九色精品 | 亚洲少妇xxxx | 顶级bbw搡bbbb搡bbbb | 久久久亚洲电影 | 亚洲高清免费在线 | 黄色软件在线观看免费 | 亚洲视频免费在线看 | 免费一级毛毛片 | 国产精品18videosex性欧美 | 国产精品大全 | 伊人久在线 | 国产专区日韩专区 | 日韩欧美电影 | 亚洲精品一区二区在线观看 | 国产麻豆精品久久 | 亚洲美女视频网 | 天干啦夜天干天干在线线 | 91精品综合在线观看 | 中文字幕在线观看国产 | 婷婷精品国产欧美精品亚洲人人爽 | 亚洲第一久久久 | 国产精品 久久 | 美女免费视频观看网站 | 国产成人高清在线 | 国产精品青草综合久久久久99 | 日韩xxxxxxxxx| 亚洲色图激情文学 | 日韩三级视频在线观看 | 密桃av在线 | 一二区电影 | 男女激情网址 | 天天操天天射天天 | 国产99久久久欧美黑人 | 69精品人人人人 | 中文字幕日韩一区二区三区不卡 | 少妇资源站 | 午夜av一区二区三区 | 精品久久久久久久久亚洲 | 色丁香婷婷 | 色七七亚洲影院 | 日韩免费观看视频 | 99久热在线精品视频成人一区 | 亚洲精品国产精品国自产观看浪潮 | 欧美片网站yy | 欧美久久久一区二区三区 | 亚洲一级电影在线观看 | freejavvideo日本免费 | 九九视频在线观看视频6 | 久久婷婷丁香 | 久久久久看片 | 日韩中文字幕免费在线播放 | 午夜精品视频一区 | 在线看黄网站 | 成人在线网站观看 | 精品久操| 久久久午夜剧场 | 在线国产高清 | 中国一级片在线 | 久久手机免费视频 | 中文av影院 | 色噜噜日韩精品一区二区三区视频 | 欧美电影在线观看 | 在线观看播放av | 麻豆视频在线观看免费 | 成人久久 | 黄色成人av | 午夜色婷婷 | av电影亚洲| 91九色蝌蚪国产 | 色天天综合久久久久综合片 | 中文字幕永久免费 | 成人啪啪18免费游戏链接 | 日韩久久久 | 亚洲精品中文在线 | 久久久久久久久久影院 | 91精彩视频 | 天天草天天操 | 久久亚洲电影 | 高清日韩一区二区 | 最新极品jizzhd欧美 | 国产成人1区 | 2021国产视频| 91精品久久久久久综合乱菊 | 天天干 夜夜操 | 亚洲成熟女人毛片在线 | 激情婷婷av | 久久久久久久久久电影 | 日韩成人精品一区二区 | 国产在线a免费观看 | 91人人视频在线观看 | 国产精品久久久久三级 | 最近最新mv字幕免费观看 | 久久99亚洲精品久久久久 | 国产免费一区二区三区网站免费 | 精品国产理论 | 美女黄色网在线播放 | 亚洲电影图片小说 | 婷婷综合国产 | 久久久亚洲影院 | 麻豆影视在线免费观看 | 国产免费av一区二区三区 | 日本黄色免费观看 | 久草在线免费在线观看 | 缴情综合网五月天 | 久久综合射 | 欧美在线91| 波多野结衣久久资源 | 欧美电影黄色 | 18国产精品福利片久久婷 | 日韩a在线 | 国产精品久久久久久久久久妇女 | 亚洲国产视频网站 | 久艹视频在线免费观看 | 五月开心激情网 | 欧美日韩xxxxx | 欧美一进一出抽搐大尺度视频 | 国产精品成人免费一区久久羞羞 | h动漫中文字幕 | 九九久久视频 | 色久综合| 亚洲精品97 | 一级a性色生活片久久毛片波多野 | 特级西西www44高清大胆图片 | 久久超级碰 | 国产精品久久久久久久久久东京 | 天堂在线一区二区 | 久久精品aaa | 国产精品一区二区美女视频免费看 | 三级视频日韩 | 91看毛片 | 成人在线免费看 | 天天干天天干天天干 | 91在线视频导航 | 免费久久99精品国产婷婷六月 | 91视频免费看 | 久久精品女人毛片国产 | 久草视频在线观 | 日韩高清一二三区 | 国产韩国精品一区二区三区 | 国产又黄又硬又爽 | 免费观看性生活大片3 | 国产精品午夜在线 | avsex| 伊人影院得得 | 91黄色免费看 | 天天插日日射 | 性色av一区二区三区在线观看 | 日韩av一区二区在线播放 | 日韩在线观看中文 | 亚洲精品国产精品国自 | 久久激情精品 | 婷婷亚洲五月色综合 | 视频在线亚洲 | 久久久国产电影 | 岛国一区在线 | 免费看黄的 | 不卡av电影在线观看 | 欧美日韩国产伦理 | 狠狠色丁香婷婷综合 | 人人干网 | 欧美最猛性xxxxx免费 | 欧美日韩国产色综合一二三四 | 久久久久久久久久久免费 | 丁香六月五月婷婷 | 国产麻豆视频在线观看 | 久久久久高清毛片一级 | 国产精品久久久区三区天天噜 | 手机在线看片日韩 | 欧美日比视频 | 在线免费精品视频 | 射九九 | a级黄色片视频 | 麻豆视频免费入口 | 久精品一区| 国产精品一区二区在线观看免费 | 日韩av在线网站 | 欧美精品久久久久久久久老牛影院 | 肉色欧美久久久久久久免费看 | 日韩电影在线视频 | www欧美xxxx| 婷婷久草| 国产精品18久久久久久久久久久久 | 国产一级精品在线观看 | 国产成人精品女人久久久 | 中文字幕一区二区三区四区视频 | 久久九九精品 | 成人在线免费视频 | 中文视频在线看 | 免费午夜在线视频 | 在线国产激情视频 | 亚洲在线成人精品 | 免费看搞黄视频网站 | 中文字幕在线国产精品 | 综合天堂av久久久久久久 | av福利在线看 | 免费一级特黄毛大片 | 麻豆一精品传二传媒短视频 | 97精产国品一二三产区在线 | 国产毛片久久 | 久久综合中文色婷婷 | 国产精品99免视看9 国产精品毛片一区视频 | 黄色在线免费观看网站 | 在线免费视频 你懂得 | av观看免费在线 | 国产精品18久久久久vr手机版特色 | 激情综合狠狠 | 久草在线视频资源 | 精品亚洲欧美一区 | 国产成人一二片 | 精品国产_亚洲人成在线 | 91成人免费看片 | 成人动漫精品一区二区 | 国产无套精品久久久久久 | 又污又黄的网站 | 精品久久久久久久久久久久久久久久久久 | 亚洲视频在线免费看 | 天天射天天射天天射 | 在线播放一区二区三区 | 日韩网站免费观看 | 成人毛片一区 | 91av播放| 在线免费中文字幕 | 国产麻豆精品在线观看 | 国产在线a| 黄色特级毛片 | 成人免费观看网址 | 久久国产女人 | 福利在线看片 | 国产手机在线精品 | 亚洲日本va在线观看 | 欧美日本啪啪无遮挡网站 | 少妇视频一区 | 国产中文欧美日韩在线 | 黄色一级大片免费看 | 亚洲高清视频在线观看 | 亚洲黑丝少妇 | 91九色蝌蚪国产 | 99视频在线看 | 91精品爽啪蜜夜国产在线播放 | 精品在线不卡 | 午夜三级理论 | www日| 精品美女久久久久久免费 | 久热电影 | 99视频久久| 日韩高清无线码2023 | 国产亚洲精品无 | 免费成视频 | 成人国产精品免费 | 97色资源| 国产分类视频 | 在线午夜 | 免费高清在线观看电视网站 | 久久午夜国产精品 | av电影中文字幕 | 久久精品视频中文字幕 | 国内99视频 | 美女黄网站视频免费 | 亚洲人成人在线 | 狠狠躁日日躁狂躁夜夜躁 | 一级片视频在线 | av亚洲产国偷v产偷v自拍小说 | 亚洲国产影院av久久久久 | 中文字幕在线观看2018 | 日本电影黄色 | 国产日韩三级 | 日韩在线一级 | www.天堂av | 天天视频亚洲 | 久久国产a | 亚洲成人中文在线 | 色姑娘综合网 | 白丝av免费观看 | 久久久久久久久久网 | 亚洲人成人99网站 | 91亚洲视频在线观看 | 亚洲综合涩 | 日韩三区在线观看 | 久久久电影网站 | 日韩在线观看小视频 | 亚洲精品乱码久久久久v最新版 | 天天综合区| 日韩欧美极品 | 人人玩人人添人人澡超碰 | 中文字幕欲求不满 | 97视频免费播放 | 久久99热精品 | 97视频免费在线观看 | 日本不卡久久 | 制服丝袜天堂 | 国产明星视频三级a三级点| 国产精品中文在线 | 久草国产在线 | 日韩在线视频播放 | 国产一级特黄毛片在线毛片 | 成人免费在线播放 | 丁香 久久 综合 | 欧美成人h版在线观看 | 激情综合色综合久久综合 | 中文字幕韩在线第一页 | 久久久国产99久久国产一 | a久久久久| 99热这里只有精品在线观看 | 免费视频久久久久 | 久久经典国产视频 | 日韩久久精品一区二区三区 | 午夜10000 | 久久精品视频播放 | 九九精品视频在线观看 | 超碰成人免费电影 | 中文字幕91 | 日韩欧美在线视频一区二区三区 | 综合色在线观看 | 免费 在线 中文 日本 | 亚洲草视频 | 开心激情五月网 | 免费瑟瑟网站 | 91大神电影 | 激情视频免费在线观看 | 久久午夜精品 | 69精品视频 | 亚洲黄色在线 | 在线观看视频精品 | 日韩精品视频免费专区在线播放 | www.99av| 国产91精品高清一区二区三区 | 亚洲日本韩国一区二区 | 五月婷婷网站 | 国产精品18久久久久久久久久久久 | 久久久久久激情 | 色婷婷久久久 | 五月天中文字幕 | 黄色网址国产 | 日批网站在线观看 | 久久精品老司机 | 日韩成人精品一区二区三区 | av夜夜操 | 国产自偷自拍 | 天天爱天天插 | 亚洲好视频| 日日爽 | 91精品久久久久久久91蜜桃 | 欧美一级在线观看视频 | 国产成人av片| 91在线精品一区二区 | 99久久这里有精品 | 成人网在线免费视频 | 在线观看国产亚洲 | www.久久久.cum | av电影亚洲 | 日本精品视频一区 | 香蕉在线视频观看 | 蜜臀av性久久久久蜜臀aⅴ四虎 | 久久久午夜视频 | 9999国产| 特级a毛片 | 国产尤物视频在线 | 青青草国产精品 | 久久精品国产一区二区三区 | 欧美精品亚洲精品 | 日韩欧美视频在线观看免费 | 国产一区视频免费在线观看 | 麻花豆传媒mv在线观看网站 | 五月天色综合 | 国产一级黄色片免费看 | 欧美成年人在线视频 | 成人黄大片视频在线观看 | 欧美成人黄| 国产 字幕 制服 中文 在线 | 天天操天天射天天舔 | 国产精品一区二区三区在线免费观看 | 久久久 精品 | 国产一级片直播 | av五月婷婷 | 免费久草视频 | 涩涩网站在线观看 | 国产破处视频在线播放 | 91香蕉视频720p | 伊人一级 | 一本之道乱码区 | 啪嗒啪嗒免费观看完整版 | 亚洲综合视频在线 | 毛片基地黄久久久久久天堂 | 女人18精品一区二区三区 | 亚洲砖区区免费 | 最近免费观看的电影完整版 | 久草免费福利在线观看 | 国产精品午夜久久久久久99热 | 亚洲日本黄色 | 欧美色插| 日韩高清一区二区 | 在线观看a视频 | 日韩精品久久久久久 | 色干干| 天天艹天天干天天 | 国产精品精品久久久 | 亚洲成年人在线播放 | 日韩久久电影 | av成人免费观看 | 亚洲成人一区 | 国产又粗又猛又爽又黄的视频先 | 午夜丁香网 | 丰满少妇一级 | 超碰97久久 | www.国产视频| 亚洲国产欧洲综合997久久, | 一本一本久久a久久精品综合妖精 | 中文久草 | 国产美女视频免费观看的网站 | 久久一视频 | 欧美激情精品久久久久久免费 | 国产精品久久久久久一区二区三区 | 国产 视频 久久 | 中文字幕免费播放 | 免费视频黄色 | 亚洲天堂网视频在线观看 | 米奇影视7777 | 亚洲成a人片综合在线 | 美女性爽视频国产免费app | www在线观看国产 | 91完整版观看 | 中文字幕色在线 | 免费在线观看不卡av | 在线观看亚洲精品 | 99热高清| 在线视频91 | 亚洲精品看片 | 99久久精品日本一区二区免费 | 在线看不卡av | 亚洲区二区 | 国产亚洲精品久久19p | 国产亚洲精品久久久久久久久久久久 | 麻豆一二| 国产小视频免费观看 | 国产精品乱码久久 | 这里只有精品视频在线观看 | 中文字幕av免费 | 久久成人免费 | 免费在线播放视频 | 天天干 天天摸 天天操 | 精品主播网红福利资源观看 | 有码一区二区三区 | 久久成人一区 | 在线亚洲午夜片av大片 | 小草av在线播放 | av久久在线 | 日韩欧美一区二区三区黑寡妇 | 99久久久久| 国产精品美女久久久久久久久 | 人人爽人人澡 | 在线电影 一区 | av免费看看| 免费成人黄色av | 992tv在线观看| 丝袜美腿在线播放 | 69久久99精品久久久久婷婷 | 色天天中文 | 久久久亚洲精品 | 91在线免费视频 | 免费高清无人区完整版 | 丁香花在线视频观看免费 | 国产 视频 高清 免费 | 成人午夜在线电影 | 欧美一区中文字幕 | 狠狠的操狠狠的干 | 黄色毛片在线看 | 涩五月婷婷 | 六月丁香激情网 | 免费国产ww | 99精品国产成人一区二区 | 国产成人久久精品 | 久久黄页 | 婷婷丁香六月天 | 国产一级黄色免费看 | 免费在线一区二区三区 | 99久久夜色精品国产亚洲 | 色网免费观看 | 99热这里有精品 | 国产美女精品久久久 | 97成人精品区在线播放 | 最新国产中文字幕 | 婷婷国产在线 | 久久www免费视频 | 99久久久久| 国产麻豆剧果冻传媒视频播放量 | 高清不卡免费视频 | 国产在线自 | 中文欧美字幕免费 | 婷婷五天天在线视频 | 国产成人一区二区三区在线观看 | 亚洲一区二区三区在线看 | 国产成人精品女人久久久 | 极品嫩模被强到高潮呻吟91 | 国产视频在线免费观看 | 日韩电影精品一区 | 瑞典xxxx性hd极品 | 国产精品美女 | a在线视频v视频 | 特级西西444www高清大视频 | 免费看黄电影 | 精品成人a区在线观看 | 国产精品久久久久久影院 | 999久久a精品合区久久久 | 欧美亚洲精品一区 | 激情综合色综合久久 | 久久久午夜剧场 | 天天躁日日躁狠狠躁av中文 | 国产伦精品一区二区三区照片91 | 四虎永久免费 | 成人午夜剧场在线观看 | av片在线看 | 二区三区中文字幕 | 九九久久婷婷 | 国产精品久久久久久久7电影 | 日日爱av | 欧美aaa大片| 亚洲香蕉视频 | 久久精品三级 | 亚洲丝袜一区 | 久久国产电影 | 中文字幕在线观看一区二区 | 国产夫妻自拍av | 欧美日韩精品区 | 久久伊人热 | av丝袜在线 | 国产分类视频 | 麻豆免费在线播放 | 久久久一本精品99久久精品66 | www.com黄 | av黄色在线播放 | www.在线看片.com | 亚洲婷婷伊人 | 国产va在线 | 免费在线国产精品 | av成人动漫在线观看 | 97精品一区 | 九九视频免费观看视频精品 | 国产日韩视频在线播放 | 国产中文字幕网 | 天堂av网站| 激情久久五月 | 在线黄色免费av | 亚在线播放中文视频 | 久久婷婷一区二区三区 | 成人免费观看网站 | 欧美成人aa | 狠狠干天天 | 天海翼一区二区三区免费 | 国产色就色 | 国产在线欧美日韩 | 久久99电影 | 国产在线视频在线观看 | 992tv在线观看网站 | 国产精品av久久久久久无 | 超碰97在线看| 国产精品视频永久免费播放 | 一区二区视频在线免费观看 | 日日爽夜夜爽 | av中文天堂在线 | 亚洲一级电影视频 | 精品三级av | 国产在线观看91 | 日韩手机视频 | 日韩欧美高清一区二区 | 啪啪精品 | 国产日本在线观看 | 在线观看成人福利 | 最近中文字幕mv | 又黄又爽又刺激 | 91麻豆精品国产91久久久使用方法 | 黄a网| 69国产成人综合久久精品欧美 | 欧美一级视频免费 | 在线视频免费观看 | 国产乱码精品一区二区三区介绍 | 久久精品一区二区三区视频 | 日韩免费小视频 | www色网站| 波多野结衣一区二区三区中文字幕 | 久久在视频 |