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

91麻豆高清视频| 亚洲国产二区| 欧美一卡二卡在线观看| 国产精品专区在线| 黄色电影免费在线看| 狠狠色丁香久久婷婷综合_中| 欧美国产精品人人做人人爱| 黑人巨大精品欧美| 二区三区精品| 一本色道综合亚洲| 免费的av在线| 日本激情一区二区| 免费av网站大全久久| 久久久久久国产精品| 91激情视频在线观看| 日韩成人视屏| 欧美三级中文字| 成年人午夜视频在线观看| 1024视频在线| 92国产精品观看| 亚洲最大福利视频| 亚洲午夜精品久久久| 亚洲免费网址| 欧美激情videos| 国产精品免费在线视频| 欧美人与物videos另类xxxxx| 色是在线视频| 国产 日韩 欧美大片| 国产精品久久久久av| 日本在线观看中文字幕| 久久久久久久久国产一区| 亚洲欧美在线x视频| 亚洲视频 中文字幕| 国产精品久久久久久久久久辛辛| 色8久久精品久久久久久蜜| 国产精品69久久久| 日本在线观看高清完整版| 亚洲欧美在线aaa| 亚洲一区二区三区乱码| 韩国三级在线观看久| 91蜜桃网址入口| 精品999在线观看| 成人久久久精品国产乱码一区二区| 精品一二三四区| 国产精自产拍久久久久久| 久久久久久亚洲av无码专区| 国产欧美丝祙| 91精品国产成人| 亚洲精品1区2区3区| 亚洲日本激情| 久久久午夜视频| 日本三级视频在线| 国内一区二区三区| 欧美黑人性猛交| 久久机热这里只有精品| 欧美午夜不卡| 高清一区二区三区日本久| 国产午夜福利片| 极品中文字幕一区| 97激碰免费视频| 久久精品视频1| 久久精品盗摄| 国产精品色婷婷视频| 最近中文字幕免费在线观看| 男男视频亚洲欧美| 国产综合色香蕉精品| 国产美女精品视频国产| 国产精品自拍一区| 国产精品免费区二区三区观看| 国产精品无码在线播放| 国产成人小视频| 国产一区二区中文字幕免费看| 天天操天天干天天干| 久久先锋影音av鲁色资源 | 久久日本片精品aaaaa国产| 欧美午夜片在线看| aaaaaaaa毛片| 日韩精品a在线观看91| 中文亚洲视频在线| 538精品在线视频| 在线视频观看日韩| 国产精品久久久久久久久久免费 | 国产麻豆精品久久一二三| 99超碰麻豆| 日本高清中文字幕二区在线| 国产蜜臀97一区二区三区| 男女h黄动漫啪啪无遮挡软件| 日本三级在线观看网站 | 99国产精品久久久久久久成人| 国产一区视频网站| 久久精品一区二区三区不卡免费视频 | 3344国产永久在线观看视频| 日韩欧美在线中文字幕| 亚洲第一区第二区第三区| 日韩美女国产精品| 日韩在线观看精品| 日韩精品视频免费看| 男女男精品视频| 精品久久精品久久| 免费成人黄色| 日本道免费精品一区二区三区| 亚洲一二三不卡| 精品中文一区| 久久久久久午夜| 国产又粗又长又大视频| 91亚洲国产成人精品一区二区三| 亚洲日本japanese丝袜| 草美女在线观看| 欧美二区三区91| 黄色a一级视频| 午夜精品亚洲| 国产欧美精品一区二区| 色视频免费在线观看| 亚洲欧美日韩国产一区二区三区| wwwxxx黄色片| 噜噜噜狠狠夜夜躁精品仙踪林| 日韩在线观看免费网站| 九一国产在线观看| 成人一区二区三区中文字幕| 亚洲一区二区免费视频软件合集| 波多野结衣亚洲| 精品三级av在线| 欧美国产日韩在线观看成人| 日韩av不卡在线观看| 欧美18视频| 98色花堂精品视频在线观看| 日韩你懂的电影在线观看| 国产美女高潮视频| 青青草国产成人99久久| 欧洲精品国产| 亚洲妇女成熟| 亚洲福利视频网站| 久久视频免费在线观看| 国产成人免费在线视频| 免费观看国产视频在线| 亚洲一区二区三区久久久| 中文字幕自拍vr一区二区三区| 五月天婷婷导航| 久久蜜桃一区二区| 99精品免费在线观看| 久久不见久久见免费视频7| 91高清在线免费观看| 色一情一乱一乱一区91av| 亚洲第一av色| av电影在线播放| 国产主播精品| 激情久久av| 精品极品在线| 精品亚洲va在线va天堂资源站| 日本在线观看视频网站| av一区二区久久| 青青草视频在线免费播放 | 亚洲精品白浆高清久久久久久| 久久久久久久久97| 成人黄色在线视频| 国产91在线免费| 免费看成人吃奶视频在线| 国产91九色视频| 色网站在线看| 日韩一区二区三区精品视频| 欧美人与禽zozzo禽性配| 国产99久久久精品| 欧美 日韩 国产在线观看| 亚洲a级精品| 国产精品国产福利国产秒拍| 毛片在线播放a| 欧美成人bangbros| 久草视频在线观| 欧美韩国日本不卡| 亚洲18在线看污www麻豆| 欧美黄色aaaa| 久久国产精品 国产精品| 黄瓜视频成人app免费| 日韩在线观看免费全集电视剧网站| 国产美女三级无套内谢| 亚洲综合一区二区| 无码人妻精品一区二区三区温州 | 91精品又粗又猛又爽| 男人的天堂亚洲| 一区二区三区精品国产| 成人另类视频| 国产精品成人观看视频国产奇米| 日本蜜桃在线观看| 亚洲第五色综合网| 日本中文字幕在线观看视频| 亚洲欧美日韩中文播放| 国产 中文 字幕 日韩 在线| 美女视频网站黄色亚洲| 国产va亚洲va在线va| 成人精品天堂一区二区三区| 亚洲一区二区三区xxx视频| 天堂中文在线播放| 久久亚洲一区二区三区四区五区高 | 久草网站在线观看| 久久久亚洲高清| 一起草最新网址| 日韩vs国产vs欧美| av在线观看地址| 97在线精品| 美女精品国产| 亚洲日本视频在线| 国产精品视频男人的天堂| 国产嫩草在线视频| 精品国偷自产在线视频| 久久久久久久久亚洲精品| 日韩视频一区在线观看| 中文字幕理论片| 懂色av一区二区三区| 午夜精品一区二区三区视频| 国产日产精品1区| 视频免费在线观看| 国产乱人伦偷精品视频不卡| 男人的天堂日韩| 亚洲高清av| 成人在线免费高清视频| 久久大综合网| 欧美午夜视频在线| 国产一区二区三区亚洲| 成人免费视频a| 99re66热这里只有精品4| 78m国产成人精品视频| 免费在线观看的电影网站| 久久精品国产亚洲7777| 成年人视频在线观看免费| 亚洲精品小视频在线观看| 欧美一级淫片aaaaaa| 欧美一级日韩一级| 91在线视频国产| 精品1区2区3区| 亚洲天堂2021av| 欧美又粗又大又爽| 无码人妻精品一区二区三区蜜桃91 | 国产成人自拍视频在线| 亚洲最大成人网4388xx| 欧美性猛交xxxxx少妇| 中文字幕在线播放不卡一区| 国产午夜精品福利视频| 国产日产欧美一区二区视频| 非洲一级黄色片| 国产午夜精品一区二区| 30一40一50老女人毛片| 久久视频一区二区| 玖玖爱在线观看| 久久理论电影网| 亚洲精品国产91| 亚洲国产精品99久久久久久久久| 日本污视频网站| 成人欧美一区二区三区| 肉色超薄丝袜脚交69xx图片| |精品福利一区二区三区| 久久嫩草捆绑紧缚| 亚洲精品伦理在线| 精品在线视频观看| 天天亚洲美女在线视频| 国产午夜麻豆影院在线观看| 日本高清不卡在线观看| 中文字幕1区2区3区| 欧美猛男男办公室激情| 99久久免费国产精精品| 日韩精品中文字幕在线一区| 六月婷婷综合网| 国产偷亚洲偷欧美偷精品| 蜜桃视频在线入口www| 最近中文字幕2019免费| 日本不卡视频| 久久久久久一区二区三区| 在线视频cao| 国产精品美女视频网站| 精品久久亚洲| 国产日韩二区| 欧美三级伦理在线| dy888午夜| 日韩图片一区| 国产高清视频网站| 国产精品自拍网站| 毛片网站免费观看| 亚洲欧洲www| 国产精品999久久久| 日本国产一区二区| 精品人妻无码一区二区色欲产成人| 亚洲第一福利网| www亚洲人| 欧美福利视频在线| 成人开心激情| 99re视频| 精品国产一级毛片| 欧美这里只有精品| 毛片一区二区三区| v天堂中文在线| 国产精品的网站| 一区二区三区视频免费看| 欧美色视频一区| 欧美视频在线观看一区二区三区| 国产亚洲精品美女久久久久| 日韩av官网| 国产日韩中文字幕在线| 欧美爱爱网站| 超碰97在线看| 日本亚洲最大的色成网站www| 久久精品aⅴ无码中文字字幕重口| 久久久国产精华| 国产精品自拍视频一区| 欧美日韩国产电影| 少妇激情av一区二区| 久久这里只有精品99| 最新日韩三级| 精品久久久三级| 欧美黄色aaaa| 污污视频网站在线| 久久精品日产第一区二区三区高清版| 久草视频免费在线播放| 欧美日韩一区三区| 欧美成人片在线| 久久欧美在线电影| 国产精品一区免费在线| 亚洲视频小说| 日韩高清不卡在线| 魔女鞋交玉足榨精调教| 亚洲成人资源在线| 精品国产一级片| 久久精品电影网站| 成人免费一区| 日韩黄色影视| 蜜乳av另类精品一区二区| 95视频在线观看| 亚洲精品欧美专区| 国产精品人人爽| 最近2019中文字幕第三页视频| 欧美日韩视频免费观看| 欧美一区二区在线| 久久久久国产精品一区三寸| 大尺度做爰床戏呻吟舒畅| 亚洲综合无码一区二区| www.黄色国产| 欧美激情一区二区三区在线视频观看| 欧美午夜网站| 免费看日b视频| 国产91丝袜在线观看| 激情五月婷婷小说| 欧美大片日本大片免费观看| 午夜伦理大片视频在线观看| 3d精品h动漫啪啪一区二区| 欧美一区二区| 熟妇女人妻丰满少妇中文字幕| 亚洲精选视频免费看| 国产哺乳奶水91在线播放| 欧美大码xxxx| 91精品久久久久久综合五月天| 乱熟女高潮一区二区在线| 国产乱人伦偷精品视频不卡| 久久国产精品波多野结衣| 欧美精品一区二区在线播放| av在线不卡免费| 蜜桃视频成人| 日韩成人免费电影| 日韩精品123区| 日韩丝袜美女视频| av漫画网站在线观看| 免费在线国产精品| 日本va欧美va精品| 婷婷激情四射网| 欧美成人精品1314www| 国产精选在线| 久久精品久久精品国产大片| 视频在线观看91| 三上悠亚在线观看视频| 精品日本一线二线三线不卡| 超碰99在线| 神马一区二区影院| 国产一区二区三区四区在线观看| 欧美黑人精品一区二区不卡| 亚洲精品www久久久| 成人免费网站www网站高清| 激情五月五月婷婷| 99国产欧美久久久精品| www.久久视频| 欧美精品少妇videofree| 色综合久久中文| 成 人 黄 色 小说网站 s色| 一区二区三区91| 成人好色电影| 古典武侠综合av第一页| 久久精品男女| 成年人av电影| 亚洲小视频在线观看| 亚洲综合影院| 久久婷五月综合| 性久久久久久久久| 91官网在线| 极品尤物一区二区三区| 精品一区二区三区免费毛片爱| 日本三级黄色大片| 日韩视频亚洲视频| 亚洲小说图片视频| 波多野结衣免费观看| 一本色道久久综合狠狠躁的推荐| а天堂中文在线官网| 日本精品免费| 成人av网址在线| 国产人妻精品一区二区三|