午夜视频免费看_日韩三级电影网站_国产精品久久一级_亚洲一级在线播放_人妻体内射精一区二区三区_91夜夜揉人人捏人人添红杏_91福利在线导航_国产又粗又猛又黄又爽无遮挡_欧美日韩一区在线播放_中文字幕一区二区三区四区不卡 _日日夜夜精品视频免费观看_欧美韩日一区二区三区

主頁 > 知識庫 > Redis中的String類型及使用Redis解決訂單秒殺超賣問題

Redis中的String類型及使用Redis解決訂單秒殺超賣問題

熱門標簽:地圖標注工廠入駐 b2b外呼系統(tǒng) 四川穩(wěn)定外呼系統(tǒng)軟件 400電話辦理的口碑 一個地圖標注多少錢 廊坊外呼系統(tǒng)在哪買 南京手機外呼系統(tǒng)廠家 臺灣電銷 高碑店市地圖標注app

本系列將和大家分享Redis分布式緩存,本章主要簡單介紹下Redis中的String類型,以及如何使用Redis解決訂單秒殺超賣問題。

Redis中5種數(shù)據(jù)結構之String類型:key-value的緩存,支持過期,value不超過512M。

Redis是單線程的,比如SetAll AppendToValue GetValues GetAndSetValue IncrementValue IncrementValueBy等等,這些看上去像是組合命令,但實際上是一個具體的命令,是一個原子性的命令,不可能出現(xiàn)中間狀態(tài),可以應對一些并發(fā)情況。下面我們直接通過代碼來看下具體使用。

首先來看下Demo的項目結構:

此處推薦使用的是ServiceStack包,雖然它是收費的,有1小時3600次請求限制,但是它是開源的,可以將它的源碼下載下來破解后使用,網(wǎng)上應該有挺多相關資料,有興趣的可以去了解一波。

一、Redis中與String類型相關的API

首先先來看下Redis客戶端的初始化工作:

using System;

namespace TianYa.Redis.Init
{
 /// summary>
 /// redis配置文件信息
 /// 也可以放到配置文件去
 /// /summary>
 public sealed class RedisConfigInfo
 {
  /// summary>
  /// 可寫的Redis鏈接地址
  /// format:ip1,ip2
  /// 
  /// 默認6379端口
  /// /summary>
  public string WriteServerList = "127.0.0.1:6379";

  /// summary>
  /// 可讀的Redis鏈接地址
  /// format:ip1,ip2
  /// 
  /// 默認6379端口
  /// /summary>
  public string ReadServerList = "127.0.0.1:6379";

  /// summary>
  /// 最大寫鏈接數(shù)
  /// /summary>
  public int MaxWritePoolSize = 60;

  /// summary>
  /// 最大讀鏈接數(shù)
  /// /summary>
  public int MaxReadPoolSize = 60;

  /// summary>
  /// 本地緩存到期時間,單位:秒
  /// /summary>
  public int LocalCacheTime = 180;

  /// summary>
  /// 自動重啟
  /// /summary>
  public bool AutoStart = true;

  /// summary>
  /// 是否記錄日志,該設置僅用于排查redis運行時出現(xiàn)的問題,
  /// 如redis工作正常,請關閉該項
  /// /summary>
  public bool RecordeLog = false;
 }
}
using ServiceStack.Redis;

namespace TianYa.Redis.Init
{
 /// summary>
 /// Redis管理中心
 /// /summary>
 public class RedisManager
 {
  /// summary>
  /// Redis配置文件信息
  /// /summary>
  private static RedisConfigInfo _redisConfigInfo = new RedisConfigInfo();

  /// summary>
  /// Redis客戶端池化管理
  /// /summary>
  private static PooledRedisClientManager _prcManager;

  /// summary>
  /// 靜態(tài)構造方法,初始化鏈接池管理對象
  /// /summary>
  static RedisManager()
  {
   CreateManager();
  }

  /// summary>
  /// 創(chuàng)建鏈接池管理對象
  /// /summary>
  private static void CreateManager()
  {
   string[] writeServerConStr = _redisConfigInfo.WriteServerList.Split(',');
   string[] readServerConStr = _redisConfigInfo.ReadServerList.Split(',');
   _prcManager = new PooledRedisClientManager(readServerConStr, writeServerConStr,
    new RedisClientManagerConfig
    {
     MaxWritePoolSize = _redisConfigInfo.MaxWritePoolSize,
     MaxReadPoolSize = _redisConfigInfo.MaxReadPoolSize,
     AutoStart = _redisConfigInfo.AutoStart,
    });
  }

  /// summary>
  /// 客戶端緩存操作對象
  /// /summary>
  public static IRedisClient GetClient()
  {
   return _prcManager.GetClient();
  }
 }
}
using System;
using TianYa.Redis.Init;
using ServiceStack.Redis;

namespace TianYa.Redis.Service
{
 /// summary>
 /// redis操作的基類
 /// /summary>
 public abstract class RedisBase : IDisposable
 {
  /// summary>
  /// Redis客戶端
  /// /summary>
  protected IRedisClient _redisClient { get; private set; }

  /// summary>
  /// 構造函數(shù)
  /// /summary>
  public RedisBase()
  {
   this._redisClient = RedisManager.GetClient();
  }

  private bool _disposed = false;
  protected virtual void Dispose(bool disposing)
  {
   if (!this._disposed)
   {
    if (disposing)
    {
     _redisClient.Dispose();
     _redisClient = null;
    }
   }

   this._disposed = true;
  }

  public void Dispose()
  {
   Dispose(true);
   GC.SuppressFinalize(this);
  }

  /// summary>
  /// Redis事務處理示例
  /// /summary>
  public void Transcation()
  {
   using (IRedisTransaction irt = this._redisClient.CreateTransaction())
   {
    try
    {
     irt.QueueCommand(r => r.Set("key", 20));
     irt.QueueCommand(r => r.Increment("key", 1));
     irt.Commit(); //事務提交
    }
    catch (Exception ex)
    {
     irt.Rollback(); //事務回滾
     throw ex;
    }
   }
  }

  /// summary>
  /// 清除全部數(shù)據(jù) 請小心
  /// /summary>
  public virtual void FlushAll()
  {
   _redisClient.FlushAll();
  }

  /// summary>
  /// 保存數(shù)據(jù)DB文件到硬盤
  /// /summary>
  public void Save()
  {
   _redisClient.Save(); //阻塞式Save
  }

  /// summary>
  /// 異步保存數(shù)據(jù)DB文件到硬盤
  /// /summary>
  public void SaveAsync()
  {
   _redisClient.SaveAsync(); //異步Save
  }
 }
}

下面直接給大家Show一波Redis中與String類型相關的API:

using System;
using System.Collections.Generic;

namespace TianYa.Redis.Service
{
 /// summary>
 /// key-value 鍵值對 value可以是序列化的數(shù)據(jù) (字符串)
 /// /summary>
 public class RedisStringService : RedisBase
 {
  #region 賦值

  /// summary>
  /// 設置永久緩存
  /// /summary>
  /// param name="key">存儲的鍵/param>
  /// param name="value">存儲的值/param>
  /// returns>/returns>
  public bool Set(string key, string value)
  {
   return base._redisClient.Set(key, value);
  }

  /// summary>
  /// 設置永久緩存
  /// /summary>
  /// param name="key">存儲的鍵/param>
  /// param name="value">存儲的值/param>
  /// returns>/returns>
  public bool SetT>(string key, T value)
  {
   return base._redisClient.SetT>(key, value);
  }

  /// summary>
  /// 帶有過期時間的緩存
  /// /summary>
  /// param name="key">存儲的鍵/param>
  /// param name="value">存儲的值/param>
  /// param name="expireTime">過期時間/param>
  /// returns>/returns>
  public bool Set(string key, string value, DateTime expireTime)
  {
   return base._redisClient.Set(key, value, expireTime);
  }

  /// summary>
  /// 帶有過期時間的緩存
  /// /summary>
  /// param name="key">存儲的鍵/param>
  /// param name="value">存儲的值/param>
  /// param name="expireTime">過期時間/param>
  /// returns>/returns>
  public bool SetT>(string key, T value, DateTime expireTime)
  {
   return base._redisClient.SetT>(key, value, expireTime);
  }

  /// summary>
  /// 帶有過期時間的緩存
  /// /summary>
  /// param name="key">存儲的鍵/param>
  /// param name="value">存儲的值/param>
  /// param name="expireTime">過期時間/param>
  /// returns>/returns>
  public bool SetT>(string key, T value, TimeSpan expireTime)
  {
   return base._redisClient.SetT>(key, value, expireTime);
  }

  /// summary>
  /// 設置多個key/value
  /// /summary>
  public void SetAll(Dictionarystring, string> dic)
  {
   base._redisClient.SetAll(dic);
  }

  #endregion 賦值

  #region 追加

  /// summary>
  /// 在原有key的value值之后追加value,沒有就新增一項
  /// /summary>
  public long AppendToValue(string key, string value)
  {
   return base._redisClient.AppendToValue(key, value);
  }

  #endregion 追加

  #region 獲取值

  /// summary>
  /// 讀取緩存
  /// /summary>
  /// param name="key">存儲的鍵/param>
  /// returns>/returns>
  public string Get(string key)
  {
   return base._redisClient.GetValue(key);
  }

  /// summary>
  /// 讀取緩存
  /// /summary>
  /// param name="key">存儲的鍵/param>
  /// returns>/returns>
  public T GetT>(string key)
  {
   return
    _redisClient.ContainsKey(key)
    ? _redisClient.GetT>(key)
    : default;
  }

  /// summary>
  /// 獲取多個key的value值
  /// /summary>
  /// param name="keys">存儲的鍵集合/param>
  /// returns>/returns>
  public Liststring> Get(Liststring> keys)
  {
   return base._redisClient.GetValues(keys);
  }

  /// summary>
  /// 獲取多個key的value值
  /// /summary>
  /// param name="keys">存儲的鍵集合/param>
  /// returns>/returns>
  public ListT> GetT>(Liststring> keys)
  {
   return base._redisClient.GetValuesT>(keys);
  }

  #endregion 獲取值

  #region 獲取舊值賦上新值

  /// summary>
  /// 獲取舊值賦上新值
  /// /summary>
  /// param name="key">存儲的鍵/param>
  /// param name="value">存儲的值/param>
  /// returns>/returns>
  public string GetAndSetValue(string key, string value)
  {
   return base._redisClient.GetAndSetValue(key, value);
  }

  #endregion 獲取舊值賦上新值

  #region 移除緩存

  /// summary>
  /// 移除緩存
  /// /summary>
  /// param name="key">存儲的鍵/param>
  /// returns>/returns>
  public bool Remove(string key)
  {
   return _redisClient.Remove(key);
  }

  /// summary>
  /// 移除多個緩存
  /// /summary>
  /// param name="keys">存儲的鍵集合/param>
  public void RemoveAll(Liststring> keys)
  {
   _redisClient.RemoveAll(keys);
  }

  #endregion 移除緩存

  #region 輔助方法

  /// summary>
  /// 是否存在緩存
  /// /summary>
  /// param name="key">存儲的鍵/param>
  /// returns>/returns>
  public bool ContainsKey(string key)
  {
   return _redisClient.ContainsKey(key);
  }

  /// summary>
  /// 獲取值的長度
  /// /summary>
  /// param name="key">存儲的鍵/param>
  /// returns>/returns>
  public long GetStringCount(string key)
  {
   return base._redisClient.GetStringCount(key);
  }

  /// summary>
  /// 自增1,返回自增后的值
  /// /summary>
  /// param name="key">存儲的鍵/param>
  /// returns>/returns>
  public long IncrementValue(string key)
  {
   return base._redisClient.IncrementValue(key);
  }

  /// summary>
  /// 自增count,返回自增后的值
  /// /summary>
  /// param name="key">存儲的鍵/param>
  /// param name="count">自增量/param>
  /// returns>/returns>
  public long IncrementValueBy(string key, int count)
  {
   return base._redisClient.IncrementValueBy(key, count);
  }

  /// summary>
  /// 自減1,返回自減后的值
  /// /summary>
  /// param name="key">存儲的鍵/param>
  /// returns>/returns>
  public long DecrementValue(string key)
  {
   return base._redisClient.DecrementValue(key);
  }

  /// summary>
  /// 自減count,返回自減后的值
  /// /summary>
  /// param name="key">存儲的鍵/param>
  /// param name="count">自減量/param>
  /// returns>/returns>
  public long DecrementValueBy(string key, int count)
  {
   return base._redisClient.DecrementValueBy(key, count);
  }

  #endregion 輔助方法
 }
}

測試如下:

using System;

namespace MyRedis
{
 /// summary>
 /// 學生類
 /// /summary>
 public class Student
 {
  public int Id { get; set; }
  public string Name { get; set; }
  public string Remark { get; set; }
  public string Description { get; set; }
 }
}
using System;
using System.Collections.Generic;
using TianYa.Redis.Service;
using Newtonsoft.Json;

namespace MyRedis
{
 /// summary>
 /// ServiceStack API封裝測試 五大結構理解 (1小時3600次請求限制--可破解)
 /// /summary>
 public class ServiceStackTest
 {
  /// summary>
  /// String
  /// key-value的緩存,支持過期,value不超過512M
  /// Redis是單線程的,比如SetAll  AppendToValue  GetValues  GetAndSetValue  IncrementValue  IncrementValueBy,
  /// 這些看上去是組合命令,但實際上是一個具體的命令,是一個原子性的命令,不可能出現(xiàn)中間狀態(tài),可以應對一些并發(fā)情況
  /// /summary>
  public static void ShowString()
  {
   var student1 = new Student()
   {
    Id = 10000,
    Name = "TianYa"
   };

   using (RedisStringService service = new RedisStringService())
   {
    service.Set("student1", student1);
    var stu = service.GetStudent>("student1");
    Console.WriteLine(JsonConvert.SerializeObject(stu));

    service.Setint>("Age", 28);
    Console.WriteLine(service.IncrementValue("Age"));
    Console.WriteLine(service.IncrementValueBy("Age", 3));
    Console.WriteLine(service.DecrementValue("Age"));
    Console.WriteLine(service.DecrementValueBy("Age", 3));
   }
  }
 }
}
using System;

namespace MyRedis
{
 /// summary>
 /// Redis:Remote Dictionary Server 遠程字典服務器
 /// 基于內(nèi)存管理(數(shù)據(jù)存在內(nèi)存),實現(xiàn)了5種數(shù)據(jù)結構(分別應對各種具體需求),單線程模型的應用程序(單進程單線程),對外提供插入--查詢--固化--集群功能。
 /// 正是因為基于內(nèi)存管理所以速度快,可以用來提升性能。但是不能當數(shù)據(jù)庫,不能作為數(shù)據(jù)的最終依據(jù)。
 /// 單線程多進程的模式來提供集群服務。
 /// 單線程最大的好處就是原子性操作,就是要么都成功,要么都失敗,不會出現(xiàn)中間狀態(tài)。Redis每個命令都是原子性(因為單線程),不用考慮并發(fā),不會出現(xiàn)中間狀態(tài)。(線程安全)
 /// Redis就是為開發(fā)而生,會為各種開發(fā)需求提供對應的解決方案。
 /// Redis只是為了提升性能,不做數(shù)據(jù)標準。任何的數(shù)據(jù)固化都是由數(shù)據(jù)庫完成的,Redis不能代替數(shù)據(jù)庫。
 /// Redis實現(xiàn)的5種數(shù)據(jù)結構:String、Hashtable、Set、ZSet和List。
 /// /summary>
 class Program
 {
  static void Main(string[] args)
  {
   ServiceStackTest.ShowString();
   Console.ReadKey();
  }
 }
}

運行結果如下:

Redis中的String類型在項目中使用是最多的,想必大家都有所了解,此處就不再做過多的描述了。

二、使用Redis解決訂單秒殺超賣問題

首先先來看下什么是訂單秒殺超賣問題:

/// summary>
/// 模擬訂單秒殺超賣問題
///  超賣:訂單數(shù)超過商品
///  如果使用傳統(tǒng)的鎖來解決超賣問題合適嗎? 
///   不合適,因為這個等于是單線程了,其他都要阻塞,會出現(xiàn)各種超時。
///   -1的時候除了操作庫存,還得增加訂單,等支付等等。
///   10個商品秒殺,一次只能進一個? 違背了業(yè)務。
/// /summary>
public class OverSellFailedTest
{
 private static bool _isGoOn = true; //秒殺活動是否結束
 private static int _stock = 0; //商品庫存
 public static void Show()
 {
  _stock = 10;
  for (int i = 0; i  5000; i++)
  {
   int k = i;
   Task.Run(() => //每個線程就是一個用戶請求
   {
    if (_isGoOn)
    {
     long index = _stock;
     Thread.Sleep(100); //模擬去數(shù)據(jù)庫查詢庫存
     if (index >= 1)
     {
      _stock = _stock - 1; //更新庫存
      Console.WriteLine($"{k.ToString("0000")}秒殺成功,秒殺商品索引為{index}");
      //可以分隊列,去操作數(shù)據(jù)庫
     }
     else
     {
      if (_isGoOn)
      {
       _isGoOn = false;
      }

      Console.WriteLine($"{k.ToString("0000")}秒殺失敗,秒殺商品索引為{index}");
     }
    }
    else
    {
     Console.WriteLine($"{k.ToString("0000")}秒殺停止......");
    }
   });
  }
 }
}

運行OverSellFailedTest.Show(),結果如下所示:

從運行結果可以看出不僅一個商品賣給了多個人,而且還出現(xiàn)了訂單數(shù)超過商品數(shù),這就是典型的秒殺超賣問題。

下面我們來看下如何使用Redis解決訂單秒殺超賣問題:

/// summary>
/// 使用Redis解決訂單秒殺超賣問題
///  超賣:訂單數(shù)超過商品
///  1、Redis原子性操作--保證一個數(shù)值只出現(xiàn)一次--防止一個商品賣給多個人
///  2、用上了Redis,一方面保證絕對不會超賣,另一方面沒有效率影響,還有撤單的時候增加庫存,可以繼續(xù)秒殺,
///  限制秒殺的庫存是放在redis,不是數(shù)據(jù)庫,不會造成數(shù)據(jù)的不一致性
///  3、Redis能夠攔截無效的請求,如果沒有這一層,所有的請求壓力都到數(shù)據(jù)庫
///  4、緩存擊穿/穿透---緩存down掉,請求全部到數(shù)據(jù)庫
///  5、緩存預熱功能---緩存重啟,數(shù)據(jù)丟失,多了一個初始化緩存數(shù)據(jù)動作(寫代碼去把數(shù)據(jù)讀出來放入緩存)
/// /summary>
public class OverSellTest
{
 private static bool _isGoOn = true; //秒殺活動是否結束
 public static void Show()
 {
  using (RedisStringService service = new RedisStringService())
  {
   service.Setint>("Stock", 10); //庫存
  }

  for (int i = 0; i  5000; i++)
  {
   int k = i;
   Task.Run(() => //每個線程就是一個用戶請求
   {
    using (RedisStringService service = new RedisStringService())
    {
     if (_isGoOn)
     {
      long index = service.DecrementValue("Stock"); //減1并且返回 
      if (index >= 0)
      {
       Console.WriteLine($"{k.ToString("0000")}秒殺成功,秒殺商品索引為{index}");
       //service.IncrementValue("Stock"); //加1,如果取消了訂單則添加庫存繼續(xù)秒殺
       //可以分隊列,去操作數(shù)據(jù)庫
      }
      else
      {
       if (_isGoOn)
       {
        _isGoOn = false;
       }

       Console.WriteLine($"{k.ToString("0000")}秒殺失敗,秒殺商品索引為{index}");
      }
     }
     else
     {
      Console.WriteLine($"{k.ToString("0000")}秒殺停止......");
     }
    }
   });
  }
 }
}

運行OverSellTest.Show(),結果如下所示:

從運行結果可以看出使用Redis能夠很好的解決訂單秒殺超賣問題。

至此本文就全部介紹完了,如果覺得對您有所啟發(fā)請記得點個贊哦?。?!

Demo源碼:

鏈接: https://pan.baidu.com/s/1vukiDxOLQYZX4Qd94izMpQ 提取碼: bdfm

此文由博主精心撰寫轉載請保留此原文鏈接:https://www.cnblogs.com/xyh9039/p/13979522.html

版權聲明:如有雷同純屬巧合,如有侵權請及時聯(lián)系本人修改,謝謝?。。?/p>

到此這篇關于Redis中的String類型及使用Redis解決訂單秒殺超賣問題的文章就介紹到這了,更多相關Redis解決訂單秒殺超賣內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • 使用redis的increment()方法實現(xiàn)計數(shù)器功能案例
  • Python獲取Redis所有Key以及內(nèi)容的方法
  • 基于redis key占用內(nèi)存量分析

標簽:定州 畢節(jié) 甘南 泰州 河源 南寧 伊春 拉薩

巨人網(wǎng)絡通訊聲明:本文標題《Redis中的String類型及使用Redis解決訂單秒殺超賣問題》,本文關鍵詞  Redis,中的,String,類型,及,;如發(fā)現(xiàn)本文內(nèi)容存在版權問題,煩請?zhí)峁┫嚓P信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《Redis中的String類型及使用Redis解決訂單秒殺超賣問題》相關的同類信息!
  • 本頁收集關于Redis中的String類型及使用Redis解決訂單秒殺超賣問題的相關信息資訊供網(wǎng)民參考!
  • 推薦文章
    欧美成人黑人xx视频免费观看| 精品人妻无码一区二区性色| 国产精品91视频| 亚洲女同女同女同女同女同69| 国产精品第九页| 精品国产_亚洲人成在线| 欧美色图免费看| 国产精品99久久久久久成人| 欧美日韩国产小视频在线观看| 久久久久久久久毛片| 欧美亚洲在线视频| 国产91精品露脸国语对白| 国产日韩av高清| 欧美在线视频精品| 久久久精品999| 久久国产在线观看| 91精品国产自产在线老师啪| 国产美女精品一区二区三区| 欧美在线一区视频| 精品国产sm最大网站免费看| 无码h黄肉3d动漫在线观看| 嫩草av久久伊人妇女超级a| 欧美性做爰毛片| 欧美性xxxxhd| av老司机久久| 成人av一级片| 日韩天堂在线观看| 成年人av网站| 国产精品一区二区免费看| 国产精品全国免费观看高清| 久久国产柳州莫菁门| 精品视频在线看| 国内av免费观看| 欧美日韩精品在线播放| 婷婷激情综合五月天| 久久99久久久久久久噜噜| 老司机免费视频一区二区| 国产高清av在线播放| 精品日本一线二线三线不卡| 国产精品一品二品| 精品国产乱码久久久久久鸭王1| 免费看国产一级片| 国产91色在线免费| 欧美在线影院一区二区| 美洲天堂一区二卡三卡四卡视频| 免费成人黄色大片| 中文字幕精品av| 手机在线观看免费av| 欧美性受黑人性爽| 精品88久久久久88久久久| 综合激情网五月| 欧美麻豆久久久久久中文| 中文资源在线播放| 国产精品电影在线观看| 亚洲三级在线免费观看| 日本激情小视频| 96精品视频在线| www.视频一区| 欧美激情视频二区| 欧美爱爱视频网站| 国产91精品久久久| 欧美一区二区三区在| 粉嫩av亚洲一区二区图片| 国产无遮无挡120秒| 曰韩不卡视频| 日韩久久久久久| 国产黄色一级大片| 91av视频在线免费观看| 国产精品高潮久久久久无| 黄色录像二级片| 九九视频这里只有精品| 亚洲国产剧情在线观看| 蜜桃传媒视频麻豆第一区免费观看| 久久久久青草大香线综合精品| 夫妻性生活毛片| 日韩欧美一区二区在线观看| 欧美亚洲禁片免费| 国产又大又黄视频| 国产又黄又猛又粗又爽的视频| 亚洲一区美女视频在线观看免费| 美女999久久久精品视频| 91福利视频久久久久| 国产呦萝稀缺另类资源| 国产亚洲第一页| 国产卡一卡二在线| 中文字幕欧美精品日韩中文字幕| 国产专区综合网| 无码人妻aⅴ一区二区三区69岛| 国产伦精品一区二区三毛| 婷婷综合久久一区二区三区| 免费毛片在线播放免费| 欧美欧美一区二区| 97香蕉超级碰碰久久免费软件 | 少妇av在线播放| 午夜久久福利视频| 国产极品jizzhd欧美| 91精品国产入口| 亚洲精品免费在线观看| 国产在线精品一区二区不卡了| 最新国产中文字幕| japanese中文字幕| 亚洲熟妇av一区二区三区| 日韩av电影免费观看高清| 五月天视频一区| 一区二区三区免费高清视频| 国产a∨精品一区二区三区不卡| 夜夜爽夜夜爽精品视频| 国产综合视频在线| 午夜视频你懂的| 欧美高清视频在线观看| 亚洲h在线观看| 国产偷国产偷精品高清尤物| 视频一区二区不卡| 欧洲性xxxx| www.午夜色| 午夜欧美大片免费观看| 日韩二区在线观看| 精品在线视频观看| 亚洲 中文字幕 日韩 无码| 水蜜桃一区二区| 91美女片黄在线观| 国精产品一区一区三区有限在线| 中文字幕亚洲在线| 亚洲一区中文在线| 成人永久免费视频| 最近中文字幕在线观看| 中国美女乱淫免费看视频| www.亚洲成人网| 欧美综合在线第二页| 欧美群妇大交群的观看方式 | 国产成人av在线影院| 国产免费av一区| 潘金莲一级淫片aaaaa免费看| 一本一道久久a久久精品逆3p | 另类调教123区| 久久精品三级视频| 久久久成人精品一区二区三区| 午夜精品三级视频福利| 日韩一区二区三区观看| 久久久久久电影| 日韩精品久久久久久久的张开腿让| 国产精品乱码视频| 制服.丝袜.亚洲.中文.综合| 日本高清视频www| 亚洲欧洲免费无码| 亚洲夜晚福利在线观看| 成人午夜视频福利| 成人免费看片98欧美| 少妇熟女视频一区二区三区 | 欧美激情图片区| 欧美性猛片xxxx免费看久爱| 在线不卡免费视频| 高潮毛片无遮挡| av免费看网址| 伊人久久大香线蕉成人综合网| 中文字幕成人一区| 亚洲欧美日韩精品久久久| 国产精品一区久久| 亚洲成人国产精品| 9久草视频在线视频精品| 99国产成人精品| 欧美高清69hd| 永久看片925tv| 亚洲一区二区三区综合| 欧美牲交a欧美牲交| 国产欧美一区二区三区在线 | 午夜精品国产精品大乳美女| 亚洲激情小视频| 中文字幕国产一区| 国产福利视频导航| 日本污视频网站| 中文字幕91视频| 亚欧精品视频一区二区三区| 日本男人操女人| 欧美日韩在线不卡一区| 国产精品自产拍在线观| 欧美日韩中文字幕在线| 成人白浆超碰人人人人| 91麻豆国产在线| 成年人晚上看的视频| 一级日韩一级欧美| 免费国产黄色片| 天堂av在线一区| 麻豆一区二区在线| 久久精品国产精品青草| 国产美女久久久久| 国产精品白丝av| 老熟妇一区二区三区啪啪| 一级特黄a大片免费| 黄色大片中文字幕| 国产精品99久久久久久大便| av成人综合网| 国产精品福利无圣光在线一区| 欧美一区二区福利在线| 亚洲男人的天堂av| 国产高清视频一区| 26uuu精品一区二区三区四区在线| 中文字幕不卡一区| 久久亚洲精精品中文字幕早川悠里 | av中文字幕第一页| 国产精品99精品无码视| 成人在线手机视频| 久久精品无码一区| 久久久99精品| 日韩欧美国产另类| 天天操天天射天天| 国产一区视频网站| 91农村精品一区二区在线| 亚洲一区二区三区四区在线免费观看| 一区二区三区中文字幕电影| 亚洲综合色自拍一区| 国产精品嫩草影院com| 日韩黄色免费网站| 熟妇人妻中文av无码| 亚洲天堂男人av| 日韩精品久久久久久久酒店| 免费成人深夜夜行p站| 日韩人妻无码精品久久久不卡| 日韩精品无码一区二区三区| 肉大捧一出免费观看网站在线播放| 神马午夜伦理影院| 成人毛片100部免费看| 色综合电影网| 午夜精品电影在线观看| 国产日韩精品视频| 久久久999国产| 久久九九全国免费精品观看| 色偷偷88888欧美精品久久久 | 国产在线观看h| 亚洲伊人成人网| 日日欢夜夜爽一区| 不卡一区二区中文字幕| 亚洲一区在线视频观看| 欧美午夜理伦三级在线观看| 精品福利免费观看| 在线综合亚洲欧美在线视频| 亚洲黄网站在线观看| 色综合久久久久久久| 一本久久a久久免费精品不卡| 亚洲成人av福利| 欧美韩日一区二区三区四区| 成人小视频免费在线观看| 青青草一区二区三区| 日韩av一区二区在线影视| 2020国产精品自拍| 亚洲h动漫在线| 欧美在线不卡视频| 在线免费视频一区二区| 欧美三片在线视频观看| 日韩欧美黄色影院| 一个色在线综合| 中文字幕国产一区二区| 精品人伦一区二区三区蜜桃网站| 欧美日韩精品二区| 日韩精品专区在线影院重磅| 久久久久久国产精品三级玉女聊斋| 国产一区不卡在线观看| 国产大尺度在线观看| 成人一区二区三区仙踪林| 欧美成人国产精品高潮| 亚洲成人中文字幕在线| 成人动漫在线一区| 大地资源二中文在线影视观看| 欧美一区二区三区爽大粗免费 | 九九热只有这里有精品| 亚洲国产精品久久久久爰色欲| av天堂永久资源网| 日本一区美女| 久艹视频在线免费观看| 在线无限看免费粉色视频| 亚洲国产成人不卡| 日韩亚洲欧美一区二区| 熟女人妻一区二区三区免费看| 视频一区二区三区四区五区| 另类小说综合欧美亚洲| www.欧美日韩| 亚洲人成网站影音先锋播放| 欧美久久久一区| 亚洲网站在线播放| 91精品国产综合久久小美女| 亚洲成人av片| 色综合色综合久久综合频道88| 91精品久久久久久久久久另类| 国产区二精品视| www.涩涩涩| 国产又爽又黄的视频| 国产成人av电影在线播放| 狠狠做深爱婷婷久久综合一区| 日韩在线视频二区| 日本三级久久久| 日韩电影天堂视频一区二区| 欧美性久久久久| 日韩av片免费观看| 超碰手机在线观看| 在线视频1卡二卡三卡| 蜜桃视频一区二区| 精品一区二区三区在线观看国产| 不卡电影一区二区三区| 亚洲伊人伊色伊影伊综合网| 精品国产伦一区二区三区观看体验| 国产成人精品免高潮费视频| 一区二区av| 十八禁视频网站在线观看| 六月激情综合网| 国内性生活视频| 欧美日韩第一页| 欧美日韩福利电影| 国产区一区二区| 黄色片在线免费| 人妻精品久久久久中文字幕| 九九免费精品视频| 成人午夜免费福利| 中文字幕一区二区三中文字幕| 亚洲蜜臀av乱码久久精品蜜桃| 婷婷亚洲久悠悠色悠在线播放 | 国产一区二区三区丝袜| 国产美女主播一区| 国产aaaaa毛片| 97超碰人人模人人人爽人人爱| 亚洲欧美日韩成人高清在线一区| 欧美黄色片在线观看| 欧美v在线观看| 国产欧美久久久| 中文字幕一区二区三| 欧美精品免费看| 日韩久久不卡| 丁香花五月婷婷| 国产黄色av片| 亚洲手机成人高清视频| 欧美日韩视频一区二区| 欧美激情2020午夜免费观看| www.欧美黄色| 人成免费在线视频| 欧美少妇bbw| 亚洲成人精品一区| 日韩成人在线播放| 欧美日本啪啪无遮挡网站| 免费国产一区| 日本国产在线视频| 久久亚洲视频| 91精品一区二区三区久久久久久 | 人人妻人人玩人人澡人人爽| 亚洲欧美怡红院| 欧美色男人天堂| 欧美激情乱人伦| 欧美视频在线第一页| www.99热| 理论电影国产精品| 精品剧情在线观看| 欧美极品jizzhd欧美| 国产一二三四区| 亚洲另类在线制服丝袜| 日本亚洲欧美三级| 成年人的黄色片| 久久99精品国产91久久来源| 亚洲男子天堂网| 日韩在线国产| 美女脱光内衣内裤| 日本午夜一本久久久综合| 欧美一区二区三区成人| 国产美女91呻吟求| 91av免费观看| 精品国产免费无码久久久| 亚洲欧洲精品成人久久奇米网| 亚洲色图欧美制服丝袜另类第一页 | 精品系列免费在线观看| 久久综合久久鬼色| 在线看国产一区| 日韩在线视频观看正片免费网站| 欧美高清视频一区| 国产精品久久久久9999小说| 国产人与禽zoz0性伦| 国产又黄又粗又硬| 中文字幕av不卡| 亚洲天堂av综合网| 国产玉足脚交久久欧美| 一本一道精品欧美中文字幕| 欧美三级视频在线| 欧美视频观看一区| 久久久久久久伊人| 亚洲一二三区在线观看| 亚洲va欧美va国产综合剧情| 一级片视频免费看| 国产精品国产精品国产专区不蜜| 国内久久久精品| 中文字幕丰满乱码| 黑人巨大精品欧美一区| 久久激情视频久久| 国产福利一区视频| 欧美精品一二三四区| 国产欧美日韩精品一区| 色七七影院综合| 国产精品国产亚洲精品看不卡| 国产精品伊人久久| 91久久精品一区二区| 1769国内精品视频在线播放| 波多野结衣 作品| 免费毛片一区二区三区| 亚洲欧洲制服丝袜| 亚洲va欧美va国产综合久久| 亚洲色婷婷一区二区三区| 亚洲精品成人悠悠色影视| 国产欧美久久久久久| 免费黄色在线网址| 成人免费在线视频观看| 97超碰人人看人人| 欧产日产国产69| 欧洲一区二区三区在线| 亚洲精品成人a8198a| 日韩精品一区二区av|