精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

亚洲成人18| 欧美日本亚洲视频| 欧美私人情侣网站| 免费国产在线观看| 国内久久视频| 亚洲精品网址在线观看| wwwwxxxx日韩| 国产黄色小视频在线| 国产超碰在线一区| 日韩免费在线看| 三级影片在线观看| 国产精品网址| 欧美色涩在线第一页| 影音先锋亚洲视频| 欧美一区二区黄片| 日本一不卡视频| 欧美大秀在线观看| 国产女主播喷水高潮网红在线| 久草免费在线视频| 国产精品久久久久久久久快鸭| 99国产在线视频| 中文字幕av影院| 久久在线播放| 日韩精品在线视频美女| 看看黄色一级片| 九色porny自拍视频在线观看 | 欧美一区,二区| 日韩和欧美的一区| 欧美精品久久久久a| 亚洲精品一区二区三区影院忠贞| 小说区图片区亚洲| 欧美丝袜第一区| 亚洲一区二区自拍偷拍| 日本精品一二区| 另类人妖一区二区av| 欧美精品久久久久久久久久 | 国产福利一区在线| 国产成人精品久久久| 极品魔鬼身材女神啪啪精品| 天天躁日日躁成人字幕aⅴ| 欧美人与禽zozo性伦| 鲁一鲁一鲁一鲁一澡| 尤物视频在线看| 亚洲国产精华液网站w| 国产精品视频入口| 国产三区在线播放| 免费在线观看视频一区| 91精品国产色综合久久不卡98| 中国毛片直接看| 精品大片一区二区| 日韩精品黄色网| 9.1在线观看免费| 国产在线一区不卡| 欧美日韩精品一区二区三区| av在线观看地址| 成人免费网站在线观看视频| 久久综合久久综合亚洲| 国产乱码精品一区二区三区日韩精品 | 西野翔中文久久精品字幕| 日韩一区二区视频在线观看| 超碰中文字幕在线观看| 99综合99| 欧美α欧美αv大片| 苍井空张开腿实干12次| 成人av综合网| 亚洲男人天堂久| 国产精品毛片一区二区| 国内精品视频在线观看| 一本色道久久综合亚洲精品小说 | 9191国语精品高清在线| 蜜月aⅴ免费一区二区三区| 久久国产波多野结衣| 在线观看国产精品入口| 久久久久国产一区二区三区| 日本一本高清视频| 老妇喷水一区二区三区| 国产在线观看91精品一区| 国产精品亚洲lv粉色| 成人一区二区三区在线观看| 久久99精品久久久久久久青青日本| 亚洲av电影一区| 日本一区二区在线不卡| 亚洲综合激情五月| av电影免费在线看| 在线免费观看视频一区| 91精品国产三级| 老司机凹凸av亚洲导航| 亚洲天堂av电影| 希岛爱理中文字幕| 日韩一级精品| 国产精品久久久久久久久久免费| 国产视频第一页| 91麻豆视频网站| 一区二区不卡在线| 999精品网| 欧美日韩国产大片| 艳妇乳肉亭妇荡乳av| 成人在线视频免费观看| 欧美激情视频在线观看| 91porny九色| 国产成人免费av在线| 日韩欧美视频一区二区三区四区| 污影院在线观看| 日本道色综合久久| 一级全黄裸体片| 热久久天天拍国产| 97在线视频国产| 国产美女免费看| 久久久久综合网| 91黄色在线看| 97久久中文字幕| 亚洲社区在线观看| 国产在线观看你懂的| 麻豆传媒一区二区三区| 麻豆精品视频| 任你弄在线视频免费观看| 欧洲生活片亚洲生活在线观看| 四虎成人免费视频| 国产精品福利在线观看播放| 日本韩国欧美精品大片卡二| 亚洲第一第二区| 亚洲欧洲日韩在线| 精品久久久久av| 老司机凹凸av亚洲导航| 欧美精品在线播放| 一炮成瘾1v1高h| 国产视频一区在线观看| 久久久久久久午夜| 在线一区二区三区视频| 精品国产一区二区在线| 亚洲成人第一网站| 久久亚洲一级片| 久久综合九色综合88i| 国产+成+人+亚洲欧洲在线| 欧美成人h版在线观看| 在线免费观看视频网站| 国产色产综合色产在线视频| 日韩精品一区二区三区不卡| 欧洲vs亚洲vs国产| 午夜伦理精品一区| 性生交大片免费看女人按摩| 亚洲免费在线播放| www.久久久久久久久久久| 日本在线电影一区二区三区| 国产成人午夜视频网址| 国产在线一二三区| 欧美最猛性xxxxx直播| 久久精品国产亚洲AV熟女| 一区二区三区国产在线| 精品蜜桃传媒| 亚洲第一av| 亚洲男人天堂手机在线| 国产精品久久久久久久久夜色| 久久欧美中文字幕| 久久综合伊人77777麻豆最新章节| 曰本一区二区三区视频| 欧洲一区二区视频| 成人午夜影视| 欧美日韩1234| 一区二区三区四区五区| 国产ts人妖一区二区| 色欲色香天天天综合网www| 精品成人自拍视频| 国产不卡av在线| 亚洲乱亚洲乱妇| 91精品国产综合久久香蕉的特点| a在线视频播放观看免费观看| 国产一区二区伦理| 国产二区视频在线| 久久av超碰| 国产日本欧美一区| 婷婷在线播放| 日韩成人黄色av| 亚洲成人av网址| 中文字幕亚洲一区二区av在线 | 国产黄色成人av| 人妻少妇精品无码专区二区| 久久99精品久久久久久园产越南| 国产精品久久久久久亚洲影视| 日本网站在线免费观看视频| 日韩一级精品视频在线观看| 日韩av在线天堂| 国产蜜臀97一区二区三区 | 日韩欧美久久| 欧洲午夜精品久久久| 亚洲s色大片| 精品欧美一区二区久久| 无码一区二区三区| 亚洲人成网站在线| 波多野结衣办公室33分钟| 精品在线免费观看| 国产高清www| 成人国产精品一级毛片视频| 3d动漫啪啪精品一区二区免费 | 亚洲电影在线免费观看| 欧美做受高潮6| 国产精品白丝av| www.com毛片| 亚洲影视一区| 日韩和欧美的一区二区| 国产成人澳门| 国产美女精品视频| 欧美13videosex性极品| 久久亚洲欧美日韩精品专区| 日韩一二三四| 日韩色视频在线观看| 伊人久久久久久久久久久久| 亚洲综合男人的天堂| 亚洲最大成人综合网| 成人福利视频在线看| 日本一本二本在线观看| 国产精品www994| 日本在线视频不卡| 国产综合色激情| 欧美综合激情网| 蜜桃成人365av| 按摩亚洲人久久| 国产福利免费在线观看| 亚洲国产欧美日韩精品| japanese国产| 欧美疯狂做受xxxx富婆| 精品成人无码久久久久久| 亚洲无人区一区| 亚洲av无码一区二区三区在线| 国产欧美一区二区三区在线看蜜臀| 这里只有精品在线观看视频| 国产一区二区精品久久| 亚洲 激情 在线| 天堂一区二区在线| 两根大肉大捧一进一出好爽视频| 国产精品大片| 青青草综合视频| 久久久国产精品| 亚洲欧洲精品在线观看| 精品久久中文| 日本一区二区三区免费观看| 色狠狠久久av综合| 精品久久蜜桃| 欧美理论电影在线精品| 国产精品一区二区欧美| av日韩在线播放| 粉嫩av四季av绯色av第一区| 亚洲1区在线| 91国产丝袜在线放| 久久精品免视看国产成人| 91精品视频免费观看| 亚洲国产伊人| 91日本在线观看| 精品中文在线| 国产不卡一区二区在线观看 | 亚洲一级少妇| 日韩av片电影专区| 日韩三区免费| 国产精品久久久久福利| 精品久久在线| 92国产精品视频| 亚洲精品黑牛一区二区三区| 超碰97在线播放| 国产精品任我爽爆在线播放| 国产一区二区精品在线| 一道在线中文一区二区三区| 欧美一区国产一区| 久久精品av| 黄色小视频大全| 在线观看的日韩av| 茄子视频成人免费观看| 青娱乐精品视频| 中文字幕线观看| 不卡一区中文字幕| 97超碰在线资源| 亚洲欧洲无码一区二区三区| 妺妺窝人体色www婷婷| 欧美日韩一区二区三区| av手机天堂网| 日韩西西人体444www| 日本私人网站在线观看| 色哟哟网站入口亚洲精品| 在线观看的网站你懂的| 性金发美女69hd大尺寸| 国产高清不卡| 91免费精品视频| 欧美色图婷婷| 亚洲人久久久| 亚洲无线视频| 日本男人操女人| 国产在线播精品第三| 丰满岳乱妇一区二区| 欧美国产一区二区在线观看| 精品国产欧美日韩不卡在线观看 | 日本wwww视频| 国产原创一区二区三区| 亚洲国产欧美视频| √…a在线天堂一区| 五月婷婷开心网| 欧美美女一区二区三区| 日本一二三区在线视频| 久久影视电视剧免费网站| 日韩脚交footjobhd| 成人网在线观看| 红杏视频成人| 一区二区精品国产| 99在线观看免费视频精品观看| 黑人极品videos精品欧美裸| 性欧美成人播放77777| 国产精品成人免费在线| 国产一卡二卡在线| 欧美三级日韩三级| 污视频网站免费观看| 久久天天躁狠狠躁夜夜av| 惠美惠精品网| 国产精品久久国产三级国电话系列| 奇米狠狠一区二区三区| 日本福利视频一区| 狠狠v欧美v日韩v亚洲ⅴ| 大又大又粗又硬又爽少妇毛片| 最新日韩av在线| 日韩精品一区二区亚洲av观看| 日韩欧美电影一区| 欧美尤物美女在线| 日本欧美中文字幕| 国产精品色呦| 国产av不卡一区二区| 久久福利精品| 亚洲少妇中文字幕| 亚洲欧美福利一区二区| 中文字幕理论片| 国产一区二区三区高清在线观看| sm在线播放| 国产精品免费一区二区三区在线观看| 91综合在线| 99视频在线视频| 久久久精品人体av艺术| 伊人手机在线视频| 亚洲高清在线观看| 毛片网站在线看| 96pao国产成视频永久免费| 天天综合一区| 一二三级黄色片| 日韩毛片精品高清免费| 97成人在线观看| 久久精品国产96久久久香蕉| 狂野欧美性猛交xxxx| 日韩精彩视频| 免费成人美女在线观看| 日本理论中文字幕| 欧美日韩日日骚| 免费黄色在线网站| 亚洲影院高清在线| 欧美精品啪啪| 伊人久久一区二区三区| 五月婷婷色综合| 深夜福利在线观看直播| 欧美亚洲视频一区二区| 亚洲美女15p| 日本www.色| 国产精品理伦片| 国产毛片一区二区三区va在线| 久久这里有精品| japanese色系久久精品| 国产视频一视频二| 久久久99精品久久| 一区二区自拍偷拍| 久久久久www| 北条麻妃一区二区三区在线观看| 日本a在线免费观看| 久久亚洲精华国产精华液 | 国产日韩1区| 性高潮久久久久久久| 欧美视频三区在线播放| 美女国产在线| 国产精品日韩欧美一区二区| 国产欧美日本| 自拍偷拍你懂的| 亚洲午夜一级| 久久一区二区三区欧美亚洲| 视频在线观看一区二区三区| 91视频免费看片| 欧美不卡一区二区三区| 麻豆蜜桃在线观看| 亚洲午夜激情| 成人免费毛片嘿嘿连载视频| 国产亚洲欧美在线精品| 精品国内产的精品视频在线观看| www.亚洲一二| 成人性做爰aaa片免费看不忠| 自拍偷拍亚洲综合| 五月天婷婷在线播放| 国产日韩欧美中文| 亚洲午夜极品| 网站永久看片免费| 亚洲大胆人体av| 麻豆久久久久| 久久国产精品视频在线观看| 国产精品你懂的在线| 欧美视频一二区| 国产日产欧美精品| 国产精品久久久久久久免费软件| 日韩免费av一区| 日韩经典中文字幕| 视频成人永久免费视频|