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

SpringBoot 搶券活動(dòng):Redis 熱點(diǎn) Key 三大防護(hù)

數(shù)據(jù)庫 Redis
本文將從緩存擊穿、分片、異步化等角度,探討如何在項(xiàng)目中優(yōu)化?Redis?和數(shù)據(jù)庫的性能,以應(yīng)對搶券活動(dòng)中的熱點(diǎn)?Key?問題。

引言

在電商系統(tǒng)的搶券活動(dòng)中,經(jīng)常會出現(xiàn)某張熱門優(yōu)惠券被大量用戶同時(shí)訪問的情況,這就是典型的熱點(diǎn) Key 問題。這類問題會導(dǎo)致 Redis 負(fù)載過高,甚至可能引發(fā)緩存擊穿,大量請求直接打到數(shù)據(jù)庫,造成系統(tǒng)崩潰。

本文將從緩存擊穿、分片、異步化等角度,探討如何在項(xiàng)目中優(yōu)化 Redis 和數(shù)據(jù)庫的性能,以應(yīng)對搶券活動(dòng)中的熱點(diǎn) Key 問題。

熱點(diǎn) Key 問題分析

在搶券場景中,熱點(diǎn) Key 問題主要表現(xiàn)為:

  • 當(dāng)該熱點(diǎn) Key 在 Redis 中過期時(shí),大量請求會同時(shí)穿透到數(shù)據(jù)庫,造成緩存擊穿
  • 某張熱門優(yōu)惠券的訪問量遠(yuǎn)超其他優(yōu)惠券,導(dǎo)致 Redis 單節(jié)點(diǎn)負(fù)載過高
  • 數(shù)據(jù)庫瞬時(shí)承受巨大壓力,可能導(dǎo)致查詢超時(shí)甚至服務(wù)不可用

?

  • 緩存擊穿:是指當(dāng)某一key的緩存過期時(shí)大并發(fā)量的請求同時(shí)訪問此key,瞬間擊穿緩存服務(wù)器直接訪問數(shù)據(jù)庫,讓數(shù)據(jù)庫處于負(fù)載的情況。
  • 緩存穿透:是指緩存服務(wù)器中沒有緩存數(shù)據(jù),數(shù)據(jù)庫中也沒有符合條件的數(shù)據(jù),導(dǎo)致業(yè)務(wù)系統(tǒng)每次都繞過緩存服務(wù)器查詢下游的數(shù)據(jù)庫,緩存服務(wù)器完全失去了其應(yīng)有的作用。
  • 緩存雪崩:是指當(dāng)大量緩存同時(shí)過期或緩存服務(wù)宕機(jī),所有請求的都直接訪問數(shù)據(jù)庫,造成數(shù)據(jù)庫高負(fù)載,影響性能,甚至數(shù)據(jù)庫宕機(jī)。

緩存擊穿的解決方案

分布式鎖
// 使用Redisson實(shí)現(xiàn)分布式鎖防止緩存擊穿
@Service
public class CouponService {
    
    @Autowired
    private RedissonClient redissonClient;
    
    @Autowired
    private RedisTemplate<String, Object> redisTemplate;
    
    @Autowired
    private CouponDao couponDao;
    
    public Coupon getCoupon(String couponId) {
        String key = "coupon:" + couponId;
        Coupon coupon = (Coupon) redisTemplate.opsForValue().get(key);
        
        if (coupon == null) {
            // 獲取分布式鎖
            RLock lock = redissonClient.getLock("lock:coupon:" + couponId);
            try {
                // 嘗試加鎖,最多等待100秒,鎖持有時(shí)間為10秒
                boolean isLocked = lock.tryLock(100, 10, TimeUnit.SECONDS);
                if (isLocked) {
                    try {
                        // 再次檢查Redis中是否有值
                        coupon = (Coupon) redisTemplate.opsForValue().get(key);
                        if (coupon == null) {
                            // 從數(shù)據(jù)庫中查詢
                            coupon = couponDao.getCouponById(couponId);
                            if (coupon != null) {
                                // 設(shè)置帶過期時(shí)間的緩存
                                redisTemplate.opsForValue().set(key, coupon, 30, TimeUnit.MINUTES);
                            }
                        }
                    } finally {
                        // 釋放鎖
                        lock.unlock();
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return coupon;
    }
}

熱點(diǎn) Key 分片處理

當(dāng)單個(gè)熱點(diǎn) Key 的訪問量極高時(shí),可以采用分片策略將請求分散到多個(gè) Redis 節(jié)點(diǎn)上:

// 熱點(diǎn)Key分片處理實(shí)現(xiàn)
@Service
public class CouponService {
    
    @Autowired
    private RedisTemplate<String, Object> redisTemplate;
    
    @Autowired
    private CouponDao couponDao;
    
    // 分片數(shù)量
    private static final int SHARD_COUNT = 16;
    
    // 獲取分片后的Key
    private String getShardedKey(String couponId, int shardIndex) {
        return"coupon:" + couponId + ":shard" + shardIndex;
    }
    
    // 初始化分片緩存
    public void initCouponShards(String couponId, int stock) {
        // 計(jì)算每個(gè)分片的庫存
        int stockPerShard = stock / SHARD_COUNT;
        int remaining = stock % SHARD_COUNT;
        
        for (int i = 0; i < SHARD_COUNT; i++) {
            int currentStock = stockPerShard + (i < remaining ? 1 : 0);
            String key = getShardedKey(couponId, i);
            redisTemplate.opsForValue().set(key, currentStock);
        }
    }
    
    // 扣減庫存(嘗試從隨機(jī)分片獲取)
    public boolean deductStock(String couponId) {
        // 隨機(jī)選擇一個(gè)分片
        int shardIndex = new Random().nextInt(SHARD_COUNT);
        String key = getShardedKey(couponId, shardIndex);
        
        // 使用Lua腳本原子性地扣減庫存
        String script = 
            "local stock = tonumber(redis.call('get', KEYS[1])) " +
            "if stock and stock > 0 then " +
            "  redis.call('decr', KEYS[1]) " +
            "  return 1 " +
            "else " +
            "  return 0 " +
            "end";
        
        DefaultRedisScript<Long> redisScript = new DefaultRedisScript<>();
        redisScript.setScriptText(script);
        redisScript.setResultType(Long.class);
        
        Long result = redisTemplate.execute(redisScript, Collections.singletonList(key));
        return result != null && result == 1;
    }
}
根據(jù)分片負(fù)載動(dòng)態(tài)選擇
// 動(dòng)態(tài)分片選擇(根據(jù)剩余庫存)
public boolean deductStockByDynamicShard(String couponId) {
    // 獲取所有分片的庫存
    List<String> keys = new ArrayList<>();
    for (int i = 0; i < SHARD_COUNT; i++) {
        keys.add(getShardedKey(couponId, i));
    }
    
    // 使用MGET批量獲取所有分片庫存
    List<Object> results = redisTemplate.opsForValue().multiGet(keys);
    
    // 選擇庫存最多的分片
    int maxStockIndex = -1;
    int maxStock = 0;
    
    for (int i = 0; i < results.size(); i++) {
        if (results.get(i) != null) {
            int stock = Integer.parseInt(results.get(i).toString());
            if (stock > maxStock) {
                maxStock = stock;
                maxStockIndex = i;
            }
        }
    }
    
    if (maxStockIndex >= 0) {
        // 對選中的分片進(jìn)行扣減
        String key = getShardedKey(couponId, maxStockIndex);
        // 執(zhí)行Lua腳本扣減庫存...
    }
    
    returnfalse;
}

異步化處理

// 異步化處理搶券請求
@Service
public class CouponService {
    
    @Autowired
    private RedisTemplate<String, Object> redisTemplate;
    
    @Autowired
    private CouponDao couponDao;
    
    @Autowired
    private RabbitTemplate rabbitTemplate;
    
    // 搶券接口 - 快速返回,異步處理
    public boolean grabCoupon(String userId, String couponId) {
        // 先快速檢查Redis中是否有庫存
        String stockKey = "coupon:" + couponId + ":stock";
        Long stock = (Long) redisTemplate.opsForValue().get(stockKey);
        
        if (stock == null || stock <= 0) {
            returnfalse;
        }
        
        // 使用Lua腳本原子性地扣減庫存
        String script = 
            "local stock = tonumber(redis.call('get', KEYS[1])) " +
            "if stock and stock > 0 then " +
            "  redis.call('decr', KEYS[1]) " +
            "  return 1 " +
            "else " +
            "  return 0 " +
            "end";
        
        DefaultRedisScript<Long> redisScript = new DefaultRedisScript<>();
        redisScript.setScriptText(script);
        redisScript.setResultType(Long.class);
        
        Long result = redisTemplate.execute(redisScript, Collections.singletonList(stockKey));
        
        if (result != null && result == 1) {
            // 庫存扣減成功,發(fā)送消息到MQ異步處理
            CouponGrabMessage message = new CouponGrabMessage(userId, couponId);
            rabbitTemplate.convertAndSend("coupon.exchange", "coupon.grab", message);
            returntrue;
        }
        
        returnfalse;
    }
    
    // 異步處理搶券結(jié)果
    @RabbitListener(queues = "coupon.grab.queue")
    public void handleCouponGrab(CouponGrabMessage message) {
        try {
            // 在數(shù)據(jù)庫中記錄用戶領(lǐng)取優(yōu)惠券的信息
            couponDao.recordUserCoupon(message.getUserId(), message.getCouponId());
            
            // 可以在這里添加其他業(yè)務(wù)邏輯,如發(fā)送通知等
        } catch (Exception e) {
            // 處理失敗,可以記錄日志或進(jìn)行補(bǔ)償操作
            log.error("Failed to handle coupon grab for user: {}, coupon: {}", 
                    message.getUserId(), message.getCouponId(), e);
            
            // 回滾Redis中的庫存(這里簡化處理,實(shí)際中可能需要更復(fù)雜的補(bǔ)償機(jī)制)
            String stockKey = "coupon:" + message.getCouponId() + ":stock";
            redisTemplate.opsForValue().increment(stockKey);
        }
    }
}

其他優(yōu)化策略

本地緩存
// 使用Caffeine實(shí)現(xiàn)本地緩存
@Service
public class CouponService {
    
    // 本地緩存,最大容量100,過期時(shí)間5分鐘
    private LoadingCache<String, Coupon> localCache = Caffeine.newBuilder()
            .maximumSize(100)
            .expireAfterWrite(5, TimeUnit.MINUTES)
            .build(this::loadCouponFromRedis);
    
    // 從Redis加載優(yōu)惠券信息
    private Coupon loadCouponFromRedis(String couponId) {
        String key = "coupon:" + couponId;
        return (Coupon) redisTemplate.opsForValue().get(key);
    }
    
    // 獲取優(yōu)惠券信息
    public Coupon getCoupon(String couponId) {
        try {
            return localCache.get(couponId);
        } catch (ExecutionException e) {
            // 處理異常,從其他地方獲取數(shù)據(jù)
            return loadCouponFromRedis(couponId);
        }
    }
}
限流
// 使用Sentinel實(shí)現(xiàn)熱點(diǎn)參數(shù)限流
@Service
public class CouponService {
    
    // 定義熱點(diǎn)參數(shù)限流規(guī)則
    static {
        initFlowRules();
    }
    
    private static void initFlowRules() {
        List<ParamFlowRule> rules = new ArrayList<>();
        ParamFlowRule rule = new ParamFlowRule();
        rule.setResource("getCoupon");
        rule.setParamIdx(0); // 第一個(gè)參數(shù)作為限流參數(shù)
        rule.setCount(1000); // 每秒允許的請求數(shù)
        
        // 針對特定值的限流設(shè)置
        ParamFlowItem item = new ParamFlowItem();
        item.setObject("hotCouponId1");
        item.setClassType(String.class.getName());
        item.setCount(500); // 針對熱點(diǎn)優(yōu)惠券ID的特殊限流
        rule.getParamFlowItemList().add(item);
        
        rules.add(rule);
        ParamFlowRuleManager.loadRules(rules);
    }
    
    // 帶限流的獲取優(yōu)惠券方法
    public Coupon getCoupon(String couponId) {
        Entry entry = null;
        try {
            // 資源名可使用方法名
            entry = SphU.entry("getCoupon", EntryType.IN, 1, couponId);
            
            // 業(yè)務(wù)邏輯
            return getCouponFromRedis(couponId);
        } catch (BlockException ex) {
            // 資源訪問阻止,被限流或降級
            // 進(jìn)行相應(yīng)的處理操作
            return getDefaultCoupon();
        } finally {
            if (entry != null) {
                entry.exit();
            }
        }
    }
}

實(shí)施建議

  • 對優(yōu)惠券系統(tǒng)進(jìn)行分層設(shè)計(jì),將熱點(diǎn)數(shù)據(jù)與普通數(shù)據(jù)分離處理
  • 監(jiān)控 Redis 的性能指標(biāo),及時(shí)發(fā)現(xiàn)和處理熱點(diǎn) Key
  • 提前對可能的熱點(diǎn) Key 進(jìn)行預(yù)判和預(yù)熱
  • 設(shè)計(jì)完善的降級和熔斷策略,保障系統(tǒng)在極端情況下的可用性
  • 定期進(jìn)行全鏈路壓測,發(fā)現(xiàn)系統(tǒng)瓶頸并持續(xù)優(yōu)化

總結(jié)

在搶券活動(dòng)等高并發(fā)場景下,熱點(diǎn) Key 問題是 Redis 和數(shù)據(jù)庫面臨的主要挑戰(zhàn)之一。通過采用緩存擊穿預(yù)防、熱點(diǎn) Key 分片、異步化處理、本地緩存和限流等多種優(yōu)化策略,可以有效提升系統(tǒng)的性能和穩(wěn)定性。

在實(shí)際應(yīng)用中,應(yīng)根據(jù)具體業(yè)務(wù)場景選擇合適的優(yōu)化方案,并進(jìn)行充分的性能測試和壓力測試,確保系統(tǒng)在高并發(fā)情況下依然能夠穩(wěn)定運(yùn)行。

責(zé)任編輯:武曉燕 來源: 一安未來
相關(guān)推薦

2021-03-28 21:33:07

Redis熱點(diǎn)key

2025-05-28 03:10:00

2011-03-11 15:07:24

2023-04-26 01:07:03

2020-02-11 16:10:44

Redis分布式鎖Java

2019-01-09 09:35:41

搶票Python軟件

2019-10-30 16:54:08

golangredis數(shù)據(jù)庫

2018-07-13 05:31:13

2010-09-03 10:05:00

安全防護(hù)

2018-02-23 17:16:03

態(tài)牛

2022-11-03 08:56:43

RediskeyBitmap

2014-05-13 09:05:09

2014-05-13 11:45:38

2024-11-26 08:09:58

2021-06-21 18:23:39

戴爾

2017-07-19 16:09:27

華碩

2024-11-21 16:47:55

2024-12-02 01:16:53

2023-04-17 08:04:15

Redis性能內(nèi)存

2025-02-10 09:22:40

點(diǎn)贊
收藏

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

欧美日韩亚洲综合| 国产亚洲视频系列| 97精品一区二区三区| 欧美一级片黄色| 国产va在线视频| 久久久久99精品一区| 国产精品十八以下禁看| 岛国毛片在线观看| 亚洲a级精品| 在线观看精品一区| 超薄肉色丝袜足j调教99| 蜜臀av在线观看| 性8sex亚洲区入口| 久久久国产精品亚洲一区| 美女扒开腿免费视频| 日本欧美韩国| 亚洲午夜成aⅴ人片| 日本一区视频在线播放| av中文字幕免费| 米奇777在线欧美播放| 毛片精品免费在线观看| 国产精品一区二区入口九绯色| 欧美成人一二区| 精品久久久中文| 午夜久久久久久久久久久| 性猛交xxxx| 国产福利电影一区二区三区| 日韩美女免费线视频| 校园春色 亚洲| 成人在线免费观看91| 亚洲精品国产免费| 中文字幕1区2区| 少妇高潮一区二区三区99| 激情久久av一区av二区av三区| gogogo免费高清日本写真| 毛片在线播放网站| 波多野结衣亚洲一区| 亚洲www在线| 中文字幕av资源| 久热国产精品| 欧美性一区二区三区| 黄色一级片在线| 国产精品久久久久久麻豆一区软件 | www亚洲视频| 黄色日韩在线| 欧美成人黑人xx视频免费观看| 欧美日韩国产黄色| 久久99国产精品视频| 亚洲黄在线观看| 国产成人精品一区二区三区在线观看 | 国产性生活一级片| 欧美黄色a视频| 精品视频123区在线观看| 韩国一区二区av| 黄色美女视频在线观看| 亚洲综合成人在线视频| 中国老女人av| 在线中文字幕视频观看| 亚洲美女偷拍久久| 日本天堂免费a| 自拍亚洲图区| 亚洲一区二区三区视频在线| 久久免费一级片| 日本在线视频中文有码| 一区二区三区欧美在线观看| 特大黑人娇小亚洲女mp4| 国产鲁鲁视频在线观看特色| 综合欧美亚洲日本| 自拍偷拍一区二区三区| 在线观看电影av| 一区二区三区在线免费播放| 国产成人一区二区三区别| 欧美家庭影院| 欧美日韩免费看| 国产精品亚洲a| 成人精品国产| 91精品国产手机| 又黄又色的网站| 青青一区二区| 一本久久综合亚洲鲁鲁| 精品国产国产综合精品| 自拍欧美日韩| 国内精品久久久久伊人av| 久久青青草视频| 免费观看在线综合色| 国产日韩欧美一二三区| 国产后入清纯学生妹| 成人免费av在线| 欧美成人第一区| 91社区在线高清| 一区二区三区在线观看国产| 黄色国产一级视频| 成人黄色免费网站| 精品国产免费久久| 亚洲第一香蕉网| 国产精品久久观看| 91黑丝高跟在线| 中文字幕 自拍偷拍| 国产一区二区三区免费在线观看| 精品久久精品久久| 亚洲欧美视频一区二区| 亚洲综合一二区| 中文字幕国产传媒| 99ri日韩精品视频| 在线丨暗呦小u女国产精品| 久久久久久久久久网站| 久久电影一区| 91色精品视频在线| 青草久久伊人| 亚洲永久免费视频| 免费看a级黄色片| 6080成人| 久久精品久久久久久国产 免费| 久久精品女人毛片国产| 另类小说一区二区三区| 国产日韩精品推荐| 黄色一级片在线观看| 欧美性高潮床叫视频| 91网址在线观看精品| 久久99高清| 高清在线视频日韩欧美| 亚洲一区在线观| 久久精品一区二区三区四区| 337p亚洲精品色噜噜狠狠p| av在线播放一区| 亚洲高清在线观看| wwwav国产| 激情综合色综合久久综合| 久久人人97超碰人人澡爱香蕉| 成年视频在线观看| 欧美日韩三级一区二区| 香蕉网在线播放| 亚洲国产免费| 99在线影院| xvideos国产在线视频| 欧美伊人久久大香线蕉综合69| 欧美深性狂猛ⅹxxx深喉| 欧美特黄一级| 91视频网页| 黄色在线免费网站| 7777精品伊人久久久大香线蕉经典版下载 | 久久久久久久网| 欧美色图色综合| 欧美人体视频| 7m第一福利500精品视频| 丰满人妻一区二区三区免费视频| 亚洲日本成人在线观看| 182午夜视频| 日韩激情图片| 国产在线精品播放| 色欧美激情视频在线| 欧美三级电影网| 亚洲毛片亚洲毛片亚洲毛片| 三级一区在线视频先锋| 日本最新一区二区三区视频观看| 日韩欧美一区二区三区免费观看| 亚洲人午夜精品| 国产成人自拍偷拍| 中文av字幕一区| 中文字幕中文在线| 欧美福利电影在线观看| 成人自拍爱视频| 国产欧洲在线| 亚洲色图欧美制服丝袜另类第一页| 老熟妇仑乱一区二区av| 国产欧美精品一区二区色综合| www.欧美日本| 99久久夜色精品国产亚洲狼| 91亚洲va在线va天堂va国 | 日韩av在线播放网址| 国产精品中文久久久久久久| 麻豆网在线观看| 欧美mv日韩mv国产网站| 成年免费在线观看| 国产亚洲福利社区一区| 第四色婷婷基地| 综合久久婷婷| 久久国产精品亚洲va麻豆| 欧美第一视频| 久久精品夜夜夜夜夜久久| www.蜜臀av| 欧美性猛交xxxx偷拍洗澡| 调教驯服丰满美艳麻麻在线视频| 久久成人18免费观看| 青青青在线观看视频| 婷婷激情久久| 国产啪精品视频网站| 日本三级韩国三级欧美三级| 国产视频在线观看一区二区| 夜夜骚av一区二区三区| 亚洲综合视频在线观看| 97超碰在线资源| 国产麻豆视频精品| 99热成人精品热久久66| 国产精品传媒精东影业在线 | 成人av毛片在线观看| 狠狠综合久久| 台湾成人av| 国产日韩三级| 国产九九精品视频| 国产中文在线播放| 久久精品国产91精品亚洲| 色噜噜一区二区三区| 欧美精品一二三四| 毛片视频网站在线观看| 亚洲欧洲综合另类| 精品成人无码一区二区三区| 高清国产一区二区| 久久久久久蜜桃一区二区| 99国产精品| 黄色网络在线观看| 欧美色蜜桃97| 久久免费一区| 国产亚洲成av人片在线观黄桃| 国产精品户外野外| 涩涩视频在线| 欧美激情国产精品| 日本高清视频在线观看| 亚洲全黄一级网站| 少妇一区二区三区四区| 91精品国产91热久久久做人人| 无码人妻久久一区二区三区不卡| 一个色在线综合| 欧美性x x x| 中文字幕av资源一区| 久久精品一区二区免费播放| 丁香婷婷深情五月亚洲| 激情图片中文字幕| 毛片av一区二区| 狠狠热免费视频| 欧美亚洲一级| 免费在线观看亚洲视频| 激情视频一区| 香港三级日本三级a视频| 欧美激情欧美| 亚洲精品一区二区三| 国产成人ay| 欧美中文娱乐网| 亚洲区小说区图片区qvod| 精品产品国产在线不卡| 懂色av一区二区| 国产 高清 精品 在线 a| 一区二区三区高清在线观看| 成人美女免费网站视频| 日本午夜精品久久久久| 国产一区深夜福利| 四虎影视国产精品| 亚洲精品欧美极品| 在这里有精品| 国产偷久久久精品专区| 国产一区调教| 好看的日韩精品| 天美av一区二区三区久久| 国产在线精品一区二区中文 | 国产极品在线播放| 亚洲mv大片欧洲mv大片精品| 亚洲综合一二三| 日韩欧美在线免费| 亚洲 小说区 图片区| 欧美日韩一本到| 国产精品热久久| 欧美大胆一级视频| 夜夜嗨aⅴ一区二区三区| 久久久综合网站| 久久精品成人av| 国产日韩精品一区| 国产无遮挡在线观看| 狠狠色狠狠色综合日日tαg | 天天天综合网| 青青草综合在线| 国产亚洲一区在线| 成人性生生活性生交12| 精品一区中文字幕| 色悠悠在线视频| 久久久久9999亚洲精品| 天海翼在线视频| 亚洲国产精品久久人人爱蜜臀| 六月丁香激情综合| 欧美日本韩国一区二区三区视频| 国产xxxx在线观看| 精品亚洲精品福利线在观看| 岛国最新视频免费在线观看| 美女撒尿一区二区三区| 美女露胸视频在线观看| 国产精品丝袜一区二区三区| 亚洲啊v在线免费视频| 欧美12av| 欧美一区二区三区久久精品| 国产免费黄色av| 久久精品二区亚洲w码| 岛国精品一区二区三区| 久久久国际精品| 青花影视在线观看免费高清| 大桥未久av一区二区三区| 一级片视频网站| 亚洲精品成人久久久| 欧美日韩xx| 欧美中在线观看| 欧美2区3区4区| 日本一区二区三区四区高清视频| 亚洲欧美亚洲| wwww.国产| 99久久精品久久久久久清纯| 亚洲一级理论片| 欧美日韩中文字幕综合视频| 99草在线视频| 亚洲性视频网址| 999福利在线视频| 成人网页在线免费观看| 久久综合色占| 免费毛片网站在线观看| 精品一二三四区| 91成人在线免费视频| 亚洲va天堂va国产va久| 91在线公开视频| 伊人青青综合网站| 男人av在线播放| 99精品99久久久久久宅男| 色喇叭免费久久综合| 成人三级视频在线播放| av成人老司机| 欧美交换国产一区内射| 欧美精品第1页| 番号集在线观看| 欧美在线欧美在线| 荡女精品导航| 免费日韩在线观看| 国内一区二区在线| www.4hu95.com四虎| 日本韩国欧美在线| 欧美孕妇性xxxⅹ精品hd| 国内精品一区二区三区四区| 亚洲不卡在线| 青青视频免费在线观看| 国内精品国产三级国产a久久| 天天操天天舔天天射| 色嗨嗨av一区二区三区| 日本精品专区| 欧洲美女7788成人免费视频| 国产精东传媒成人av电影| 免费网站在线观看视频| 国产成人午夜高潮毛片| 国产黄色片在线免费观看| 欧美一区永久视频免费观看| 超碰在线免费公开| 亚洲一区二区三区乱码aⅴ蜜桃女| 色综合天天爱| 手机av在线免费| 最新成人av在线| 999国产精品视频免费| 美女999久久久精品视频| 一区二区三区四区高清视频| 久久人妻无码一区二区| 国产999精品久久久久久绿帽| 国产三级国产精品国产国在线观看| 69久久夜色精品国产69蝌蚪网| 成人短视频在线观看| 91精品国产高清久久久久久91裸体| 久久久久免费av| 久久黄色一级视频| 亚洲高清免费观看| 爽爽视频在线观看| 日本欧美一二三区| 成人三级视频| 亚洲一区二区三区四区精品| 亚洲精品免费在线播放| 亚洲精品久久久久久久久久| 午夜精品久久久久久久白皮肤| 校花撩起jk露出白色内裤国产精品| 国产免费观看高清视频| 久久蜜桃av一区精品变态类天堂 | 日韩黄色一级片| 成年人视频软件| 欧美刺激午夜性久久久久久久| caoporn视频在线观看| 欧美精品一区二区三区四区五区| 老司机免费视频久久| 国产又黄又粗又猛又爽的| 欧美一级免费大片| 忘忧草在线影院两性视频| 视频一区三区| 国产iv一区二区三区| av资源免费观看| 色狠狠久久aa北条麻妃 | 欧美三级电影在线播放| 久久精品国产精品亚洲精品| 精品无码黑人又粗又大又长| 亚洲欧美一区二区三区四区| 亚洲图片小说区| 玩弄中年熟妇正在播放| 国产精品久久久久久久久免费相片 | 精品国产精品国产精品| 日韩av一卡二卡| 国产精品麻豆| 国产成人av影视| 夜夜亚洲天天久久| 婷婷五月在线视频| 久久国产精品-国产精品| 国产在线国偷精品产拍免费yy| 国产精品21p|