成人性生交大片免费看视频r_亚洲综合极品香蕉久久网_在线视频免费观看一区_亚洲精品亚洲人成人网在线播放_国产精品毛片av_久久久久国产精品www_亚洲国产一区二区三区在线播_日韩一区二区三区四区区区_亚洲精品国产无套在线观_国产免费www

主頁(yè) > 知識(shí)庫(kù) > Redis分布式限流組件設(shè)計(jì)與使用實(shí)例

Redis分布式限流組件設(shè)計(jì)與使用實(shí)例

熱門(mén)標(biāo)簽:高德地圖標(biāo)注商戶位置 沈陽(yáng)營(yíng)銷(xiāo)電銷(xiāo)機(jī)器人招商 智能電銷(xiāo)機(jī)器人銷(xiāo)售話術(shù) 徐州ai電銷(xiāo)機(jī)器人原理 企業(yè)智能外呼系統(tǒng)價(jià)格多少 福州電銷(xiāo)機(jī)器人源代碼 兗州電話外呼營(yíng)銷(xiāo)系統(tǒng) 機(jī)器人外呼系統(tǒng)軟件存在問(wèn)題 南京400電話怎樣辦理

本文主要講解基于 自定義注解+Aop+反射+Redis+Lua表達(dá)式 實(shí)現(xiàn)的限流設(shè)計(jì)方案。實(shí)現(xiàn)的限流設(shè)計(jì)與實(shí)際使用。

1.背景

在互聯(lián)網(wǎng)開(kāi)發(fā)中經(jīng)常遇到需要限流的場(chǎng)景一般分為兩種

  • 業(yè)務(wù)場(chǎng)景需要(比如:5分鐘內(nèi)發(fā)送驗(yàn)證碼不超過(guò)xxx次);
  • 對(duì)流量大的功能流量削峰;

一般我們衡量系統(tǒng)處理能力的指標(biāo)是每秒的QPS或者TPS,假設(shè)系統(tǒng)每秒的流量閾值是2000,
理論上第2001個(gè)請(qǐng)求進(jìn)來(lái)時(shí),那么這個(gè)請(qǐng)求就需要被限流。

本文演示項(xiàng)目使用的是 SpringBoot 項(xiàng)目,項(xiàng)目構(gòu)建以及其他配置,這里不做演示。文末附限流Demo源碼

2.Redis計(jì)數(shù)器限流設(shè)計(jì)

本文演示項(xiàng)目使用的是 SpringBoot 項(xiàng)目,這里僅挑選了重點(diǎn)實(shí)現(xiàn)代碼展示,
項(xiàng)目構(gòu)建以及其他配置,這里不做演示,詳細(xì)配置請(qǐng)參考源碼demo工程。

2.1Lua腳本

Lua 是一種輕量小巧的腳本語(yǔ)言可以理解為就是一組命令。
使用Redis的計(jì)數(shù)器達(dá)到限流的效果,表面上Redis自帶命令多個(gè)組合也可以支持了,那為什么還要用Lua呢?
因?yàn)橐WC原子性,這也是使用redis+Lua表達(dá)式原因,一組命令要么全成功,要么全失敗。
相比Redis事務(wù),Lua腳本的優(yōu)點(diǎn):

  • 減少網(wǎng)絡(luò)開(kāi)銷(xiāo):多個(gè)請(qǐng)求通過(guò)腳本一次發(fā)送,減少網(wǎng)絡(luò)延遲
  • 原子操作:將腳本作為一個(gè)整體執(zhí)行,中間不會(huì)插入其他命令,無(wú)需使用事務(wù)
  • 復(fù)用:客戶端發(fā)送的腳本永久存在redis中,其他客戶端可以復(fù)用腳本
  • 可嵌入性:可嵌入JAVA,C#等多種編程語(yǔ)言,支持不同操作系統(tǒng)跨平臺(tái)交互

實(shí)現(xiàn)限流Lua腳本示例

# 定義計(jì)數(shù)變量
local count
# 獲取調(diào)用腳本時(shí)傳入的第一個(gè)key值(用作限流的 key)
count = redis.call('get',KEYS[1])
# 限流最大值比較,若超過(guò)最大值,則直接返回
if count and tonumber(count) > tonumber(ARGV[1]) then
return count;
end
# incr 命令 執(zhí)行計(jì)算器累加
count = redis.call('incr',KEYS[1])
# 從第一次調(diào)用開(kāi)始限流,并設(shè)置失效時(shí)間
if tonumber(count) == 1 then
redis.call('expire',KEYS[1],ARGV[2])
end
return count;

參數(shù)說(shuō)明

  • KEYS[1] - redis的Key
  • ARGV[1] - 限流次數(shù)
  • ARGV[2] - 失效時(shí)間

2.2自定義注解

支持范圍:任意接口

/**
 * 描述: 限流注解
 *
 * @author 程序員小強(qiáng)
 **/
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface RateLimit {

    /**
     * 限流唯一標(biāo)示 key
     * 若同時(shí)使用 keyFiled 則當(dāng)前 key作為前綴
     */
    String key();

    /**
     * 限流時(shí)間-單位:秒數(shù)
     * 默認(rèn) 60s
     */
    int time() default 60;

    /**
     * 限流次數(shù)
     * 失效時(shí)間段內(nèi)最大放行次數(shù)
     */
    int count();

    /**
     * 可作為限流key-參數(shù)類(lèi)中屬性名,動(dòng)態(tài)值
     * 示例:phone、userId 等
     */
    String keyField() default "";

    /**
     * 超過(guò)最大訪問(wèn)次數(shù)后的,提示內(nèi)容
     */
    String msg() default "over the max request times please try again";

}

屬性介紹

  • key - 必填,限流key唯一標(biāo)識(shí),redis存儲(chǔ)key
  • time -過(guò)期時(shí)間,單位 秒,默認(rèn)60s
  • count - 必填,失效時(shí)間段內(nèi)最大放行次數(shù)
  • keyField - 動(dòng)態(tài)限流key,比如參數(shù)是一個(gè)自定義的類(lèi),里面有屬性u(píng)serId 等??梢允褂胟eyField=“userId”,

這樣生成的key為參數(shù)中userId的值。一般與key屬性組合使用。不支持java基本類(lèi)型參數(shù),
僅支持參數(shù)是一個(gè)對(duì)象的接口。

msg - 超過(guò)限流的提示內(nèi)容

示例:

@RateLimit(key = "limit-phone-key", time = 300, count = 10, keyField = "phone", msg = "5分鐘內(nèi),驗(yàn)證碼最多發(fā)送10次")

含義 - 5分鐘內(nèi)根據(jù)手機(jī)號(hào)限流10次
RedisKey- limit-phone-key:后面拼接的是參數(shù)中phone的值。

2.3限流組件

這里用的是jedis客戶端,配置就不列在這里的,詳見(jiàn)源碼,文末附源碼地址

/**
 * Redis限流組件
 *
 * @author 程序員小強(qiáng)
 */
@Component
public class RedisRateLimitComponent {
    private static final Logger logger = LoggerFactory.getLogger(RedisRateLimitComponent.class);

    private JedisPool jedisPool;

    @Autowired
    public RedisRateLimitComponent(JedisPool jedisPool) {
        this.jedisPool = jedisPool;
    }

    /**
     * 限流方法
     * 1.執(zhí)行 lua 表達(dá)式
     * 2.通過(guò) lua 表達(dá)式實(shí)現(xiàn)-限流計(jì)數(shù)器
     *
     * @param redisKey
     * @param time           超時(shí)時(shí)間-秒數(shù)
     * @param rateLimitCount 限流次數(shù)
     */
    public Long rateLimit(String redisKey, Integer time, Integer rateLimitCount) {
        Jedis jedis = null;
        try {
            jedis = jedisPool.getResource();
            Object obj = jedis.evalsha(jedis.scriptLoad(this.buildLuaScript()), Collections.singletonList(redisKey),
                    Arrays.asList(String.valueOf(rateLimitCount), String.valueOf(time)));
            return Long.valueOf(obj.toString());
        } catch (JedisException ex) {
            logger.error("[ executeLua ] >> messages:{}", ex.getMessage(), ex);
            throw new RateLimitException("[ RedisRateLimitComponent ] >> jedis run lua script exception" + ex.getMessage());
        } finally {
            if (jedis != null) {
                if (jedis.isConnected()) {
                    jedis.close();
                }
            }
        }
    }

    /**
     * 構(gòu)建lua 表達(dá)式
     * KEYS[1] -- 參數(shù)key
     * ARGV[1]-- 失效時(shí)間段內(nèi)最大放行次數(shù)
     * ARGV[2]-- 失效時(shí)間|秒
     */
    private String buildLuaScript() {
        StringBuilder luaBuilder = new StringBuilder();
        //定義變量
        luaBuilder.append("local count");
        //獲取調(diào)用腳本時(shí)傳入的第一個(gè)key值(用作限流的 key)
        luaBuilder.append("\ncount = redis.call('get',KEYS[1])");
        // 獲取調(diào)用腳本時(shí)傳入的第一個(gè)參數(shù)值(限流大?。?- 調(diào)用不超過(guò)最大值,則直接返回
        luaBuilder.append("\nif count and tonumber(count) > tonumber(ARGV[1]) then");
        luaBuilder.append("\nreturn count;");
        luaBuilder.append("\nend");
        //執(zhí)行計(jì)算器自增
        luaBuilder.append("\ncount = redis.call('incr',KEYS[1])");
        //從第一次調(diào)用開(kāi)始限流
        luaBuilder.append("\nif tonumber(count) == 1 then");
        //設(shè)置過(guò)期時(shí)間
        luaBuilder.append("\nredis.call('expire',KEYS[1],ARGV[2])");
        luaBuilder.append("\nend");
        luaBuilder.append("\nreturn count;");
        return luaBuilder.toString();
    }
}

2.4限流切面實(shí)現(xiàn)

/**
 * 描述:限流切面實(shí)現(xiàn)
 *
 * @author 程序員小強(qiáng)
 **/
@Aspect
@Configuration
public class RateLimitAspect {
    private static final Logger logger = LoggerFactory.getLogger(RateLimitAspect.class);

    private RedisRateLimitComponent redisRateLimitComponent;

    @Autowired
    public RateLimitAspect(RedisRateLimitComponent redisRateLimitComponent) {
        this.redisRateLimitComponent = redisRateLimitComponent;
    }

    /**
     * 匹配所有使用以下注解的方法
     *
     * @see RateLimit
     */
    @Pointcut("@annotation(com.example.ratelimit.annotation.RateLimit)")
    public void pointCut() {
    }

    @Around("pointCut()@annotation(rateLimit)")
    public Object logAround(ProceedingJoinPoint joinPoint, RateLimit rateLimit) throws Throwable {
        MethodSignature signature = (MethodSignature) joinPoint.getSignature();
        String methodName = signature.getMethod().getName();

        //組裝限流key
        String rateLimitKey = this.getRateLimitKey(joinPoint, rateLimit);

        //限流組件-通過(guò)計(jì)數(shù)方式限流
        Long count = redisRateLimitComponent.rateLimit(rateLimitKey, rateLimit.time(), rateLimit.count());
        logger.debug("[ RateLimit ] method={},rateLimitKey={},count={}", methodName, rateLimitKey, count);

        if (null != count  count.intValue() = rateLimit.count()) {
            //未超過(guò)限流次數(shù)-執(zhí)行業(yè)務(wù)方法
            return joinPoint.proceed();
        } else {
            //超過(guò)限流次數(shù)
            logger.info("[ RateLimit ] >> over the max request times method={},rateLimitKey={},currentCount={},rateLimitCount={}",
                    methodName, rateLimitKey, count, rateLimit.count());
            throw new RateLimitException(rateLimit.msg());
        }
    }

    /**
     * 獲取限流key
     * 默認(rèn)取 RateLimit > key 屬性值 
     * 若設(shè)置了 keyField 則從參數(shù)中獲取該字段的值拼接到key中
     * 示例:user_phone_login_max_times:13235777777
     *
     * @param joinPoint
     * @param rateLimit
     */
    private String getRateLimitKey(ProceedingJoinPoint joinPoint, RateLimit rateLimit) {
        String fieldName = rateLimit.keyField();
        if ("".equals(fieldName)) {
            return rateLimit.key();
        }

        //處理自定義-參數(shù)名-動(dòng)態(tài)屬性key
        StringBuilder rateLimitKeyBuilder = new StringBuilder(rateLimit.key());
        for (Object obj : joinPoint.getArgs()) {
            if (null == obj) {
                continue;
            }
            //過(guò)濾基本類(lèi)型參數(shù)
            if (ReflectionUtil.isBaseType(obj.getClass())) {
                continue;
            }
            //屬性值
            Object fieldValue = ReflectionUtil.getFieldByClazz(fieldName, obj);
            if (null != fieldValue) {
                rateLimitKeyBuilder.append(":").append(fieldValue.toString());
                break;
            }
        }
        return rateLimitKeyBuilder.toString();
    }
}

由于演示項(xiàng)目中做了統(tǒng)一異常處理
在限流切面這里未做異常捕獲,若超過(guò)最大限流次數(shù)會(huì)拋出自定義限流異常??梢愿鶕?jù)業(yè)務(wù)自行處理。

/**
 * 反射工具
 *
 * @author 程序員小強(qiáng)
 */
public class ReflectionUtil {

    private static final Logger logger = LoggerFactory.getLogger(ReflectionUtil.class);

    /**
     * 根據(jù)屬性名獲取屬性元素,
     * 包括各種安全范圍和所有父類(lèi)
     *
     * @param fieldName
     * @param object
     * @return
     */
    public static Object getFieldByClazz(String fieldName, Object object) {
        Field field = null;
        Class?> clazz = object.getClass();
        try {
            for (; clazz != Object.class; clazz = clazz.getSuperclass()) {
                try {
                    //子類(lèi)中查詢不到屬性-繼續(xù)向父類(lèi)查
                    field = clazz.getDeclaredField(fieldName);
                } catch (NoSuchFieldException ignored) {
                }
            }
            if (null == field) {
                return null;
            }
            field.setAccessible(true);
            return field.get(object);
        } catch (Exception e) {
            //通過(guò)反射獲取 屬性值失敗
            logger.error("[ ReflectionUtil ] >> [getFieldByClazz] fieldName:{} ", fieldName, e);
        }
        return null;
    }

    /**
     * 判斷對(duì)象屬性是否是基本數(shù)據(jù)類(lèi)型,包括是否包括string | BigDecimal
     *
     * @param clazz
     * @return
     */
    public static boolean isBaseType(Class clazz) {
        if (null == clazz) {
            return false;
        }
        //基本類(lèi)型
        if (clazz.isPrimitive()) {
            return true;
        }
        //String
        if (clazz.equals(String.class)) {
            return true;
        }
        //Integer
        if (clazz.equals(Integer.class)) {
            return true;
        }
        //Boolean
        if (clazz.equals(Boolean.class)) {
            return true;
        }
        //BigDecimal
        if (clazz.equals(BigDecimal.class)) {
            return true;
        }
        //Byte
        if (clazz.equals(Byte.class)) {
            return true;
        }
        //Long
        if (clazz.equals(Long.class)) {
            return true;
        }
        //Double
        if (clazz.equals(Double.class)) {
            return true;
        }
        //Float
        if (clazz.equals(Float.class)) {
            return true;
        }
        //Character
        if (clazz.equals(Character.class)) {
            return true;
        }
        //Short
        return clazz.equals(Short.class);
    }
}

3.測(cè)試一下

基本屬性已經(jīng)配置好了,寫(xiě)個(gè)接口測(cè)試一下。

3.1方法限流示例

  /**
   * 計(jì)數(shù)器
   * 演示 demo 為了方便計(jì)數(shù)
   */
  private static final AtomicInteger COUNTER = new AtomicInteger();    

  /**
   * 普通限流
   * p>
   * 30 秒中,可以訪問(wèn)10次
   */
  @RequestMapping("/limitTest")
  @RateLimit(key = "limit-test-key", time = 30, count = 10)
  public Response limitTest() {
      MapString, Object> dataMap = new HashMap>();
      dataMap.put("date", DateFormatUtils.format(new Date(), "yyyy-MM-dd HH:mm:ss.SSS"));
      dataMap.put("times", COUNTER.incrementAndGet());
      return Response.success(dataMap);
  }

3.2動(dòng)態(tài)入?yún)⑾蘖魇纠?/h3>

3.2.1場(chǎng)景一:5分鐘內(nèi),方法最多訪問(wèn)10次,根據(jù)入?yún)⑹謾C(jī)號(hào)限流

入?yún)㈩?lèi)

public class UserPhoneCaptchaRateParam implements Serializable {

    private static final long serialVersionUID = -1L;

    private String phone;
    //省略 get/set
}
  private static final MapString, AtomicInteger> COUNT_PHONE_MAP = new HashMap>();


  /**
   * 根據(jù)手機(jī)號(hào)限流-限制驗(yàn)證碼發(fā)送次數(shù)
   * p>
   * 示例:5分鐘內(nèi),驗(yàn)證碼最多發(fā)送10次
   */
  @RequestMapping("/limitByPhone")
  @RateLimit(key = "limit-phone-key", time = 300, count = 10, keyField = "phone", msg = "5分鐘內(nèi),驗(yàn)證碼最多發(fā)送10次")
  public Response limitByPhone(UserPhoneCaptchaRateParam param) {
      MapString, Object> dataMap = new HashMap>();
      dataMap.put("date", DateFormatUtils.format(new Date(), "yyyy-MM-dd HH:mm:ss.SSS"));
      if (COUNT_PHONE_MAP.containsKey(param.getPhone())) {
          COUNT_PHONE_MAP.get(param.getPhone()).incrementAndGet();
      } else {
          COUNT_PHONE_MAP.put(param.getPhone(), new AtomicInteger(1));
      }
      dataMap.put("times", COUNT_PHONE_MAP.get(param.getPhone()).intValue());
      dataMap.put("reqParam", param);
      return Response.success(dataMap);
  }

3.2.2場(chǎng)景二:根據(jù)訂單ID限流

入?yún)㈩?lèi)

@Data
public class OrderRateParam implements Serializable {

    private static final long serialVersionUID = -1L;

    private String orderId;
    //省略 get\set
}
  private static final MapString, AtomicInteger> COUNT_ORDER_MAP = new HashMap>();

  /**
   * 根據(jù)訂單ID限流示例
   * p>
   * 300 秒中,可以訪問(wèn)10次
   */
  @RequestMapping("/limitByOrderId")
  @RateLimit(key = "limit-order-key", time = 300, count = 10, keyField = "orderId", msg = "訂單飛走了,請(qǐng)稍后再試!")
  public Response limitByOrderId(OrderRateParam param) {
      MapString, Object> dataMap = new HashMap>();
      dataMap.put("date", DateFormatUtils.format(new Date(), "yyyy-MM-dd HH:mm:ss.SSS"));
      if (COUNT_ORDER_MAP.containsKey(param.getOrderId())) {
          COUNT_ORDER_MAP.get(param.getOrderId()).incrementAndGet();
      } else {
          COUNT_ORDER_MAP.put(param.getOrderId(), new AtomicInteger(1));
      }
      dataMap.put("times", COUNT_ORDER_MAP.get(param.getOrderId()).intValue());
      dataMap.put("reqParam", param);
      return Response.success(dataMap);
  }

4.其它擴(kuò)展

根據(jù)ip限流

在key中拼接IP即可;

5.源碼地址

傳送門(mén)

到此這篇關(guān)于Redis分布式限流組件設(shè)計(jì)與使用實(shí)例的文章就介紹到這了,更多相關(guān)Redis分布式限流內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • Java面試題沖刺第二十三天--分布式
  • Redisson實(shí)現(xiàn)Redis分布式鎖的幾種方式
  • Redis分布式鎖Redlock的實(shí)現(xiàn)
  • Redis分布式非公平鎖的使用
  • C#實(shí)現(xiàn)Redis的分布式鎖
  • java基于mongodb實(shí)現(xiàn)分布式鎖的示例代碼
  • 支持python的分布式計(jì)算框架Ray詳解
  • LCN分布式事務(wù)解決方案詳解

標(biāo)簽:昭通 丹東 景德鎮(zhèn) 大理 吉安 本溪 邯鄲 鶴崗

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Redis分布式限流組件設(shè)計(jì)與使用實(shí)例》,本文關(guān)鍵詞  Redis,分布式,限流,組件,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《Redis分布式限流組件設(shè)計(jì)與使用實(shí)例》相關(guān)的同類(lèi)信息!
  • 本頁(yè)收集關(guān)于Redis分布式限流組件設(shè)計(jì)與使用實(shí)例的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    久久草视频在线看| 日本免费网站视频| 日韩精品一卡| 免费av一区二区三区四区| 日韩av在线综合| 精品自拍视频| 97久久综合区小说区图片区| 北条麻妃一区二区三区| 欧美乱大交做爰xxxⅹ小说| 黄色片免费大全| 国产剧情演绎av| 中国一级免费毛片| 亚洲成人福利| 久久精品国产视频| 亚洲精品久久久久久| 尤物视频在线观看免费| 日本福利视频导航| 亚洲国产综合在线| 韩国中文字幕hd久久精品| h版电影在线播放视频网站| 国产一区二区在线播放视频| 500福利第一精品导航| 日韩av毛片网| 国产在线视频你懂| 成人a视频在线观看| 动漫美女无遮挡免费| 国产在线播放91| 视频直播国产精品| 国产99久久九九精品无码| 国产精品嫩草影院桃色| 少妇网站在线观看| 亚洲女女做受ⅹxx高潮| 先锋影音国产一区| 亚洲专区区免费| 久操视频在线观看免费| aaa免费看大片| 波多野吉衣av| 国产资源在线视频| av在线电影观看| 影音先锋亚洲精品| 美女国产一区| 中国老太性bbbxxxx| 成年人深夜视频| 精品国产av鲁一鲁一区| 日本精品一区在线| 久久久精品人体av艺术| 一级黄色片网址| xf在线a精品一区二区视频网站| www.99久久热国产日韩欧美.com| 欧美69精品久久久久久不卡| 欧美激情视频给我| 久久精品国产99久久| 青青草原国产在线观看| 色喇叭免费久久综合网| 91p0rn永久地址| 国产极品美女到高潮| 久久精品国产亚洲夜色av网站| 成人午夜黄色影院| av影片免费在线观看| 精品成人影院| 精品无人区一区二区三区| 亚洲免费视频网站| www精品久久| 国精品人伦一区二区三区蜜桃| 亚洲调教视频在线观看| 欧美一级片久久久久久久| 丝袜制服影音先锋| 羞羞网站在线| 亚洲精品国产一区二区在线| 日韩一区二区三区高清免费看看| 777午夜精品免费视频| 成人性生交大片免费看中文视频| 国产精品久久久久久久久久久久| 超碰在线无需免费| 天天操天天射天天舔| 日日摸夜夜爽人人添| 亚洲九九爱视频| 亚洲第一免费看片| 亚洲国产成人va在线观看天堂| 日本欧美韩国| 粉嫩精品一区二区三区在线观看| 久久精品网址| 免费在线观看亚洲| 精品视频999| 中文字幕在线一区免费| 日本一级片免费看| 国产片在线观看| 成人欧美一区二区三区1314| 午夜精品毛片| 免费黄色av片| 欧美va在线播放| 日韩网站免费观看高清| 亲爱的老师9免费观看全集电视剧| 精品va天堂亚洲国产| 91精品国产乱码久久久久| 717成人午夜免费福利电影| 日韩成人av电影| 国产精品色哟哟网站| 精品视频一区二区三区四区| 日韩在线一区二区三区四区| 国产精品区在线观看| 亚洲黄页在线观看| 领导边摸边吃奶边做爽在线观看| 日韩欧美亚洲国产| 日本一区二区三区久久| 成人福利视频在| 午夜激情一区二区| 久草在线国产| 男男做性免费视频网| www.久久av.com| 久久久精品国产| 在线观看欧美日韩国产| 欧美性猛交xxx乱大交3蜜桃| av成人在线电影| 男人用机机桶女人| a天堂中文在线官网在线| 日本一区免费观看| 777欧美精品| 黄色日韩精品| 在线观看国产精品网站| 欧美最猛性xxxx高清| h版电影在线播放视频网址| 欧美猛男男办公室激情| 国产又粗又大又爽的视频| 国产精品99久久久久久久久久久久| eeuss影影院www在线播放| 97人人香蕉| 国产精品久久久久久久泡妞| 五月天婷婷在线播放| 久久久久久久极品内射| 麻豆tv入口在线看| 圆产精品久久久久久久久久久| 国产精品久久久久久麻豆一区软件| 最后生还者第二季在线观看| 91精品国产成人www| 色大18成网站www在线观看| 惠美惠精品网| 亚洲人亚洲人色久| 日韩精品人妻中文字幕有码| 91精品久久久久久综合乱菊| 成人免费图片免费观看| 亚洲第一偷拍网| 狠狠做深爱婷婷久久综合一区| 免费高清不卡av| 久久久久久久国产精品影院| h在线视频免费观看完整版| 最新亚洲国产| 激情av一区二区| 欧美激情视频在线| www.4hu95.com四虎| 91麻豆精品秘密| 欧美日韩国产大片| 99re6热只有精品免费观看| 小嫩苞一区二区三区| 日本一本在线视频| 污视频在线观看免费网站| 欧美大片一区| 国产中文伊人| 欧美激情一级二级三级在线视频| 国产一区久久| 美女视频黄是免费| 娇妻被老王脔到高潮失禁视频| 国产亚洲情侣一区二区无| 国产精品蜜芽在线观看| 性久久久久久久久久| 成人免费毛片aaaaa**| 亚洲区成人777777精品| 蜜臀av中文字幕| 青青草视频在线免费直播| 国产精品情侣呻吟对白视频| 久久无码av三级| 成人免费看视频网站| 欧美freesex黑人又粗又大| 国产视频久久久| 日韩08精品| 亚洲国产成人久久综合一区| 久久久久久国产精品美女| 日本人视频jizz页码69| 色乱码一区二区三区在线| 噜噜噜躁狠狠躁狠狠精品视频| 婷婷亚洲综合| 免费黄色特级片| 日韩欧美不卡一区| 国产精品国产亚洲精品| 欧美性xxxxhd| 91精品91久久久中77777老牛| 日韩精品专区在线| 亚洲精品成人久久电影| 欧美日韩不卡中文字幕在线| 超碰在线免费av| 日韩天堂在线观看| 日韩精品中文字幕一区二区| 成人免费看片98| 天天操综合网| 国产一区二区美女诱惑| 亚洲精品第一国产综合野草社区| 悠悠资源av网址| 国产偷人视频免费| 嫩草视频免费在线观看| 黄色一区二区在线| 国产一级理论片| 91香蕉嫩草影院入口| 密臀av在线播放| 亚洲精品成人久久久| 99精产国品一二三产品香蕉| 蜜臀av色欲a片无码精品一区| 精品综合久久88少妇激情| 桃乃木香奈和黑人aⅴ在线播放| 久久久视频免费观看| 久久精品五月婷婷| 亚洲男帅同性gay1069| 在线高清欧美| 精品国产乱码久久久久久浪潮| 国产精品久久毛片| 日韩电影毛片| 很黄很黄的网站免费的| jizz一区二区三区| 香蕉视频xxxx| 午夜精品在线播放| 久久精品美女视频网站| 九九热国产精品视频| 国产最顶级的黄色片在线免费观看| 久久久精品国产sm调教网站| 欧美啪啪小视频| 人妻夜夜添夜夜无码av| 国产精品流白浆在线观看| 99国产精品99| 公肉吊粗大爽色翁浪妇视频| 国产奶水涨喷在线播放| 鬼打鬼之黄金道士1992林正英| 中文字幕欧美人与畜| 日韩网站在线免费观看| 日韩精品最新网址| 欧美专区第一页| 久久网站最新地址| 久久国产精品首页| 成熟老妇女视频| 一二三四在线观看视频| а√天堂资源官网在线资源| 嫩草影院发布页| 99久久精品免费视频| 国产精品一级久久久| 午夜精品久久一牛影视| 99精品国产视频| 亚洲裸色大胆大尺寸艺术写真| 女人扒开双腿让男人捅| 久久久国产精品黄毛片| 精品国产一区二区三区麻豆免费观看完整版| 精品国产乱码久久久久久郑州公司| 秋霞av鲁丝片一区二区| 九九热免费在线观看| 国产美女精品视频| 国产精品视频a| 国产区美女在线| 国产精品欧美一区喷水| 国产高清自拍视频| 国产伦精品一区二区三区千人斩| 日韩在线三级| 免费看国产黄色片| 高潮一区二区三区乱码| 黄色片免费大全| 亚洲一区二区三区自拍| 欧美18视频| 亚洲国产成人精品女人| 亚洲第一二区| 中文字幕一区日韩精品欧美| 秋霞av国产精品一区| 日本在线视频一区二区三区| 精品高清一区二区三区| 天堂中文在线资| 91在线中文| 日本不卡久久| 免费又爽又黄禁片视频1000片| 国产v日韩v欧美v| 国产一区高清视频| 人妻激情偷乱频一区二区三区| 1000精品久久久久久久久| 欧美/亚洲一区| 伊人av在线播放| 中文字幕无码精品亚洲35| 国产亚洲高清在线观看| 国产一区二区精品久久91| 精品成人在线| 91成品人影院| 人人妻人人澡人人爽精品欧美一区| 中文精品无码中文字幕无码专区| 欧美视频成人| 18啪啪污污免费网站| 久久久久久久久久久久久夜| 中文字幕 欧美日韩| 日本熟妇人妻xxxx| 国产精品久久久久77777| 日韩不卡一区| 国产三级精品三级在线观看| 日韩成人免费看| 国产精品h在线观看| 91精品国产综合久久男男| 日韩视频―中文字幕| 日韩精品一区中文字幕| 国产一区二区在线电影| 亚洲天堂久久久久久久| 超碰在线无需免费| av网站免费在线播放| 婷婷综合成人| 99re6热在线精品视频| 色综合久久一区二区三区| 欧美二区三区在线| 中国动漫在线观看完整版免费| 国内一级毛片| 91九色成人| 香蕉影院在线观看| 跑男十一季在线观看免费| 久久综合图区亚洲综合图区| 波多野结衣手机在线视频| 日韩在线综合| av网址在线免费观看| 天天射天天爱天天射干| 日韩欧美视频在线| 一区二区www| 精品国产福利一区二区在线| 成人影院网站| 亚洲福利影院| 亚洲一区二区四区蜜桃| 激情综合网五月| 天堂√中文最新版在线| 国产精品高潮呻吟视频| 亚洲一区www| 少妇被狂c下部羞羞漫画|