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

Redis 實現(xiàn)多規(guī)則限流的思考與實踐

數(shù)據(jù)庫 Redis
市面上很多介紹redis如何實現(xiàn)限流的,但是大部分都有一個缺點,就是只能實現(xiàn)單一的限流,比如1分鐘訪問1次或者60分鐘訪問10次這種,但是如果想一個接口兩種規(guī)則都需要滿足呢,我們的項目又是分布式項目,應(yīng)該如何解決,下面就介紹一下redis實現(xiàn)分布式多規(guī)則限流的方式。

簡介

市面上很多介紹redis如何實現(xiàn)限流的,但是大部分都有一個缺點,就是只能實現(xiàn)單一的限流,比如1分鐘訪問1次或者60分鐘訪問10次這種,但是如果想一個接口兩種規(guī)則都需要滿足呢,我們的項目又是分布式項目,應(yīng)該如何解決,下面就介紹一下redis實現(xiàn)分布式多規(guī)則限流的方式。

思考

  1. 如何一分鐘只能發(fā)送一次驗證碼,一小時只能發(fā)送10次驗證碼等等多種規(guī)則的限流
  2. 如何防止接口被惡意打擊(短時間內(nèi)大量請求)
  3. 如何限制接口規(guī)定時間內(nèi)訪問次數(shù)

解決方法

記錄某IP訪問次數(shù)

使用 String結(jié)構(gòu) 記錄固定時間段內(nèi)某用戶IP訪問某接口的次數(shù)

  • RedisKey = prefix : className : methodName
  • RedisVlue = 訪問次數(shù)

攔截請求:

  1. 初次訪問時設(shè)置 「[RedisKey] [RedisValue=1] [規(guī)定的過期時間]」
  2. 獲取 RedisValue 是否超過規(guī)定次數(shù),超過則攔截,未超過則對 RedisKey 進行加1

分析: 規(guī)則是每分鐘訪問 1000 次

  1. 考慮并發(fā)問題

假設(shè)目前 RedisKey => RedisValue 為 999

目前大量請求進行到第一步( 獲取Redis請求次數(shù) ),那么所有線程都獲取到了值為999,進行判斷都未超過限定次數(shù)則不攔截,導(dǎo)致實際次數(shù)超過 1000 次

「解決辦法:」 保證方法執(zhí)行原子性(加鎖、lua)

  1. 考慮在臨界值進行訪問
  • 思考下圖

圖片圖片

代碼實現(xiàn): 比較簡單

參考:https://gitee.com/y_project/RuoYi-Vue/blob/master/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/RateLimiterAspect.java。

Zset解決臨界值問題

使用 Zset 進行存儲,解決臨界值訪問問題

圖片圖片

網(wǎng)上幾乎都有實現(xiàn),這里就不過多介紹

實現(xiàn)多規(guī)則限流

先確定最終需要的效果

  • 能實現(xiàn)多種限流規(guī)則
  • 能實現(xiàn)防重復(fù)提交

通過以上要求設(shè)計注解(先想象出最終實現(xiàn)效果)

@RateLimiter(
    rules = {
            // 60秒內(nèi)只能訪問10次
            @RateRule(count = 10, time = 60, timeUnit = TimeUnit.SECONDS),
            // 120秒內(nèi)只能訪問20次
            @RateRule(count = 20, time = 120, timeUnit = TimeUnit.SECONDS)

    },
    // 防重復(fù)提交 (5秒鐘只能訪問1次)
    preventDuplicate = true
)

編寫注解(RateLimiter,RateRule)

編寫 RateLimiter 注解。

/**
 * @Description: 請求接口限制
 * @Author: yiFei
 */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Inherited
public @interface RateLimiter {

    /**
     * 限流key
     */
    String key() default RedisKeyConstants.RATE_LIMIT_CACHE_PREFIX;

    /**
     * 限流類型 ( 默認(rèn) Ip 模式 )
     */
    LimitTypeEnum limitType() default LimitTypeEnum.IP;

    /**
     * 錯誤提示
     */
    ResultCode message() default ResultCode.REQUEST_MORE_ERROR;

    /**
     * 限流規(guī)則 (規(guī)則不可變,可多規(guī)則)
     */
    RateRule[] rules() default {};

    /**
     * 防重復(fù)提交值
     */
    boolean preventDuplicate() default false;

    /**
     * 防重復(fù)提交默認(rèn)值
     */
    RateRule preventDuplicateRule() default @RateRule(count = 1, time = 5);
}

編寫RateRule注解

@Target(ElementType.ANNOTATION_TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Inherited
public @interface RateRule {

    /**
     * 限流次數(shù)
     */
    long count() default 10;

    /**
     * 限流時間
     */
    long time() default 60;

    /**
     * 限流時間單位
     */
    TimeUnit timeUnit() default TimeUnit.SECONDS;

}

攔截注解 RateLimiter

  • 確定redis存儲方式

RedisKey = prefix : className : methodName

RedisScore = 時間戳

RedisValue = 任意分布式不重復(fù)的值即可

  • 編寫生成 RedisKey 的方法
/**
 * 通過 rateLimiter 和 joinPoint 拼接  prefix : ip / userId : classSimpleName - methodName
 *
 * @param rateLimiter 提供 prefix
 * @param joinPoint   提供 classSimpleName : methodName
 * @return
 */
public String getCombineKey(RateLimiter rateLimiter, JoinPoint joinPoint) {
    StringBuffer key = new StringBuffer(rateLimiter.key());
    // 不同限流類型使用不同的前綴
    switch (rateLimiter.limitType()) {
        // XXX 可以新增通過參數(shù)指定參數(shù)進行限流
        case IP:
            key.append(IpUtil.getIpAddr(((ServletRequestAttributes) Objects.requireNonNull(RequestContextHolder.getRequestAttributes())).getRequest())).append(":");
            break;
        case USER_ID:
            SysUserDetails user = SecurityUtil.getUser();
            if (!ObjectUtils.isEmpty(user)) key.append(user.getUserId()).append(":");
            break;
        case GLOBAL:
            break;
    }
    MethodSignature signature = (MethodSignature) joinPoint.getSignature();
    Method method = signature.getMethod();
    Class<?> targetClass = method.getDeclaringClass();
    key.append(targetClass.getSimpleName()).append("-").append(method.getName());
    return key.toString();
}

編寫lua腳本

編寫lua腳本 (兩種將時間添加到Redis的方法)。

Zset的UUID value值

UUID(可用其他有相同的特性的值)為Zset中的value值

  • 參數(shù)介紹

KEYS[1] = prefix : ? : className : methodName

KEYS[2] = 唯一ID

KEYS[3] = 當(dāng)前時間

ARGV = [次數(shù),單位時間,次數(shù),單位時間, 次數(shù), 單位時間 ...]

  • 由java傳入分布式不重復(fù)的 value 值
-- 1. 獲取參數(shù)
local key = KEYS[1]
local uuid = KEYS[2]
local currentTime = tonumber(KEYS[3])
-- 2. 以數(shù)組最大值為 ttl 最大值
local expireTime = -1;
-- 3. 遍歷數(shù)組查看是否超過限流規(guī)則
for i = 1, #ARGV, 2 do
    local rateRuleCount = tonumber(ARGV[i])
    local rateRuleTime = tonumber(ARGV[i + 1])
    -- 3.1 判斷在單位時間內(nèi)訪問次數(shù)
    local count = redis.call('ZCOUNT', key, currentTime - rateRuleTime, currentTime)
    -- 3.2 判斷是否超過規(guī)定次數(shù)
    if tonumber(count) >= rateRuleCount then
        return true
    end
    -- 3.3 判斷元素最大值,設(shè)置為最終過期時間
    if rateRuleTime > expireTime then
        expireTime = rateRuleTime
    end
end
-- 4. redis 中添加當(dāng)前時間
redis.call('ZADD', key, currentTime, uuid)
-- 5. 更新緩存過期時間
redis.call('PEXPIRE', key, expireTime)
-- 6. 刪除最大時間限度之前的數(shù)據(jù),防止數(shù)據(jù)過多
redis.call('ZREMRANGEBYSCORE', key, 0, currentTime - expireTime)
return false

根據(jù)時間戳作為Zset中的value值

  • 參數(shù)介紹

KEYS[1] = prefix : ? : className : methodName

KEYS[2] = 當(dāng)前時間

ARGV = [次數(shù),單位時間,次數(shù),單位時間, 次數(shù), 單位時間 ...]

  • 根據(jù)時間進行生成value值,考慮同一毫秒添加相同時間值問題
  • 以下為第二種實現(xiàn)方式,在并發(fā)高的情況下效率低,value是通過時間戳進行添加,但是訪問量大的話會使得一直在調(diào)用 redis.call('ZADD', key, currentTime, currentTime),但是在不沖突value的情況下,會比生成 UUID 好

-- 1. 獲取參數(shù)
local key = KEYS[1]
local currentTime = KEYS[2]
-- 2. 以數(shù)組最大值為 ttl 最大值
local expireTime = -1;
-- 3. 遍歷數(shù)組查看是否越界
for i = 1, #ARGV, 2 do
    local rateRuleCount = tonumber(ARGV[i])
    local rateRuleTime = tonumber(ARGV[i + 1])
    -- 3.1 判斷在單位時間內(nèi)訪問次數(shù)
    local count = redis.call('ZCOUNT', key, currentTime - rateRuleTime, currentTime)
    -- 3.2 判斷是否超過規(guī)定次數(shù)
    if tonumber(count) >= rateRuleCount then
        return true
    end
    -- 3.3 判斷元素最大值,設(shè)置為最終過期時間
    if rateRuleTime > expireTime then
        expireTime = rateRuleTime
    end
end
-- 4. 更新緩存過期時間
redis.call('PEXPIRE', key, expireTime)
-- 5. 刪除最大時間限度之前的數(shù)據(jù),防止數(shù)據(jù)過多
redis.call('ZREMRANGEBYSCORE', key, 0, currentTime - expireTime)
-- 6. redis 中添加當(dāng)前時間  ( 解決多個線程在同一毫秒添加相同 value 導(dǎo)致 Redis 漏記的問題 )
-- 6.1 maxRetries 最大重試次數(shù) retries 重試次數(shù)
local maxRetries = 5
local retries = 0
while true do
    local result = redis.call('ZADD', key, currentTime, currentTime)
    if result == 1 then
        -- 6.2 添加成功則跳出循環(huán)
        break
    else
        -- 6.3 未添加成功則 value + 1 再次進行嘗試
        retries = retries + 1
        if retries >= maxRetries then
            -- 6.4 超過最大嘗試次數(shù) 采用添加隨機數(shù)策略
            local random_value = math.random(1, 1000)
            currentTime = currentTime + random_value
        else
            currentTime = currentTime + 1
        end
    end
end

return false

編寫 AOP 攔截

@Autowired
private RedisTemplate<String, Object> redisTemplate;

@Autowired
private RedisScript<Boolean> limitScript;

/**
 * 限流
 * XXX 對限流要求比較高,可以使用在 Redis中對規(guī)則進行存儲校驗 或者使用中間件
 *
 * @param joinPoint   joinPoint
 * @param rateLimiter 限流注解
 */
@Before(value = "@annotation(rateLimiter)")
public void boBefore(JoinPoint joinPoint, RateLimiter rateLimiter) {
    // 1. 生成 key
    String key = getCombineKey(rateLimiter, joinPoint);
    try {
        // 2. 執(zhí)行腳本返回是否限流
        Boolean flag = redisTemplate.execute(limitScript,
                ListUtil.of(key, String.valueOf(System.currentTimeMillis())),
                (Object[]) getRules(rateLimiter));
        // 3. 判斷是否限流
        if (Boolean.TRUE.equals(flag)) {
            log.error("ip: '{}' 攔截到一個請求 RedisKey: '{}'",
                    IpUtil.getIpAddr(((ServletRequestAttributes) Objects.requireNonNull(RequestContextHolder.getRequestAttributes())).getRequest()),
                    key);
            throw new ServiceException(rateLimiter.message());
        }
    } catch (ServiceException e) {
        throw e;
    } catch (Exception e) {
        e.printStackTrace();
    }
}

/**
 * 獲取規(guī)則
 *
 * @param rateLimiter 獲取其中規(guī)則信息
 * @return
 */
private Long[] getRules(RateLimiter rateLimiter) {
    int capacity = rateLimiter.rules().length << 1;
    // 1. 構(gòu)建 args
    Long[] args = new Long[rateLimiter.preventDuplicate() ? capacity + 2 : capacity];
    // 3. 記錄數(shù)組元素
    int index = 0;
    // 2. 判斷是否需要添加防重復(fù)提交到redis進行校驗
    if (rateLimiter.preventDuplicate()) {
        RateRule preventRateRule = rateLimiter.preventDuplicateRule();
        args[index++] = preventRateRule.count();
        args[index++] = preventRateRule.timeUnit().toMillis(preventRateRule.time());
    }
    RateRule[] rules = rateLimiter.rules();
    for (RateRule rule : rules) {
        args[index++] = rule.count();
        args[index++] = rule.timeUnit().toMillis(rule.time());
    }
    return args;
}

以上,歡迎大家提出意見。

責(zé)任編輯:武曉燕 來源: 架構(gòu)精進之路
相關(guān)推薦

2022-01-10 08:17:40

異地設(shè)計實踐

2023-10-16 16:00:27

Redis限流

2023-09-07 08:29:23

多屏云視聽小電視

2012-03-21 10:09:12

2022-12-30 15:27:13

2025-04-30 05:00:00

批量運維系統(tǒng)

2020-05-19 08:52:31

APP滲透測試終端安全

2024-04-08 11:04:03

2021-11-05 21:33:28

Redis數(shù)據(jù)高并發(fā)

2021-08-09 11:35:40

設(shè)計實踐應(yīng)用

2018-11-15 07:56:26

2023-06-26 07:42:39

2023-09-07 08:58:36

K8s多集群

2018-03-26 14:21:51

音視頻延遲架構(gòu)網(wǎng)絡(luò)

2015-12-28 16:35:36

UCloud

2021-05-27 11:03:10

飛豬Serverless

2024-01-09 07:48:07

推薦排序算法策略數(shù)據(jù)背景

2022-09-08 10:08:31

阿里云可觀測云原生

2022-01-07 06:12:08

RPC框架限流

2014-07-15 14:17:30

成本業(yè)務(wù)去IOE
點贊
收藏

51CTO技術(shù)棧公眾號

一道本无吗dⅴd在线播放一区| 最新国产の精品合集bt伙计| 茄子视频成人在线| 天天躁日日躁aaaa视频| 玖玖精品在线| 亚洲3atv精品一区二区三区| 日韩电影天堂视频一区二区| av在线免费在线观看| 天天操天天干天天| 91在线播放网站| 久久精品久久精品| 97视频在线观看免费| 日韩一区二区三区四区视频| 大桥未久女教师av一区二区| 在线观看视频欧美| 久久男人资源站| yourporn在线观看视频| 大桥未久av一区二区三区中文| 国产成人精品国内自产拍免费看| av最新在线观看| 神马久久影院| 日韩欧美视频一区| 狠狠热免费视频| 9999精品成人免费毛片在线看 | 黄色a一级视频| 日本免费在线一区| 色综合久久久久综合体| 在线观看污视频| 亚洲欧美视频一区二区| 久久夜色精品国产噜噜av| 99精彩视频在线观看免费| 亚洲在线视频播放| 三级一区在线视频先锋| 97视频在线观看成人| 欧美交换国产一区内射| 999这里只有精品| av在线播放一区二区| 色屁屁一区二区| 国产极品尤物在线| 青青在线视频| 亚洲男人的天堂在线aⅴ视频| 日本婷婷久久久久久久久一区二区 | xxxx黄色片| 97视频一区| 欧美一区二区福利在线| 日韩在线不卡一区| 国产精品黄色片| 欧美无砖砖区免费| 午夜免费精品视频| 免费在线观看一区| 欧美中文一区二区三区| 凹凸日日摸日日碰夜夜爽1| 黄色aa久久| 精品久久久久久国产| 免费毛片网站在线观看| av手机免费在线观看| 亚洲永久精品国产| 久久久久久久香蕉| 青草影视电视剧免费播放在线观看| 亚洲精品中文在线观看| 欧美日韩午夜爽爽| 男女视频在线| 婷婷综合另类小说色区| 欧美不卡在线播放| 欲香欲色天天天综合和网| 岛国视频午夜一区免费在线观看| 精品无码国产一区二区三区av| 国产在线拍揄自揄拍视频| 亚洲一区二区三区不卡国产欧美| 免费高清一区二区三区| 岛国av免费在线观看| 精品久久久久久中文字幕| 成年人观看网站| 日本肉肉一区| 欧美一级免费大片| 日韩成人av一区二区| 妖精一区二区三区精品视频| 中文字幕在线日韩| 26uuu成人网| 最新亚洲一区| 国产91精品网站| 国产精品高潮呻吟av| 国产91综合一区在线观看| 国产综合第一页| 国产高清视频在线| 亚洲女与黑人做爰| 无罩大乳的熟妇正在播放| 美女100%一区| 日韩一级片在线观看| 极品白嫩丰满美女无套| 久久理论电影| 91av在线国产| 国产一区二区在线播放视频| 成人免费视频app| 欧美另类一区| av免费在线免费| 色综合天天天天做夜夜夜夜做| 天天干天天草天天| 林ゆな中文字幕一区二区| 一区二区日韩精品| 精品无码久久久久久久| 久久亚洲影院| 国产精品免费区二区三区观看 | 97精品视频在线播放| 国产精品sm调教免费专区| 国产成人av电影在线| 日韩免费中文专区| 97超碰免费在线| 欧美一区二区三区免费在线看| 日本少妇色视频| 亚洲乱码在线| 国产精品成人免费视频| 日韩在线一区二区三区四区| 中文字幕日韩一区| 免费在线观看毛片网站| 国产精品17p| 精品国产拍在线观看| 人妻丰满熟妇av无码区| 岛国精品在线播放| 日本丰满大乳奶| 成人亚洲综合| 亚洲色图国产精品| 日韩经典在线观看| 国产成人在线免费观看| 在线成人av电影| 日韩不卡视频在线观看| 日韩精品极品视频| 国产真人真事毛片| 国产精品123区| 懂色av一区二区三区四区五区| 欧美福利在线播放| 国产视频精品自拍| 久久艹免费视频| av中文字幕一区| 日本大片免费看| 欧美三级一区| 欧美老女人在线视频| 又污又黄的网站| 中文字幕一区二区三区在线不卡| 国产一级不卡毛片| 国产成人精品一区二区免费看京| 欧美在线免费观看| 亚洲欧洲综合在线| 狠狠综合久久av一区二区小说 | 欧美国产欧美亚州国产日韩mv天天看完整| 国产精品裸体瑜伽视频| 成人av动漫| 午夜精品久久久久久99热| 成人乱码一区二区三区| 亚洲高清免费观看 | 久久久久久久少妇| 色综合综合网| 国产欧美日韩视频| 日本蜜桃在线观看| 欧美人伦禁忌dvd放荡欲情| 特黄一区二区三区| 久久国产福利国产秒拍| 强伦女教师2:伦理在线观看| 白嫩亚洲一区二区三区| 色综合久久久久久中文网| 午夜精品久久久久久久99老熟妇 | 日韩xxxx视频| 麻豆精品99| 国产不卡av在线免费观看| av一本在线| 日韩一区二区中文字幕| 欧美一级高潮片| 91老司机福利 在线| 99视频精品免费| 91成人观看| 国产成人免费电影| 亚洲黄色中文字幕| 色婷婷综合久久久久| 国产99视频在线| 午夜精品久久久久久久久久久| 30一40一50老女人毛片| 免费成人在线网站| 免费日韩在线观看| 欧美18xxxx| 国产精品丝袜高跟| 暖暖在线中文免费日本| 亚洲性视频网站| 国产精品无码白浆高潮| 偷窥少妇高潮呻吟av久久免费| 精品无人区无码乱码毛片国产| 久久国产精品99久久人人澡| 无码专区aaaaaa免费视频| 日本一区二区在线看| 91亚色免费| 日韩免费小视频| 欧美男插女视频| 国产综合在线观看| 日韩免费视频一区| 亚洲国产精品无码久久久| 综合网在线视频| 中文字幕狠狠干| 国产一区高清在线| 青青在线视频观看| 午夜精产品一区二区在线观看的| 欧美精品一二| 懂色中文一区二区三区在线视频| 三级成人黄色影院| 久久6免费高清热精品| 国产福利免费在线观看| 亚洲а∨天堂久久精品9966| 在线播放亚洲精品| 欧美日韩国产专区| 中文字幕亚洲欧美日韩| 国产欧美视频在线观看| 性囗交免费视频观看| 精品一区二区三区免费毛片爱| 精品视频无码一区二区三区| 亚洲午夜伦理| 国产日韩视频在线播放| 九九亚洲精品| 国产麻豆乱码精品一区二区三区 | 含羞草www国产在线视频| 日韩国产激情在线| 亚洲乱码国产乱码精品精软件| 欧美三级视频在线播放| 久久久久久久黄色片| 亚洲六月丁香色婷婷综合久久 | 日本高清免费观看| 青青草视频一区| 日本成年人网址| 黄色成人av网站| 日韩中文在线字幕| 国产精品久久久久久久免费观看| 欧美性xxxx69| 色综合综合网| 欧美日韩系列| 精品一区在线| 日本一区二区三区免费观看| 精品欠久久久中文字幕加勒比| 91精品黄色| 欧美第一在线视频| 91久久精品国产| 成人国产精品一区二区网站| 国产精品一区二区三区毛片淫片| 懂色aⅴ精品一区二区三区| 国产999视频| 亚洲精品粉嫩美女一区| 国产精品99蜜臀久久不卡二区| 黄色亚洲网站| 日韩av电影手机在线| 欧美片第一页| 国产精品高潮呻吟久久av无限 | 日韩欧美精品在线| a视频免费在线观看| 日韩午夜av电影| 亚洲精品视频网| 亚洲成人黄色在线| 亚州男人的天堂| 精品亚洲国产视频| 国产在线视频网址| 中文字幕亚洲欧美日韩在线不卡 | 欧美激情一二三| 国产精品一区二区日韩| 青青久久av北条麻妃黑人| 国产成人免费9x9x人网站视频| 国产精品国语对白| 国产精品99久久免费| 99久久无色码| 日本午夜精品久久久| 少妇免费毛片久久久久久久久| 日韩精品二区| 天堂а√在线中文在线| 亚洲国产精品一区制服丝袜| 99蜜桃臀久久久欧美精品网站| 日本亚洲最大的色成网站www| 国产福利精品一区二区三区| 国产成人99久久亚洲综合精品| 蜜臀av粉嫩av懂色av| 久久久99精品免费观看| 国产免费嫩草影院| 一片黄亚洲嫩模| 国产精品100| 欧美男人的天堂一二区| 国产又大又黄的视频| 亚洲高清一区二| 春暖花开成人亚洲区| 美乳少妇欧美精品| 中文字幕成在线观看| 国产欧美日韩精品丝袜高跟鞋| 2020国产精品极品色在线观看| 久久精品日产第一区二区三区乱码| 成人影视亚洲图片在线| 男人c女人视频| 日韩精品视频网站| www.com日本| 国产精品你懂的在线欣赏| 国产一级免费观看| 欧美三级日本三级少妇99| 亚洲精品免费在线观看视频| 主播福利视频一区| 黄色影院在线看| 国产精品自拍偷拍| 麻豆成人入口| 免费在线精品视频| 日韩成人免费看| 性欧美18—19sex性高清| 欧美国产欧美综合| 中日韩黄色大片| 日韩一区二区免费在线电影| 国产精品一区二区婷婷| 久久全球大尺度高清视频| 欧美成人福利| 免费成人深夜夜行视频| 亚洲东热激情| 性一交一黄一片| 中文字幕av不卡| 精品成人久久久| 欧美不卡在线视频| 亚洲成人三级| 国产精品99久久久久久www| 韩国女主播一区二区三区| 男人j进女人j| 国精品**一区二区三区在线蜜桃| 欧美图片第一页| 精品久久久久久久久久久| 亚洲av无码片一区二区三区| 日韩中文综合网| 成人精品动漫| 日本一区网站| 99综合精品| 少妇被狂c下部羞羞漫画| 一区二区三区日韩欧美精品| 国产一区二区在线不卡| 色婷婷av一区二区三区久久| 欧美va在线| 亚洲精品tv久久久久久久久| 日韩专区中文字幕一区二区| 国产呦小j女精品视频| 欧美日韩中文字幕在线| 日韩中文字幕免费观看| 97精品国产97久久久久久免费| 一区二区三区亚洲变态调教大结局| 国产免费一区二区三区四在线播放| 精品午夜久久福利影院| 久久久久久久久福利| 在线观看精品一区| 国产福利小视频在线观看| 国产精品mp4| 欧洲激情综合| 少妇网站在线观看| 国产精品久久三| 亚洲怡红院av| 久久99精品久久久久久琪琪| 亚洲电影一区| av女优在线播放| 91丝袜高跟美女视频| 男人日女人网站| 国产亚洲精品一区二区| 成人午夜精品| 一区二区三区的久久的视频| 久久99久久99精品免视看婷婷 | 亚洲成人三区| 在线观看欧美一区二区| 亚洲自拍偷拍欧美| 欧美在线 | 亚洲| 亲爱的老师9免费观看全集电视剧| 亚州精品视频| 男人女人黄一级| 亚洲日本在线看| 日本高清视频免费观看| 欧洲永久精品大片ww免费漫画| 精品freesex老太交| 亚洲免费黄色录像| 亚洲另类在线一区| 日本免费一区视频| 国产成人拍精品视频午夜网站| 色喇叭免费久久综合| 女教师高潮黄又色视频| 亚洲成av人片一区二区| 国产网站在线播放| 91精品免费视频| 亚洲久久一区二区| x88av在线| 日韩午夜激情电影| 欧洲一区二区三区精品| 欧美一级免费在线观看| 成人av免费在线观看| 国产乡下妇女三片| 色中色综合影院手机版在线观看 | 青少年xxxxx性开放hg| 国产成人福利片| 波多野结衣电车痴汉| 欧美疯狂xxxx大交乱88av| 免费短视频成人日韩| 91插插插影院| 色噜噜久久综合| 特级毛片在线| 日韩欧美一区二区三区久久婷婷| 国产一区二区日韩精品| 欧美一级淫片免费视频黄| 欧美日韩国产成人在线| 日韩精品欧美激情一区二区| 中文字幕乱视频| 日韩一级二级三级| 国产精品久久久久av电视剧|