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

分布式中使用Redis實現Session共享

數據庫 其他數據庫 分布式 Redis
session和cookie是我們做web開發中常用到的兩個對象,它們之間會不會有聯系呢?

  Session實現原理

  session和cookie是我們做web開發中常用到的兩個對象,它們之間會不會有聯系呢?

  Cookie是什么? Cookie 是一小段文本信息,伴隨著用戶請求和頁面在 Web 服務器和瀏覽器之間傳遞。Cookie 包含每次用戶訪問站點時 Web 應用程序都可以讀取的信息。(Cookie 會隨每次HTTP請求一起被傳遞服務器端,排除js,css,image等靜態文件,這個過程可以從fiddler或者ie自帶的網絡監控里面分析到,考慮性能的化可以從盡量減少cookie著手)

  Cookie寫入瀏覽器的過程:我們可以使用如下代碼在Asp.net項目中寫一個Cookie 并發送到客戶端的瀏覽器(為了簡單我沒有設置其它屬性)。

  1. HttpCookie cookie = new HttpCookie("RedisSessionId", "string value");Response.Cookies.Add(cookie); 

  

 

  我們可以看到在服務器寫的cookie,會通過響應頭Set-Cookie的方式寫入到瀏覽器。

  Session是什么? Session我們可以使用它來方便地在服務端保存一些與會話相關的信息。比如常見的登錄信息。

  Session實現原理? HTTP協議是無狀態的,對于一個瀏覽器發出的多次請求,WEB服務器無法區分 是不是來源于同一個瀏覽器。所以服務器為了區分這個過程會通過一個sessionid來區分請求,而這個sessionid是怎么發送給服務端的呢?前面說了cookie會隨每次請求發送到服務端,并且cookie相對用戶是不可見的,用來保存這個sessionid是最好不過了,我們通過下面過程來驗證一下。

  1. Session["UserId"] = 123; 

 

  通過上圖再次驗證了session和cookie的關系,服務器產生了一次設置cookie的操作,這里的sessionid就是用來區分瀏覽器的。為了實驗是區分瀏覽器的,可以實驗在IE下進行登錄,然后在用chrome打開相同頁面,你會發現在chrome還是需要你登錄的,原因是chrome這時沒有sessionid。httpOnly是表示這個cookie是不會在瀏覽器端通過js進行操作的,防止人為串改sessionid。

  asp.net默認的sessionid的鍵值是ASP.NET_SessionId,可以在web.config里面修改這個默認配置

  

  1. <sessionState mode="InProc" cookieName="MySessionId"></sessionState> 

  服務器端Session讀取? 服務器端是怎么讀取session的值呢 ,Session["鍵值"]。那么問題來了,為什么在Defaule.aspx.cs文件里可以獲取到這個Session對象,這個Session對象又是什么時候被初始化的呢。

  為了弄清楚這個問題,我們可以通過轉到定義的方式來查看。

  System.Web.UI.Page ->HttpSessionState(Session)

  1. protected internal override HttpContext Context { 
  2. [System.Runtime.TargetedPatchingOptOut("Performance critical to inline across NGen image boundaries")] 
  3.   get { 
  4.        if (_context == null) { 
  5.            _context = HttpContext.Current; 
  6.        } 
  7.        return _context; 
  8.     } 
  9.  } 
  10.  public virtual HttpSessionState Session { 
  11.         get { 
  12.             if (!_sessionRetrieved) { 
  13.                 /* try just once to retrieve it */ 
  14.                 _sessionRetrieved = true; 
  15.  
  16.                 try { 
  17.                     _session = Context.Session; 
  18.                 } 
  19.                 catch { 
  20.                     //  Just ignore exceptions, return null. 
  21.                 } 
  22.             } 
  23.  
  24.             if (_session == null) { 
  25.                 throw new HttpException(SR.GetString(SR.Session_not_enabled)); 
  26.             } 
  27.  
  28.             return _session; 
  29.         } 
  30.     } 

上面這一段是Page對象初始化Session對象的,可以看到Session的值來源于HttpContext.Current,而HttpContext.Current又是什么時候被初始化的呢,我們接著往下看。

  1. public sealed class HttpContext : IServiceProvider, IPrincipalContainer 
  2.     { 
  3.  
  4.         internal static readonly Assembly SystemWebAssembly = typeof(HttpContext).Assembly; 
  5.         private static volatile bool s_eurlSet; 
  6.         private static string s_eurl; 
  7.  
  8.         private IHttpAsyncHandler  _asyncAppHandler;   // application as handler (not always HttpApplication) 
  9.         private AsyncPreloadModeFlags _asyncPreloadModeFlags; 
  10.         private bool               _asyncPreloadModeFlagsSet; 
  11.         private HttpApplication    _appInstance; 
  12.         private IHttpHandler       _handler; 
  13.         [DoNotReset] 
  14.         private HttpRequest        _request; 
  15.         private HttpResponse       _response; 
  16.         private HttpServerUtility  _server; 
  17.         private Stack              _traceContextStack; 
  18.         private TraceContext       _topTraceContext; 
  19.         [DoNotReset] 
  20.         private Hashtable          _items; 
  21.         private ArrayList          _errors; 
  22.         private Exception          _tempError; 
  23.         private bool               _errorCleared; 
  24.         [DoNotReset] 
  25.         private IPrincipalContainer _principalContainer; 
  26.         [DoNotReset] 
  27.         internal ProfileBase       _Profile; 
  28.         [DoNotReset] 
  29.         private DateTime           _utcTimestamp; 
  30.         [DoNotReset] 
  31.         private HttpWorkerRequest  _wr; 
  32.         private VirtualPath        _configurationPath; 
  33.         internal bool              _skipAuthorization; 
  34.         [DoNotReset] 
  35.         private CultureInfo        _dynamicCulture; 
  36.         [DoNotReset] 
  37.         private CultureInfo        _dynamicUICulture; 
  38.         private int                _serverExecuteDepth; 
  39.         private Stack              _handlerStack; 
  40.         private bool               _preventPostback; 
  41.         private bool               _runtimeErrorReported; 
  42.         private PageInstrumentationService _pageInstrumentationService = null; 
  43.         private ReadOnlyCollection<string> _webSocketRequestedProtocols; 
  44. } 

  我這里只貼出了一部分源碼,HttpContext包含了我們常用的Request,Response等對象。HttpContext得從ASP.NET管道說起,以IIS 6.0為例,在工作進程w3wp.exe中,利用Aspnet_ispai.dll加載.NET運行時(如果.NET運行時尚未加載)。IIS 6.0引入了應用程序池的概念,一個工作進程對應著一個應用程序池。一個應用程序池可以承載一個或多個Web應用,每個Web應用映射到一個IIS虛擬目錄。與IIS 5.x一樣,每一個Web應用運行在各自的應用程序域中。如果HTTP.SYS接收到的HTTP請求是對該Web應用的第一次訪問,在成功加載了運行時后,會通過AppDomainFactory為該Web應用創建一個應用程序域(AppDomain)。隨后,一個特殊的運行時IsapiRuntime被加載。IsapiRuntime定義在程序集System.Web中,對應的命名空間為System.Web.Hosting。IsapiRuntime會接管該HTTP請求。IsapiRuntime會首先創建一個IsapiWorkerRequest對象,用于封裝當前的HTTP請求,并將該IsapiWorkerRequest對象傳遞給ASP.NET運行時:HttpRuntime,從此時起,HTTP請求正式進入了ASP.NET管道。根據IsapiWorkerRequest對象,HttpRuntime會創建用于表示當前HTTP請求的上下文(Context)對象:HttpContext。
     至此相信大家對Session初始化過程,session和cookie的關系已經很了解了吧,下面開始進行Session共享實現方案。 

  Session共享實現方案

  一.StateServer方式

 

  這種是asp.net提供的一種方式,還有一種是SQLServer方式(不一定程序使用的是SQLServer數據庫,所以通用性不高,這里就不介紹了)。也就是將會話數據存儲到單獨的內存緩沖區中,再由單獨一臺機器上運行的Windows服務來控制這個緩沖區。狀態服務全稱是“ASP.NET State Service ”(aspnet_state.exe)。它由Web.config文件中的stateConnectionString屬性來配置。該屬性指定了服務所在的服務器,以及要監視的端口。

  1. <sessionState mode="StateServer"      stateConnectionString="tcpip=127.0.0.1:42424"     cookieless="false" timeout="20" /> 

  在這個例子中,狀態服務在當前機器的42424端口(默認端口)運行。要在服務器上改變端口和開啟遠程服務器的該功能,可編輯HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\aspnet_state\Parameters注冊表項中的Port值和AllowRemoteConnection修改成1。 顯然,使用狀態服務的優點在于進程隔離,并可在多站點中共享。 使用這種模式,會話狀態的存儲將不依賴于iis進程的失敗或者重啟,然而,一旦狀態服務中止,所有會話數據都會丟失(這個問題redis不會存在,重新了數據不會丟失)。

  這里提供一段bat文件幫助修改注冊表,可以復制保存為.bat文件執行

  1. reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\aspnet_state\Parameters" /v "AllowRemoteConnection" /t REG_DWORD  /d 1 /f 
  2.  
  3. reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\aspnet_state\Parameters" /v "Port" /t REG_DWORD  /d 42424 /f 
  4.  
  5. net stop aspnet_state 
  6. net start aspnet_state 
  7.  
  8. pause 

二.redis實現session共享

   下面我們將使用redis來實現共享,首先要弄清楚session的幾個關鍵點,過期時間,SessionId,一個SessionId里面會存在多組key/value數據。基于這個特性我將采用Hash結構來存儲,看看代碼實現。用到了上一篇提供的RedisBase幫助類。

  1. using System; 
  2. using System.Collections.Generic; 
  3. using System.Linq; 
  4. using System.Web; 
  5. using System.Web.SessionState; 
  6. using ServiceStack.Redis; 
  7. using Com.Redis; 
  8.  
  9. namespace ResidSessionDemo.RedisDemo 
  10.     public class RedisSession 
  11.     { 
  12.         private HttpContext context; 
  13.  
  14.         public RedisSession(HttpContext context, bool IsReadOnly, int Timeout) 
  15.         { 
  16.             this.context = context; 
  17.             this.IsReadOnly = IsReadOnly; 
  18.             this.Timeout = Timeout; 
  19.             //更新緩存過期時間 
  20.             RedisBase.Hash_SetExpire(SessionID, DateTime.Now.AddMinutes(Timeout)); 
  21.         } 
  22.  
  23.         /// <summary> 
  24.         /// SessionId標識符 
  25.         /// </summary> 
  26.         public static string SessionName = "Redis_SessionId"; 
  27.  
  28.         // 
  29.         // 摘要: 
  30.         //     獲取會話狀態集合中的項數。 
  31.         // 
  32.         // 返回結果: 
  33.         //     集合中的項數。 
  34.         public int Count 
  35.         { 
  36.             get 
  37.             { 
  38.                 return RedisBase.Hash_GetCount(SessionID); 
  39.             } 
  40.         } 
  41.  
  42.         // 
  43.         // 摘要: 
  44.         //     獲取一個值,該值指示會話是否為只讀。 
  45.         // 
  46.         // 返回結果: 
  47.         //     如果會話為只讀,則為 true;否則為 false。 
  48.         public bool IsReadOnly { get; set; } 
  49.  
  50.         // 
  51.         // 摘要: 
  52.         //     獲取會話的唯一標識符。 
  53.         // 
  54.         // 返回結果: 
  55.         //     唯一會話標識符。 
  56.         public string SessionID 
  57.         { 
  58.             get 
  59.             { 
  60.                 return GetSessionID(); 
  61.             } 
  62.         } 
  63.  
  64.         // 
  65.         // 摘要: 
  66.         //     獲取并設置在會話狀態提供程序終止會話之前各請求之間所允許的時間(以分鐘為單位)。 
  67.         // 
  68.         // 返回結果: 
  69.         //     超時期限(以分鐘為單位)。 
  70.         public int Timeout { get; set; } 
  71.  
  72.         /// <summary> 
  73.         /// 獲取SessionID 
  74.         /// </summary> 
  75.         /// <param name="key">SessionId標識符</param> 
  76.         /// <returns>HttpCookie值</returns> 
  77.         private string GetSessionID() 
  78.         { 
  79.             HttpCookie cookie = context.Request.Cookies.Get(SessionName); 
  80.             if (cookie == null || string.IsNullOrEmpty(cookie.Value)) 
  81.             { 
  82.                 string newSessionID = Guid.NewGuid().ToString(); 
  83.                 HttpCookie newCookie = new HttpCookie(SessionName, newSessionID); 
  84.                 newCookie.HttpOnly = IsReadOnly; 
  85.                 newCookie.Expires = DateTime.Now.AddMinutes(Timeout); 
  86.                 context.Response.Cookies.Add(newCookie); 
  87.                 return "Session_"+newSessionID; 
  88.             } 
  89.             else 
  90.             { 
  91.                 return "Session_"+cookie.Value; 
  92.             } 
  93.         } 
  94.  
  95.         // 
  96.         // 摘要: 
  97.         //     按名稱獲取或設置會話值。 
  98.         // 
  99.         // 參數: 
  100.         //   name: 
  101.         //     會話值的鍵名。 
  102.         // 
  103.         // 返回結果: 
  104.         //     具有指定名稱的會話狀態值;如果該項不存在,則為 null。 
  105.         public object this[string name] 
  106.         { 
  107.             get 
  108.             { 
  109.                 return RedisBase.Hash_Get<object>(SessionID, name); 
  110.             } 
  111.             set 
  112.             { 
  113.                 RedisBase.Hash_Set<object>(SessionID, name, value); 
  114.             } 
  115.         } 
  116.  
  117.         // 摘要: 
  118.         //     判斷會話中是否存在指定key 
  119.         // 
  120.         // 參數: 
  121.         //   name: 
  122.         //     鍵值 
  123.         // 
  124.         public bool IsExistKey(string name) 
  125.         { 
  126.             return RedisBase.Hash_Exist<object>(SessionID, name); 
  127.         } 
  128.  
  129.         // 
  130.         // 摘要: 
  131.         //     向會話狀態集合添加一個新項。 
  132.         // 
  133.         // 參數: 
  134.         //   name: 
  135.         //     要添加到會話狀態集合的項的名稱。 
  136.         // 
  137.         //   value: 
  138.         //     要添加到會話狀態集合的項的值。 
  139.         public void Add(string name, object value) 
  140.         { 
  141.             RedisBase.Hash_Set<object>(SessionID, name, value); 
  142.         } 
  143.         // 
  144.         // 摘要: 
  145.         //     從會話狀態集合中移除所有的鍵和值。 
  146.         public void Clear() 
  147.         { 
  148.             RedisBase.Hash_Remove(SessionID); 
  149.         } 
  150.  
  151.         // 
  152.         // 摘要: 
  153.         //     刪除會話狀態集合中的項。 
  154.         // 
  155.         // 參數: 
  156.         //   name: 
  157.         //     要從會話狀態集合中刪除的項的名稱。 
  158.         public void Remove(string name) 
  159.         { 
  160.             RedisBase.Hash_Remove(SessionID,name); 
  161.         } 
  162.         // 
  163.         // 摘要: 
  164.         //     從會話狀態集合中移除所有的鍵和值。 
  165.         public void RemoveAll() 
  166.         { 
  167.             Clear(); 
  168.         } 
  169.     } 

下面是實現類似在cs文件中能直接使用Session["UserId"]的方式,我的MyPage類繼承Page實現了自己的邏輯主要做了兩件事  1:初始化RedisSession  2:實現統一登錄認證,OnPreInit方法里面判斷用戶是否登錄,如果沒有登錄了則跳轉到登陸界面

  1. using System; 
  2. using System.Collections.Generic; 
  3. using System.Linq; 
  4. using System.Web; 
  5. using System.Web.UI; 
  6.  
  7. namespace ResidSessionDemo.RedisDemo 
  8.     /// <summary> 
  9.     /// 自定義Page 實現以下功能 
  10.     /// 1.初始化RedisSession 
  11.     /// 2.實現頁面登錄驗證,繼承此類,則可以實現所有頁面的登錄驗證 
  12.     /// </summary> 
  13.     public class MyPage:Page 
  14.     { 
  15.         private RedisSession redisSession; 
  16.  
  17.         /// <summary> 
  18.         /// RedisSession 
  19.         /// </summary> 
  20.         public RedisSession RedisSession 
  21.         { 
  22.             get 
  23.             { 
  24.                 if (redisSession == null) 
  25.                 { 
  26.                     redisSession = new RedisSession(Context, true, 20); 
  27.                 } 
  28.                 return redisSession; 
  29.             } 
  30.         } 
  31.  
  32.         protected override void OnPreInit(EventArgs e) 
  33.         { 
  34.             base.OnPreInit(e); 
  35.             //判斷用戶是否已經登錄,如果未登錄,則跳轉到登錄界面 
  36.             if (!RedisSession.IsExistKey("UserCode")) 
  37.             { 
  38.                 Response.Redirect("Login.aspx"); 
  39.             } 
  40.         } 
  41.     } 

 我們來看看Default.aspx.cs是如何使用RedisSession的,至此我們實現了和Asp.netSession一模一樣的功能和使用方式。

  1. RedisSession.Remove("UserCode"); 

  相比StateServer,RedisSession具有以下優點

  1.redis服務器重啟不會丟失數據 2.可以使用redis的讀寫分離個集群功能更加高效讀寫數據

  測試效果,使用nginx和iis部署兩個站點做負載均衡,iis1地址127.0.0.1:8002 iis2地址127.0.0.1:9000 nginx代理服務地址127.0.0.1:8003,不懂如何配置的可以去閱讀我的nginx+iis實現負載均衡這篇文章。我們來看一下測試結果。

  訪問127.0.0.1:8003 需要進行登錄 用戶名為admin 密碼為123

  

 

  登錄成功以后,重點關注端口號信息

  

 

  刷新頁面,重點關注端口號信息

  

 

  可以嘗試直接訪問iis1地址127.0.0.1:8002 iis2地址127.0.0.1:9000 這兩個站點,你會發現都不需要登錄了。至此我們的redis實現session功能算是大功告成了。

  回到頂部

  問題拓展

  使用redis實現session告一段落,下面留個問題討論一下方案。微信開發提供了很多接口,參考下面截圖,可以看到獲取access_token接口每日最多調用2000次,現在大公司提供的很多接口針對不對級別的用戶接口訪問次數限制都是不一樣的,至于做這個限制的原因應該是防止惡意攻擊和流量限制之類的。那么我的問題是怎么實現這個接口調用次數限制功能。大家可以發揮想象力參與討論哦,或許你也會碰到這個問題。

  

 

  先說下我知道的兩種方案:

  1.使用流量整形中的令牌桶算法,大小固定的令牌桶可自行以恒定的速率源源不斷地產生令牌。如果令牌不被消耗,或者被消耗的速度小于產生的速度,令牌就會不斷地增多,直到把桶填滿。后面再產生的令牌就會從桶中溢出。最后桶中可以保存的最大令牌數永遠不會超過桶的大小。

  說淺顯點:比如上面的獲取access_token接口,一天2000次的頻率,即1次/分鐘。我們令牌桶容量為2000,可以使用redis 最簡單的key/value來存儲 ,key為用戶id,value為整形存儲還可使用次數,然后使用一個定時器1分鐘調用client.Incr(key) 實現次數自增;用戶每訪問一次該接口,相應的client.Decr(key)來減少使用次數。

  但是這里存在一個性能問題,這僅僅是針對一個用戶來說,假設有10萬個用戶,怎么使用定時器來實現這個自增操作呢,難道是循環10萬次分別調用client.Incr(key)嗎?這一點沒有考慮清楚。

  2.直接用戶訪問一次 先進行總次數判斷,符合條件再就進行一次自增

  

      兩種方案優缺點比較
  優點 缺點
令牌桶算法 流量控制精確  實現復雜,并且由于控制精確反而在實際應用中有麻煩,很可能用戶在晚上到凌晨期間訪問接口次數不多,白天訪問次數多些。
簡單算法 實現簡單可行,效率高  流量控制不精確
 

  總結

  本篇從實際應用講解了redis,后面應該還會有幾篇繼續介紹redis實際應用,敬請期待!

  本篇文章用到的資源打包下載地址:redis_demo

 

  svn下載地址:http://code.taobao.org/svn/ResidSessionDemo/

責任編輯:honglu 來源: 博客園
相關推薦

2020-03-20 14:48:46

SpringBootJava分布式

2014-05-08 14:38:26

tornadoredissession

2024-10-07 10:07:31

2024-04-01 05:10:00

Redis數據庫分布式鎖

2023-12-29 08:18:31

Session分布式系統微服務

2023-08-21 19:10:34

Redis分布式

2022-01-06 10:58:07

Redis數據分布式鎖

2019-06-19 15:40:06

分布式鎖RedisJava

2019-07-31 08:44:27

Session共享Memcache

2015-06-17 14:10:34

Redis分布式系統協調

2023-01-13 07:39:07

2019-02-26 09:51:52

分布式鎖RedisZookeeper

2021-03-08 09:56:24

存儲分布式Session

2024-06-13 09:34:35

JWTTokenSpring

2024-01-02 13:15:00

分布式鎖RedissonRedis

2022-06-28 08:37:07

分布式服務器WebSocket

2020-07-30 09:35:09

Redis分布式鎖數據庫

2020-07-15 16:50:57

Spring BootRedisJava

2023-03-01 08:07:51

2018-11-28 16:00:41

點贊
收藏

51CTO技術棧公眾號

在线免费看污网站| 国产精品99久久久久久大便| 男人午夜免费视频| 欧美猛男男男激情videos| 欧美婷婷六月丁香综合色| 天天综合五月天| 色av男人的天堂免费在线| 蜜桃精品视频在线| 久久久噜噜噜久久中文字免| 欧美激情aaa| 精品一区二区三区视频在线播放 | 日韩国产欧美在线视频| 久久久国产在线视频| 久久人妻一区二区| 国产精品久久免费视频| 色综合久久久网| 久久av喷吹av高潮av| 欧美亚洲日本| 成人h动漫精品一区二区| 国产美女久久精品| 西西44rtwww国产精品| 欧美在线播放| 在线视频中文亚洲| free性中国hd国语露脸| 精品午夜视频| 欧美日韩在线综合| 日本中文字幕片| 超碰在线资源| 中文字幕一区二| 日韩成人在线资源| 欧美综合视频在线| 国产精选一区二区三区| 国产精自产拍久久久久久| 中文字幕亚洲精品一区| 激情丁香综合| 欧美日韩高清在线观看| 久久国产高清视频| 北条麻妃国产九九九精品小说| 亚洲精品99久久久久中文字幕| 欧美又黄又嫩大片a级| 欧洲成人一区| 欧美亚洲国产一区二区三区va| 免费无码毛片一区二三区| 国产成人在线视频免费观看| 国产精品美女久久久久久| 日本一区视频在线| 国产大片在线免费观看| 久久女同性恋中文字幕| 国产在线精品一区二区三区| 国产 日韩 欧美 精品| 国产精品一区2区| 成人免费福利在线| 国产精品久久久久久久免费| 久久草av在线| 国产精品免费久久久久影院| 中文字幕在线天堂| 丝袜脚交一区二区| 国产精品爱久久久久久久| 国产精品视频一区在线观看| 亚洲综合另类| 欧美一级大片在线观看| 亚洲午夜18毛片在线看| 午夜在线观看免费一区| 人妖精品videosex性欧美| 欧美一区二区激情视频 | 老头吃奶性行交视频| 2022成人影院| 欧美色电影在线| 中文字幕免费高清在线| 欧美成年网站| 亚洲成人精品视频| 短视频在线观看| 欧美色图国产精品| 搡老女人一区二区三区视频tv| 亚洲不卡的av| 影音先锋日韩在线| 欧美激情视频在线观看| 日韩三级视频在线| 天堂av在线一区| 成人黄色网免费| 亚洲av无码乱码在线观看性色| www..com久久爱| 日本中文不卡| www.久久久久.com| 亚洲一区二区精品视频| 无码人妻丰满熟妇区五十路百度| 全球最大av网站久久| 欧美一区二区美女| 亚洲黄色免费在线观看| 日本久久黄色| 欧美高清视频一区二区| 欧美一区免费看| 国内外成人在线| 国产美女99p| www在线播放| 亚洲国产精品久久不卡毛片 | 国产精品小仙女| 精品日韩欧美| 毛片网站在线免费观看| 欧美日韩国产精品一区| 天天操天天干天天做| 噜噜噜天天躁狠狠躁夜夜精品| 亚洲日韩第一页| 久久99久久久| 日本三级亚洲精品| 国产精品久久久久久久小唯西川| 国产一级免费在线观看| 亚洲一区在线观看视频| 欧美三级午夜理伦三级富婆| 麻豆一区二区麻豆免费观看| 久久久国产成人精品| 欧美啪啪小视频| 国产宾馆实践打屁股91| 亚洲欧美国产不卡| 涩涩涩在线视频| 欧美一区二区三区免费| 日韩中文字幕有码| 国产欧美69| 99久久国产免费免费| 一区二区三区视频在线观看视频| 精品久久久久久久久久久久| 亚洲妇女无套内射精| 久久在线播放| 国产精品国产自产拍高清av水多| 色噜噜在线播放| 亚洲黄色小说网站| 亚洲a级黄色片| av亚洲在线观看| 欧美在线视频一二三| 亚洲产国偷v产偷v自拍涩爱| 中文字幕一区二区三区乱码在线| 久久9精品区-无套内射无码| 精品资源在线| 久久久久久伊人| 国产夫妻性生活视频| 中文字幕中文字幕一区二区| 熟女人妇 成熟妇女系列视频| 女仆av观看一区| 久久久久久成人| 亚洲av少妇一区二区在线观看| 日韩一区在线播放| 天天干天天操天天做| 成人羞羞网站入口| 国产成人久久久精品一区| 五月婷婷开心中文字幕| 亚洲第一主播视频| 国产激情视频网站| 国产情侣久久| 激情视频一区二区| 国产乱码午夜在线视频| 日韩av一区在线观看| 国产午夜小视频| 成人白浆超碰人人人人| 丰满少妇大力进入| 麻豆视频一区| 日韩av色在线| 成人午夜影视| 精品视频在线免费| 欧美三级黄色大片| 国产毛片精品国产一区二区三区| 青青草综合视频| 日本99精品| 国内精品模特av私拍在线观看| 成人小说亚洲一区二区三区 | 国产精品va在线观看无码| 亚洲精品一二三**| 97免费在线视频| 男女av在线| 欧美日韩免费观看一区二区三区 | 欧美日韩国产一区在线| 中文字幕一区二区人妻在线不卡| 久久国产一二区| 亚洲图片欧洲图片日韩av| 99精品视频在线免费播放| 久99九色视频在线观看| 无码精品黑人一区二区三区| 色婷婷综合中文久久一本| 成人免费视频入口| 国产精品系列在线观看| 无码播放一区二区三区| 成人3d动漫在线观看| 91精品视频观看| 激情aⅴ欧美一区二区欲海潮| 亚洲午夜久久久久久久| 国产伦精品一区二区三区视频痴汉 | 免费精品在线视频| 国产v日产∨综合v精品视频| 久久精品99国产| 亚洲精彩视频| 久久大片网站| 精品成人18| 国产成人午夜视频网址| 超碰在线网址| 亚洲免费一在线| 99在线精品视频免费观看20| 欧美天堂在线观看| 男人操女人的视频网站| 91日韩精品一区| 波多野结衣网页| 老司机一区二区三区| 日日噜噜噜夜夜爽爽| 日韩手机在线| av一区二区三区在线观看| 666av成人影院在线观看| 欧美精品在线免费观看| 搞黄视频在线观看| 欧美精品一区二区三区四区 | 秋霞电影网一区二区| 轻点好疼好大好爽视频| 国产中文精品久高清在线不| 动漫美女被爆操久久久| 久久青草视频| 青青草国产精品一区二区| 婷婷在线播放| 在线观看亚洲视频| 欧洲亚洲精品视频| 精品国产免费视频| 国内精品久久久久久久久久| 在线观看国产日韩| 啦啦啦免费高清视频在线观看| 亚洲人成精品久久久久| 一区二区三区在线观看免费视频| av午夜一区麻豆| 下面一进一出好爽视频| 美女久久久精品| 国产在线观看福利| 亚洲精选国产| 欧美图片激情小说| 综合色一区二区| 艳母动漫在线免费观看| 欧美一级精品| 欧美日韩亚洲在线| 欧美男人操女人视频| 超碰在线97av| 一区二区三区免费在线看| 91热精品视频| 日日狠狠久久| 成人美女av在线直播| 成人黄色91| 91精品国产综合久久香蕉| 精品福利在线| 国产一区深夜福利| 亚洲a成人v| 成人精品一区二区三区电影免费| 巨胸喷奶水www久久久免费动漫| 日韩av男人的天堂| 日韩av中字| 国产成人免费av| 成人黄色免费网站| 国产日韩欧美中文在线播放| 欧美亚洲黄色| 91欧美精品午夜性色福利在线| 亚洲黑人在线| 2014亚洲精品| 福利片一区二区| 久久亚洲一区二区| 久久不见久久见中文字幕免费 | 精品少妇人妻av一区二区三区| 国产成人在线观看免费网站| 国产精品嫩草69影院| 不卡视频一二三四| 中文字幕在线看高清电影| 国产日产欧美一区| 国产精品国产三级国产传播| 亚洲精品视频一区| 久草视频精品在线| 色婷婷av一区二区| 一级视频在线播放| 日韩欧美精品三级| 欧美熟妇另类久久久久久不卡| 亚洲精品狠狠操| 国产在线中文字幕| 日韩中文字幕免费看| 在线观看小视频| 8090成年在线看片午夜| 精品欧美一区二区三区在线观看 | 涩爱av色老久久精品偷偷鲁| 俄罗斯精品一区二区三区| 日韩极品在线| 在线观看日韩羞羞视频| 好看的亚洲午夜视频在线| a级黄色一级片| 美国十次了思思久久精品导航| 无码人妻一区二区三区在线视频| aa级大片欧美| 成年人免费视频播放| 亚洲综合免费观看高清完整版在线| 免费观看一区二区三区毛片| 欧美日韩亚洲另类| 日日躁夜夜躁白天躁晚上躁91| 伊人激情综合网| 少女频道在线观看免费播放电视剧| 欧美一区二区三区免费观看| 四虎影视国产精品| 久久综合久久久| 国产精品国产一区| 日韩欧美一区三区| 国产伦精品一区二区三区在线观看| 成人免费无码大片a毛片| 最近日韩中文字幕| 狠狠人妻久久久久久| 欧美一区二区在线免费播放| 无码精品黑人一区二区三区| xxx欧美精品| 亚洲www.| 精品国产综合久久| 欧美不卡在线| 天堂av在线网站| 91亚洲精品乱码久久久久久蜜桃 | 蜜臀aⅴ国产精品久久久国产老师| 久久精品一区蜜桃臀影院| 久久久久久久久久久久久久免费看 | 夜夜躁日日躁狠狠久久av| 亚洲成人精品av| av在线免费网址| 国产日韩欧美综合| 精品毛片免费观看| 欧美 日韩 国产在线观看| 国产精品一区二区果冻传媒| 在线观看天堂av| 色欧美日韩亚洲| 婷婷五月综合久久中文字幕| 欧美区在线播放| 欧美高清影院| 亚洲精美视频| 久久精品伊人| 亚洲天堂成人av| 亚洲高清在线视频| 国产成人精品亚洲精品色欲| 久久精品视频播放| 91大神在线观看线路一区| 日韩成人在线资源| 日韩成人一级片| 国产熟妇久久777777| 色综合久久99| 美女欧美视频在线观看免费| 午夜免费久久久久| 国产精品丝袜在线播放| 免费看欧美黑人毛片| 国产福利一区二区三区在线视频| 黄色av片三级三级三级免费看| 欧美亚洲国产bt| av电影在线观看| 国产男人精品视频| 成人vr资源| 玖玖爱视频在线| 中文字幕中文乱码欧美一区二区| 一区二区美女视频| 久久九九国产精品怡红院| 伊人久久综合网另类网站| 国产高潮呻吟久久久| 国精产品一区一区三区mba桃花 | 99在线热播精品免费99热| 伊人网综合视频| 日韩欧美成人精品| 成人影视在线播放| 成人日韩在线电影| 欧美日韩1080p| av网页在线观看| 日韩人在线观看| 在线观看精品一区二区三区| 成人久久精品视频| 激情成人综合| 精品人妻一区二区三区蜜桃视频| 91国产视频在线观看| 日本激情视频在线观看| 99久热re在线精品视频| 一区二区三区国产盗摄| 日本乱子伦xxxx| 在线播放91灌醉迷j高跟美女 | 国产精品免费一区豆花| 日本一二区不卡| 精产国品一区二区三区| 精品电影在线观看| av大片在线观看| 高清视频一区二区三区| 羞羞答答国产精品www一本| 成人免费视频入口| 亚洲成年网站在线观看| 亚洲第一会所| 超碰10000| 国产亚洲成av人在线观看导航| 国产精品久久久国产盗摄| 午夜欧美不卡精品aaaaa| 日韩免费特黄一二三区| 中文在线字幕观看| 欧美色图免费看| 日本资源在线| 亚洲国产精品毛片| 国产成人av一区| 国产成人av免费| 久久久久久久久久久久久久久久久久av | 日韩欧美国产wwwww| 超级碰碰久久| 亚洲五码在线观看视频| 久久午夜免费电影| www.欧美国产| 国产精品成人av在线| 合欧美一区二区三区| 黑人と日本人の交わりビデオ|