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

ASP.NET Cache的一些總結

開發 后端
在Web應用程序中的使用緩存位置主要有:客戶端瀏覽器緩存、客戶端和服務器中以及服務器端,因此緩存可以分為以下幾類:

摘要

最近我們的系統面臨著嚴峻性能瓶頸問題,這是由于訪問量增加,客戶端在同一時間請求增加,這迫使我們要從兩個方面解決這一問題,增加硬件和提高系統的性能。

大家可以通過各種各樣的方法去優化我們系統,本篇博文將介紹通過Cache方法來優化系統的性能,減輕系統的負擔。

正文

不同位置的緩存

在Web應用程序中的使用緩存位置主要有:客戶端瀏覽器緩存、客戶端和服務器中以及服務器端,因此緩存可以分為以下幾類:

客戶端緩存(Client Caching);代理緩存(Proxy Caching);反向代理緩存(Reverse Proxy Caching);服務器緩存(Web Server Caching)

#p#

ASP.NET中的緩存

ASP.NET中有兩種緩存類型:輸出緩存數據緩存

輸出緩存:這是最簡單的緩存類型,它保存發送到客戶端的頁面副本,當下一個客戶端發送相同的頁面請求時,此頁面不會重新生成(在緩存有限期內),而是從緩存中獲取該頁面;當然由于緩存過期或被回收,這時頁面會重新生成。

數據緩存

除此之外,還有兩個特殊的緩存:片段緩存數據源緩存

片段緩存:這是一種特殊的輸出緩存,它不是緩存整個頁面,而是緩存部分頁面;由于緩存整個頁面通常并不可行,因為頁面的某些部分是針對用戶定制的(例如用戶登陸信息),但我們可以把應用程序中共享的部分進行緩存,這時我們可以考慮使用片段緩存和用戶控件緩存。

數據源緩存:是建立在數據源控件的緩存,它包括SqlDataSource、ObjectDataSource和XmlDataSource控件。數據源緩存使用數據緩存方式,不同的是我們不需要通過顯示方法處理緩存;我們只需設置相應的屬性,然后數據源控件就能存儲和檢索數據。

#p#

輸出緩存

輸出緩存可以把最終呈現的頁面緩存起來,當客戶端再次請求同一頁面時,控制對象不再重新創建,頁面的生命周期不再啟動,無需再次執行代碼,通過在緩存中獲取緩存的頁面。

現在我們設計一個頁面,每當用戶發送頁面請求時,就獲取當前代碼執行的時間,然后顯示在頁面上。

[[82354]]

圖1輸出緩存

這是再簡單不過的例子,每當用戶發送頁面請求都會更新頁面顯示的時間,這是由于每次請求都獲取了一個新的頁面,實際情況中,我們并不需要實時的響應用戶每個頁面請求,我們可以通過輸出緩存把頁面緩存起來每當用戶發送同一頁面請求時,而且在緩存有效期間,可以通過輸出緩存把緩存的頁面返回給用戶。

我們要實現輸出緩存,只需在頁面中添加如下代碼:

  1. <!-- Adds OutputCache directive --> 
  2. <%@ OutputCache Duration="23" VaryByParam="None" %> 

它支持五個屬性,其中兩個屬性Duration和VaryByParam是必填的

表1輸出緩存屬性

這里我們把輸出緩存的有效期設置為23秒,也就是說,當緩存超過有效期就會被回收;當用戶再次請求該頁面時,就要重新創建頁面。

客戶端緩存

另一種選擇是客戶端緩存,如果用戶在瀏覽器中點擊“后退”按鈕或在地址欄中重新輸入URL,那么在這種情況下,瀏覽器將從緩存獲取頁面;然而,如果用戶點擊“刷新”按鈕,那么瀏覽器中緩存將失效,瀏覽器發送頁面請求。

如果我們要使用客戶端緩存,只需指定OutputCache中的屬性Location=”Client”就OK了,具體代碼如下所示:

  1. <!-- Sets client OutputCache --> 
  2. <%@ OutputCache Duration="23" VaryByParam="None" Location="Client" %> 

通過在OutputCache中添加Location屬性,我們實現了客戶端緩存,通過設置客戶端緩存我們能夠減少的客戶端請求,也許有人會問:“每個用戶***次頁面請求都需要服務器來完成,這不能很好的減少服務的壓力”。的確是這樣,相對于服務器緩存,客戶端緩存并沒有減少代碼的執行和數據庫的操作,但是當我們把包含個性化數據的頁面緩存在服務器中,客戶端請求頁面時,由于不同的用戶個性化數據不同,這將會導致請求出現錯誤,所以我們可以使用片段緩存把公用的部分緩存起來或客戶端緩存把用戶信息緩存起來。

#p#

Query String緩存

在前面的例子中,我們把OutputCache中的VaryByParam屬性設置為None,那么ASP.NET程序只緩存一個頁面副本;如果頁面請求包含查詢參數,那么在緩存的有效期內,我們只可以查看到只是緩存結果,假設我們有個報表程序,它提供用戶根據產品名稱查詢相關的產品信息。

首先我們創建兩個頁面:查詢和結果頁面,由于時間關系我們已經把頁面設計好了,具體如下所示:

cahce1

cache2圖2報表程序

首先我們提供查詢頁面,讓用戶根據成品名稱(ProductName)查詢相應的成品信息,具體的代碼如下:

  1. protected void Page_Load(object sender, EventArgs e)  
  2. {  
  3.     if (!Page.IsPostBack)  
  4.     {  
  5.         // Gets product id from table Production.Product.  
  6.         // Then binding data to drop down list control.  
  7.         InitControl(GetProductId());  
  8.     }  
  9. }  
  10. /// <summary>  
  11. /// Handles the Click event of the btnSubmit control.  
  12. /// Redirects to relative product information page.  
  13. /// </summary>  
  14. protected void btnSubmit_Click(object sender, EventArgs e)  
  15. {  
  16.     Response.Redirect(string.Format("Product.aspx?productname={0}", ddlProductName.SelectedValue));  

當用戶點擊Submit按鈕后,跳轉到Product頁面并且在Url中傳遞查詢參數——產品名稱(ProducName)。

接下來,我們繼續完成查詢頁面,由于在前一頁面中傳遞了查詢參數ProductName,那么我們將根據ProductName查詢數據庫獲取相應的產品信息,具體代碼如下所示:

  1. protected void Page_Load(object sender, EventArgs e)  
  2. {  
  3.     // Get product name.  
  4.     string productName = Request.QueryString["productname"];  
  5.  
  6.     // Binding data to data grid view control.  
  7.     InitControl(this.GetData(productName));  
  8. }  
  9.  
  10. /// <summary>  
  11. /// Inits the control.  
  12. /// </summary>  
  13. /// <param name="ds">The dataset.</param>  
  14. private void InitControl(DataSet ds)  
  15. {  
  16.     dgvProduct.DataSource = ds;  
  17.     dgvProduct.DataBind();  
  18. }  
  19.  
  20. /// <summary>  
  21. /// Gets the data.  
  22. /// </summary>  
  23. /// <param name="productName">Name of the product.</param>  
  24. /// <returns>Returns dataset</returns>  
  25. private DataSet GetData(string productName)  
  26. {  
  27.     // The query sql base on product name.  
  28.     string sql =   
  29.         string.Format(  
  30.         "SELECT Name, ProductNumber, SafetyStockLevel, ReorderPoint, StandardCost, DaysToManufacture " 
  31.         + "FROM Production.Product WHERE ProductNumber='{0}'",  
  32.         productName);  
  33.  
  34.     // Get data from table Production.Product.  
  35.     using (var con = new SqlConnection(ConfigurationManager.ConnectionStrings["SQLCONN"].ToString()))  
  36.     using (var com = new SqlCommand(sql, con))  
  37.     {  
  38.         com.Connection.Open();  
  39.         ////gdvData.DataSource = com.ExecuteReader();  
  40.         ////gdvData.DataBind();  
  41.         var ada = new SqlDataAdapter(com);  
  42.         var ds = new DataSet();  
  43.         ada.Fill(ds);  
  44.         return ds;  
  45.     }  

前面示例,我們通過Request的屬性QueryString獲取ProductName的值,然后根據ProductName查詢數據庫,***把獲取數據綁定到Datagridview控件中(注:前面實例沒有考慮SQL Injection問題)。

cache3

圖3查詢結果

現在我們在頁面中添加輸出緩存,如下代碼:

  1. <!-- Adds OutputCache directive --> 
  2. <%@ OutputCache Duration="30" VaryByParam="None" %> 

前面提到當輸出緩存的屬性VaryByParam=”None”時,ASP.NET程序在緩存有效期內只緩存一個頁面副本;現在我們在緩存有效期內(30s)再發送請求。

cache4

圖4查詢結果

通過上圖我們發現,現在查詢參數ProductName=BK-M18B-40,但查詢結果依然是ProductName=BB-9108的數據,這是由于ASP.NET程序在緩存有效期內只緩存一個頁面副本。

通過上面的示例,我們發現只緩存一個頁面是不適用包含查詢參數的頁面輸出緩存;其實前面的示例我們只需稍稍改動就能符合查詢參數的情況了,想必大家已經知道了,只需把VaryByParam屬性設置為“*”就OK了。

cache5

cache6圖5查詢結果

現在查詢可以獲取相應的結果,如果查詢參數和前一個請求相同并且該頁面緩存有效,那么緩存將被重用,否則,創建一個新的頁面緩存。

由于ASP.NET給每個查詢參數都添加了輸出緩存,但我們要注意的是是否真的有必要緩存每個查詢參數都緩存一個頁面副本,假設查詢Url中增加一個參數參數ProductId,那么現在Url中就有兩個查詢參數了(ProductName和ProductId)。

前面我們把VaryByParam設置為“*”,所為ASP.NET程序對ProductName和ProductId都創建頁面緩存,如果我們只針對ProductName創建頁面緩存,這時我們可以修改VaryByParam,具體如下所示:

  1. <!-- Sets VaryByParam property--> 
  2. <%@ OutputCache Duration="30" VaryByParam="productname" %> 

#p#

自定義緩存控件

前面我們介紹了通過查詢參數實現緩存一個或多個頁面,其實ASP.NET也允許我們自定義緩存方式來決定是否緩存頁或重用現有的,這時我們可以通過設置VaryByCustom屬性來實現。

假設,現在我們要設計基于不同UserHostName的緩存,由于程序在執行過程中,首先調用GetVaryByCustomString()方法來確定是否緩存頁面或重用現有的,所以我們可以通過重寫該方法實現基于UserHostName的緩存,具體實現如下:

  1. /// <summary> 
  2. /// Gets vary cache based on custom string value.  
  3. /// </summary> 
  4. /// <param name="context">Http context.</param> 
  5. /// <param name="custom">custom string</param> 
  6. /// <returns></returns> 
  7. public override string GetVaryByCustomString(HttpContext context, string custom)  
  8. {  
  9.     if (string.Equals(custom, "UserHostName", StringComparison.OrdinalIgnoreCase))  
  10.     {  
  11.         // Indicates that the cache should be vary on user host name.  
  12.         return Context.Request.UserHostName;  
  13.     }  
  14.     return base.GetVaryByCustomString(context, custom);  

前面我們重寫了GetVaryByCustomString()方法,使得UserHostName值不同時,獲取相應的緩存值。

然后讓程序基于UserHostName創建緩存,所以我們要在頁面添加以下代碼:

  1. <!-- set vary cache based on custom string value --> 
  2. <%@ OutputCache Duration="30" VaryByParam="None" VaryByCustom="UserHostName" %> 

我們通過自定義現在GetVaryByCustomString()方法,實現了Web程序根據UserHostName實施不同的緩存方式,其實,我們還可以實現更多種類緩存方案,例如:基于用戶角色、時間和Url等等。

片段緩存

在某些情況下,我們不能緩存整個頁面,但我們仍想緩存部分頁面從而減輕系統的負擔;其實,我們可以通過兩種方法實現:片段緩存數據緩存.

為了實現片段緩存,我們需要創建自定義控件緩存部分頁面,然后我們把OutputCache指令添加到自定義控件中,這樣整個頁面將不會被緩存,而自定義緩存控件除外。

前面我們介紹了輸出緩存的使用,只需在頁面中添加OutputCache指令,假設我們要在幾個頁面中添加輸出緩存這可能比較簡單,但我們要在幾十個頁面中添加輸出緩存功能,而且前面介紹的例子中Duration屬性值都是直接Hard code到每個頁面中,如果我們需要修改Duration屬性值,那么就必須修改每個頁面了,ASP.NET還需要重新編譯這些頁面,這不利于我們的維護,最重要的是增加了我們的工作量。

其實,我們可以在web.config文件中定義一個outputCacheProfile(ProductCacheProfile),然后在頁面中添加CacheProfile屬性并且賦值為ProductCacheProfile,web.config文件設置如下:

  1. <caching> 
  2.   <!-- Sets out put cache profile--> 
  3.   <outputCacheSettings> 
  4.     <outputCacheProfiles> 
  5.       <add name="ProductCacheProfile" duration="30"/> 
  6.     </outputCacheProfiles> 
  7.   </outputCacheSettings> 
  8. </caching> 

現在,我們在頁面中添加CacheProfile屬性,并且設置為ProductCacheProfile,如下所示:

  1. <!-- set CacheProfile property --> 
  2. <%@ OutputCache CacheProfile="ProductCacheProfile" VaryByParam="None" %> 

#p#

數據緩存

Cache對象是線程安全:這表示無需顯式實現鎖定或解鎖,在添刪Cache對象中的元素,然而,在Cache對象中元素必須是線程安全的。例如,我們創建一個實體Product,而且存在多個客戶端可能同時操作該對象的情況,這時我們必須為實體Product實現鎖定和解鎖操作(同步操作請參考《單例模式(Singleton)的6種實現》)。

Cache對象中的緩存項自動移除:當緩存過期,依賴項被修改或內存不足緩存ASP.NET會自動移除該緩存項。

緩存項支持依賴關系:我們可以給緩存項添加文件、數據庫表或其他資源類型的依賴關系。

SqlDataSource緩存

當我們在SqlDataSource控件中啟用緩存,它緩存SelectCommand中的結果;如果SQL查詢語句中帶有參數時,SqlDataSource控件會緩存每一個參數值對應的結果。

這跟我們之前通過輸出緩存實現報表程序緩存查詢頁面效果一樣,所以我們將使用SqlDataSource緩存實現該效果。

假設我們要提供一個報表程序,讓用戶通過選擇產品名稱(ProductName),獲取相應的產品信息。

首先,我們在頁面中創建兩個數據源控件:sourceProductName和sourceProduct,接著把數據源分別綁定到Dropdownlist和Gridview中,具體實現如下:

  1. <!-- The product number datasource START -->  
  2. <asp:SqlDataSource ID="sourceProductName" runat="server" ProviderName="System.Data.SqlClient" 
  3.     EnableCaching="True" CacheDuration="3600" ConnectionString="<%$ ConnectionStrings:SQLCONN %>" 
  4.     SelectCommand="SELECT ProductNumber FROM Production.Product"></asp:SqlDataSource>  
  5. <!-- The product number datasource END -->  
  6.  
  7. <!-- The product datasource START -->  
  8. <asp:SqlDataSource ID="sourceProduct" runat="server" ProviderName="System.Data.SqlClient" 
  9.     EnableCaching="True" CacheDuration="3600" ConnectionString="<%$ ConnectionStrings:SQLCONN %>" 
  10.     SelectCommand="SELECT Name, ProductNumber, SafetyStockLevel, ReorderPoint, StandardCost, DaysToManufacture  
  11.      FROM Production.Product WHERE ProductNumber=@ProductNumber">  
  12.     <SelectParameters>  
  13.         <asp:ControlParameter ControlID="ddlProductNumber" Name="ProductNumber" PropertyName="SelectedValue" />  
  14.     </SelectParameters>  
  15. </asp:SqlDataSource>  
  16. <!-- The product number datasource END -->  
  17.  
  18. <!-- Binding the product number to gridview control -->  
  19. <!-- NOTE: Due to search and result in the same page, so need to set AutoPostBack is True-->  
  20. <asp:DropDownList ID="ddlProductNumber" AutoPostBack="True" DataSourceID="sourceProductName" 
  21.     DataTextField="ProductNumber" runat="server">  
  22. </asp:DropDownList>  
  23.  
  24. <!-- Binding the product datasource to gridview control -->  
  25. <asp:GridView ID="gvProduct" runat="server" DataSourceID="sourceProduct" CssClass="Product">  
  26. </asp:GridView>  

現在我們對報表程序進行查詢,如果ProudctName之前沒有被緩存起來就會創建相應的緩存,而已經緩存起來的將被重用,查詢結果如下:

cache8 圖6查詢結果

#p#

緩存的依賴關系

緩存項之間的依賴

ASP.NET Cache允許我們建立緩存之間的依賴關系,即一個緩存項依賴于另一個緩存項;以下示例代碼創建了二個緩存項,并且它們之間建立依賴關系。具體實現如下:

  1. // Creates cache object Key1.  
  2. Cache["Key1"] = "Cache Item 1";  
  3.  
  4. // Makes Cache["Key2"] dependent on Cache["Key1"].  
  5. string[] dependencyKey = new string[1];  
  6. dependencyKey[0] = "Key1";  
  7.  
  8. // Creates a CacheDependency object.  
  9. CacheDependency dependency = new CacheDependency(null, dependencyKey);  
  10.  
  11. // Establishs dependency between cache Key1 and Key2.  
  12. Cache.Insert("Key2""Cache Item 2", dependency); 

現在,當Key1緩存項更新或從緩存中刪除,Key2緩存項就會自動從緩存刪除。

文件依賴

前面我們介紹了緩存項之間的依賴關系,ASP.NET Cache還提供緩存項與文件之間的依賴關系,當文件被更新或刪除對應的緩存項也將失效。

在上篇博文《Ajax與JSON的一些總結》的***介紹的一個DEMO——Weibo Feed中,我們通過實時方式向新浪微博API發送請求獲取相應的數據,但在一定時間內請求的次數是有限制的,一旦超出了限制次數就不再接受請求了(具體請參考Rate-limiting)。所以可以通過Cache的方式把數據緩存起來,當客戶端請求時,如果緩存數據已經存在那么直接返回數據,否則重新想微博API請求數據。

首先,我們創建一個HttpHandler,它負責向微博API發送請求并且把數據保存的文件中,***把數據返回的客戶端。

cache9圖7 請求流程

接下來,我們定義CacheData()方法把微博數據保存到文本文件中并且建立緩存與數據文件的依賴關系。

  1. /// <summary>  
  2. /// Caches the data into text file.  
  3. /// </summary>  
  4. /// <param name="context">The http context</param>  
  5. private void CacheData(HttpContext context)  
  6. {  
  7.     // Weibo API.  
  8.     string uri = context.Request.QueryString["api"] + "?" +  
  9.         "source=" + context.Request.QueryString["source"] + "&" +  
  10.           "count=" + context.Request.QueryString["count"];  
  11.       
  12.     HttpWebResponse response = this.GetWeibos(uri);  
  13.  
  14.     if (null == response)  
  15.     {  
  16.         throw new ArgumentNullException("Response is null");  
  17.     }  
  18.  
  19.     string jsonData;  
  20.     // Writes the reponse data into text file.  
  21.     using (var reader = new StreamReader(response.GetResponseStream(), Encoding.GetEncoding(response.CharacterSet)))  
  22.     {  
  23.         jsonData = reader.ReadToEnd();  
  24.     }  
  25.  
  26.     string dataPath = context.Server.MapPath("weibo.json");  
  27.     using (var writer = new StreamWriter(dataPath, false, Encoding.GetEncoding(response.CharacterSet)))  
  28.     {  
  29.         writer.Write(jsonData);  
  30.     }  
  31.       
  32.     // Establishs dependency between cache weibo and text file.  
  33.     // Sets cache expires after 2 minuntes.  
  34.     HttpRuntime.Cache.Insert("weibo", jsonData, Dep, Cache.NoAbsoluteExpiration, TimeSpan.FromMinutes(2));  
  35.  

現在我們把數據保存到文本文件中并且建立了緩存weibo與數據文件的依賴關系,接下來我們要把JSON格式數據返回給客戶端。

  1. /// <summary>  
  2. /// Responses the weibo data.  
  3. /// </summary>  
  4. /// <param name="context">The http contex.</param>  
  5. private void ResponseWeibo(HttpContext context)  
  6. {  
  7.     // Gets the weibo cache data.  
  8.     byte[] buf = Encoding.UTF8.GetBytes(HttpRuntime.Cache["weibo"].ToString());  
  9.       
  10.     // Writes the data into output stream.  
  11.     context.Response.OutputStream.Write(buf, 0, buf.Length);  
  12.     context.Response.OutputStream.Flush();  
  13.     ////context.Response.Close();  

上面我們把JSON格式字符串轉換為Byte數值,然后寫入到OutputStream中,***把數據返回給客戶端。

  1. // The function to get weibo data.  
  2. loadWeibo: function() {  
  3.     $.ajax({  
  4.         // Weibo API.  
  5.     url: "WeiboHandler.ashx",  
  6.         type: "GET",  
  7.         // NOTE: We get the data from same domain,  
  8.         // dataType is json.  
  9.         dataType: "json",             
  10.         data: {  
  11.             source: JQWeibo.appKey,  
  12.             count: JQWeibo.numWeibo  
  13.         },  
  14.  
  15.         // When the requet completed, then invokes success function.  
  16.         success: function(data, textStatus, xhr) {  
  17.  
  18.             // Sets html structure.  
  19.             var html =  
  20.         '<div class="weibo">' +  
  21.         '<a href="http://weibo.com/DOMAIN" target="_blank">USER</a>' +  
  22.         ':WEIBO_TEXT<div class="time">AGO</div>';  
  23.  
  24.             // Appends weibos into html page.  
  25.             for (var i = 0; i < data.length; i++) {  
  26.                 $(JQWeibo.appendTo).append(  
  27.             html.replace('WEIBO_TEXT', JQWeibo.ify.clean(data[i].text))  
  28.  
  29.                 // Uses regex and declare DOMAIN as global, if found replace all.  
  30.                 .replace(/DOMAIN/g, data[i].user.domain)  
  31.                 .replace(/USER/g, data[i].user.screen_name)  
  32.                 .replace('AGO', JQWeibo.timeAgo(data[i].created_at))  
  33.         );  
  34.             }  
  35.         }  
  36.     })  
cache10圖8請求結果
總結

緩存可以使應用程序的性能得到很大的提高,因此在設計應用程序應該予以考慮,本博文主要介紹了ASP.NET中輸出緩存和數據緩存的應用場合和區別。

頁面緩存適用于生成的頁面通常都相同或改變時間比較固定情況,例如:數據在每小時都會更新,那么我們可以設置duration為3600s。

數據緩存適用生成的頁面總是在變化情況。

http://www.codeproject.com/Articles/29899/Exploring-Caching-in-ASP-NET

http://msdn.microsoft.com/zh-cn/library/aa478965.aspx#XSLTsection129121120120

http://www.amazon.com/Beginning-ASP-NET-3-5-2008-Professional/dp/1590598911

原文鏈接:http://www.cnblogs.com/rush/archive/2012/06/30/2571438.html

責任編輯:張偉 來源: JK_Rush的博客
相關推薦

2009-09-04 13:11:25

ASP.NET生成XM

2009-08-03 18:16:46

ASP.NET Web

2009-08-04 16:06:19

ASP.NET代碼分離

2009-12-11 14:17:36

ASP.NET Coo

2009-08-21 18:05:23

ASP.NET Ses

2013-05-31 02:18:47

ASP.NET.Net

2009-08-14 17:49:02

ASP.NET MVC

2009-07-31 18:00:35

ASP.NET工作流學

2009-08-05 15:13:32

使用Cache提高AS

2009-08-25 17:42:41

ASP.NET新手問題

2009-08-17 09:24:25

ASP.NET控件

2009-07-29 16:31:39

ASP.NET安裝部署

2009-08-03 17:41:20

ASP.NET Cac

2009-08-07 14:42:02

ASP.NET控件開發

2009-08-03 14:22:33

什么是ASP.NET

2009-07-28 17:17:19

ASP.NET概述

2009-07-22 17:45:35

ASP.NET教程

2009-07-29 11:44:30

ASP.NET緩存Cache

2009-07-27 12:22:03

ASP.NET和ASPASP.NET入門教程

2009-07-27 10:35:33

TypeConvertASP.NET
點贊
收藏

51CTO技術棧公眾號

亚洲精品免费视频| 国内精品久久久久影院薰衣草| 欧美精品一区二区在线播放| 国产肥臀一区二区福利视频| 成人精品一区| 紧缚奴在线一区二区三区| 久久免费视频在线| 欧美狂猛xxxxx乱大交3| 成人免费91| 欧美性xxxx在线播放| 亚洲在线欧美| 性插视频在线观看| 韩国女主播成人在线| 69视频在线播放| 在线观看黄网址| 精品一区毛片| 精品美女在线播放| 91精品无人成人www| 91高清视频在线观看| 国产精品少妇自拍| 精品一区二区久久久久久久网站| 夜夜嗨aⅴ一区二区三区| 亚洲黄色一区| 乱亲女秽乱长久久久| 久久久福利影院| 91国内在线| 国产激情91久久精品导航| 亚洲91精品在线观看| 午夜成人亚洲理伦片在线观看| 草莓视频一区二区三区| 欧美日韩亚洲不卡| 国产成人无码一二三区视频| 白白色在线观看| 亚洲黄色小视频| 亚洲欧洲精品一区| 日韩在线观看视频一区二区| 国产精品一区二区av| 91导航在线观看| 美女久久久久| 亚洲精品二三区| 久久久无码人妻精品无码| 伊人亚洲精品| 欧美日本精品一区二区三区| 日日摸天天爽天天爽视频| 精灵使的剑舞无删减版在线观看| 中文字幕在线视频一区| 亚洲精品日韩在线观看| yw193.com尤物在线| www日韩大片| 国产亚洲欧美一区二区 | 九色在线视频| 91丨porny丨最新| 国产日韩欧美精品| 免费观看a视频| 国产成人精品免费在线| 99国精产品一二二线| 国产乱淫a∨片免费观看| 激情久久五月天| 亚洲自拍高清视频网站| 99在线观看精品视频| 国产高清在线观看免费不卡| 97超碰人人看人人| 人成网站在线观看| 91偷拍与自偷拍精品| 美日韩精品免费| 国产永久免费高清在线观看| 亚洲国产成人一区二区三区| 亚洲一区二区三区加勒比| 日本高清在线观看wwwww色| 国产日韩欧美一区二区三区综合| 图片区小说区区亚洲五月| av在线播放网站| 日韩毛片一二三区| 精品一二三四五区| 天堂中文在线播放| 欧美在线你懂得| 在线播放av中文字幕| 日本精品在线播放| 亚洲国产精品热久久| 最近中文字幕免费视频| 久久国产亚洲精品| 欧美日韩国产成人在线观看| 91看片在线播放| 日韩不卡在线观看日韩不卡视频| 国产日韩欧美中文在线播放| www.激情五月.com| 久久蜜臀中文字幕| 91手机视频在线| www在线看| 日本黄色一区二区| 潘金莲一级淫片aaaaa| 亚洲老女人视频免费| 色偷偷888欧美精品久久久| 久久久久久久久久99| 久久最新视频| 不卡一卡2卡3卡4卡精品在| 九一在线视频| 亚洲一区在线免费观看| 熟妇人妻va精品中文字幕| 国语精品视频| 亚洲精品久久在线| 国产高清视频免费在线观看| 性色一区二区三区| 2020国产精品久久精品不卡| 欧美另类自拍| 亚洲一区av在线| 欧美成年人视频在线观看| 国产精品一线| 久久视频在线直播| 天堂在线免费观看视频| 国产在线精品一区在线观看麻豆| 欧美高清视频一区| 欧美hdxxx| 欧美日本韩国一区二区三区视频| 亚洲蜜桃精久久久久久久久久久久 | 欧美性受极品xxxx喷水| 亚洲成人精品在线播放| 日韩成人影院| 欧美最近摘花xxxx摘花| 亚洲精品国产片| 自拍偷拍亚洲激情| 成人黄色一区二区| 日韩有码中文字幕在线| 欧美激情综合色综合啪啪五月| 中文字幕在线播放av| 2023国产精品| 丝袜人妻一区二区三区| 日韩免费一级| 久久九九有精品国产23| 中文字幕乱码一区二区| 久久久久九九视频| 欧美性大战久久久久xxx| 一区二区三区亚洲变态调教大结局| 在线播放日韩欧美| 男人天堂视频在线| 久久日韩精品一区二区五区| 日本日本19xxxⅹhd乱影响| 精品一区二区三区亚洲| 久久精品99国产精品酒店日本| 日本精品入口免费视频| 国产视频一区在线观看 | 亚洲风情在线资源| 亚洲精品黄网在线观看| 国产污视频在线观看| 丁香一区二区三区| 欧洲精品在线播放| ady日本映画久久精品一区二区| 麻豆乱码国产一区二区三区| 国产农村妇女毛片精品久久| 亚洲欧洲国产日韩| 波多野结衣在线免费观看| 91精品福利| 7777精品伊久久久大香线蕉语言| 在线观看男女av免费网址| 日韩视频一区二区三区| 免费麻豆国产一区二区三区四区| 国产盗摄女厕一区二区三区| 国产精品视频一二三四区| 免费精品一区二区三区在线观看| 色综合五月天导航| 男人天堂综合网| 黑人巨大精品欧美一区二区一视频 | 国产综合色激情| 日韩视频在线免费| 国产wwwxxx| 香蕉成人伊视频在线观看| 精品人妻一区二区三区日产| 亚洲每日在线| 日韩欧美亚洲在线| a一区二区三区亚洲| 欧美贵妇videos办公室| 天堂av电影在线观看| 欧美在线观看18| 国产传媒免费在线观看| 岛国一区二区在线观看| 日韩欧美精品在线观看视频| 日韩精品中文字幕第1页| 91精品国产99久久久久久红楼| av中文在线资源| 在线不卡国产精品| 国产草草影院ccyycom| 午夜精品影院在线观看| 国产在线综合视频| 国产传媒欧美日韩成人| 国产日产欧美视频| 国产精品成人a在线观看| 国产精品区一区| 精品国产欧美日韩一区二区三区| xxx成人少妇69| 日韩在线视频免费| 欧美日韩一二三区| 久久午夜免费视频| 国产精品成人网| 免费在线观看成年人视频| 丝袜亚洲精品中文字幕一区| 欧美另类videosbestsex日本| 亚洲v天堂v手机在线| 91免费欧美精品| 亚洲女同av| 久久91精品国产| 国产对白叫床清晰在线播放| 欧美变态tickle挠乳网站| 久久久久久亚洲av无码专区| 一区二区国产视频| 黄大色黄女片18免费| 成人污污视频在线观看| 国内自拍视频网| 亚洲伦理精品| 精品久久久无码人妻字幂| 欧美激情在线免费| 成人欧美一区二区三区视频| 婷婷丁香久久| 欧美影院在线播放| 丁香花在线观看完整版电影| 这里只有精品视频在线| 亚洲日本香蕉视频| 日韩三级在线观看| 91在线视频国产| 欧美性猛片xxxx免费看久爱| 天天操天天干视频| 亚洲国产婷婷综合在线精品| 欧美特黄一级片| 国产免费成人在线视频| 大黑人交xxx极品hd| 成人精品免费看| 手机精品视频在线| 精品一区二区在线视频| 蜜臀视频一区二区三区| 一本综合精品| 国产亚洲黄色片| 午夜精品影院| 国产内射老熟女aaaa| 亚洲91精品| 中文字幕剧情在线观看一区| 久久一区二区三区电影| 日产精品一线二线三线芒果| 亚洲美女久久| 蜜桃传媒视频麻豆第一区免费观看 | 超碰aⅴ人人做人人爽欧美| 久久久噜久噜久久综合| 久久99亚洲网美利坚合众国| 久久777国产线看观看精品| 色呦呦久久久| 欧美精品福利视频| 超碰在线资源| 91wwwcom在线观看| 成人美女大片| 国产精品国模在线| 日韩亚洲国产免费| 成人精品一区二区三区| 久久免费影院| 国产精品视频网| 国产私拍福利精品视频二区| 国产精品无av码在线观看| 中文字幕成人| av成人在线电影| 久久久久久久久久久久久久久久久久久久 | 国产91精品一区| 色综合久久久久综合体| 青娱乐在线免费视频| 欧美视频日韩视频在线观看| 怡红院男人的天堂| 91麻豆精品国产91久久久久久| 国产精品美女一区| 日韩欧美一区二区视频| 免费观看国产精品| 国产亚洲精品久久久久久| 天天影视久久综合| 久久99热精品这里久久精品| 精品人人视频| 国产精品视频在线观看| 美国十次综合久久| 精品久久蜜桃| 日本一区二区在线看| 一本色道久久88亚洲精品综合| 国产精品hd| 日韩一级在线免费观看| 狠狠色综合日日| 免费黄色a级片| 国产日韩欧美高清在线| 国产三级国产精品国产国在线观看| 亚洲午夜久久久| 久久永久免费视频| 欧美一区二区三区在| 天堂a中文在线| 久久久999精品视频| 精品捆绑调教一区二区三区| 国产一区视频在线播放| 久9re热视频这里只有精品| 少妇免费毛片久久久久久久久| 欧美成人高清| 激情视频综合网| 国产成人在线网站| 欧美色图亚洲激情| 亚洲精品视频免费观看| 潘金莲一级淫片aaaaaa播放| 日韩精品在线看片z| 大胆av不用播放器在线播放| 欧美激情视频播放| 久久91视频| 精品一区二区三区免费毛片| 91精品国产调教在线观看| 一本大道熟女人妻中文字幕在线 | 国产精品酒店视频| 亚洲mv在线观看| 国产毛片毛片毛片毛片| 亚洲丝袜av一区| 成人免费网站观看| 亚洲999一在线观看www| 精品国产乱码久久久久久果冻传媒 | 欧美国产三级| 999香蕉视频| 成年人网站91| 欧美成人免费看| 欧美精品xxxxbbbb| 国产香蕉在线| 茄子视频成人在线| 久久香蕉精品香蕉| 国产 欧美 日本| 国产制服丝袜一区| 成人性生交大片免费看无遮挡aⅴ| 欧美日韩精品在线播放| 亚洲精品久久久久久久久久| 日韩在线播放av| 色婷婷综合久久久中字幕精品久久| 国产主播一区二区三区四区| 国产精品v欧美精品v日本精品动漫| 亚洲娇小娇小娇小| 中文字幕第一区二区| 夜夜躁日日躁狠狠久久av| 日韩麻豆第一页| 忘忧草在线影院两性视频| 国产精品美女久久久久av福利| 欧美精品aa| 亚洲成人av免费观看| 亚洲人成精品久久久久| 国产精品久久无码一三区| 日韩中文字幕视频在线| 免费在线观看一区| 日韩国产伦理| 日本欧美韩国一区三区| 丁香激情五月少妇| 欧美性大战久久久久久久| 成人午夜电影在线观看| 国产美女高潮久久白浆| 欧美电影《轻佻寡妇》| 色啦啦av综合| 亚洲色图欧洲色图婷婷| av中文字幕播放| 欧美黄色片免费观看| 精品无人区一区二区| jizzjizzxxxx| 国产午夜精品久久久久久久| 特级西西444www大胆免费看| 伊是香蕉大人久久| 91精品麻豆| 91黄色在线看| 91网上在线视频| 中文天堂在线视频| 久久精品视频在线播放| 伊人久久亚洲| 免费在线激情视频| 国产色产综合产在线视频| 一区二区三区精| 欧美激情二区三区| 亚洲瘦老头同性70tv| 日韩av手机版| 亚洲欧美国产77777| 深爱五月激情五月| 日韩av高清不卡| 99精品全国免费观看视频软件| 少妇丰满尤物大尺度写真| 午夜视频一区二区| 国产高清在线| 亚洲va欧美va在线观看| 一区二区91| 亚洲综合图片一区| 欧美精品一区二区三区一线天视频 | 青青草精品在线| 欧美三级欧美成人高清www| www.在线视频.com| 99久久精品无码一区二区毛片 | 成人午夜国产| 中文写幕一区二区三区免费观成熟| 婷婷久久综合九色综合绿巨人 | 欧美国产第二页| 深夜福利久久| 欧美一区二区三区影院| 狠狠躁夜夜躁人人爽超碰91| 日本不卡三区| 久久99国产精品| 韩国理伦片一区二区三区在线播放| 国产无套粉嫩白浆内谢| 最近2019年中文视频免费在线观看| y111111国产精品久久久| 欧美伦理片在线观看| 天天影视色香欲综合网老头| 一本一道波多野毛片中文在线| 国产私拍一区| 国产成人综合在线观看|