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

緩存穿透、擊穿、雪崩:從理論到 Spring Boot 實踐

存儲 存儲架構
在高并發系統中,緩存是提升性能的關鍵組件,但同時也面臨著三大經典難題:緩存穿透、緩存擊穿和緩存雪崩。這些問題如果處理不當,可能導致數據庫壓力驟增,甚至引發系統雪崩。

前言

在高并發系統中,緩存是提升性能的關鍵組件,但同時也面臨著三大經典難題:緩存穿透緩存擊穿緩存雪崩。這些問題如果處理不當,可能導致數據庫壓力驟增,甚至引發系統雪崩。

緩存穿透

定義:指查詢一個根本不存在的數據,由于緩存中沒有對應key,所有請求都會穿透到數據庫。

成因

  • 惡意攻擊:故意請求不存在的key,如用戶ID為負數的查詢
  • 業務邏輯缺陷:誤查不存在的數據
  • 數據已刪除但緩存未清理

危害

  • 數據庫壓力劇增,可能導致數據庫宕機
  • 系統響應時間變長,影響用戶體驗
  • 浪費服務器資源

緩存擊穿

定義:一個熱點key在緩存中過期的瞬間,有大量并發請求訪問該key,導致所有請求都落到數據庫。

成因

  • 熱點數據緩存過期
  • 高并發場景下缺乏有效的并發控制

危害

  • 數據庫瞬間承受巨大壓力
  • 可能導致熱點數據對應的服務不可用
  • 影響關聯業務的正常運行

緩存雪崩

定義:在某一時間段,緩存中大量key集中過期或緩存服務宕機,導致所有請求全部落到數據庫。

成因

  • 大量key設置了相同的過期時間
  • 緩存服務(如Redis)集群故障
  • 緩存更新機制設計不合理

危害

  • 數據庫被壓垮,整個系統崩潰
  • 服務可用性急劇下降
  • 可能引發連鎖反應,影響關聯系統

解決方案

Redis 配置類:

@Configuration
public class RedisConfig {

    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
        RedisTemplate<String, Object> template = new RedisTemplate<>();
        template.setConnectionFactory(factory);
        
        // String類型key序列化
        StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
        // 對象序列化
        GenericJackson2JsonRedisSerializer jackson2JsonRedisSerializer = new GenericJackson2JsonRedisSerializer();
        
        template.setKeySerializer(stringRedisSerializer);
        template.setValueSerializer(jackson2JsonRedisSerializer);
        template.setHashKeySerializer(stringRedisSerializer);
        template.setHashValueSerializer(jackson2JsonRedisSerializer);
        
        template.afterPropertiesSet();
        return template;
    }
    
    @Bean
    public RedisCacheManager cacheManager(RedisConnectionFactory factory) {
        // 默認配置
        RedisCacheConfiguration defaultConfig = RedisCacheConfiguration.defaultCacheConfig()
                .entryTtl(Duration.ofMinutes(30)) // 默認過期時間30分鐘
                .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer()))
                .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer()))
                .disableCachingNullValues(); // 默認不緩存null值
        
        // 針對不同緩存名稱設置不同的過期時間
        Map<String, RedisCacheConfiguration> configMap = new HashMap<>();
        configMap.put("userCache", defaultConfig.entryTtl(Duration.ofHours(1)));
        configMap.put("productCache", defaultConfig.entryTtl(Duration.ofMinutes(10)));
        
        return RedisCacheManager.builder(factory)
                .cacheDefaults(defaultConfig)
                .withInitialCacheConfigurations(configMap)
                .build();
    }
}

緩存穿透

方案一:緩存空值

當查詢結果為null時,也將其緩存起來,設置較短的過期時間,防止同一key頻繁穿透到數據庫。

@Service
@RequiredArgsConstructor
public class UserService {

    private final UserMapper userMapper;
    private final RedisTemplate<String, Object> redisTemplate;
    
    // 緩存空值的過期時間設置短一些,如5分鐘
    private static final long NULL_VALUE_TTL = 5;
    
    public User getUserById(Long id) {
        // 1. 先查詢緩存
        String key = "user:" + id;
        User user = (User) redisTemplate.opsForValue().get(key);
        
        // 2. 緩存存在,直接返回
        if (user != null) {
            // 如果是緩存的空對象,返回null
            if (user.getId() == -1L) {
                return null;
            }
            return user;
        }
        
        // 3. 緩存不存在,查詢數據庫
        user = userMapper.selectById(id);
        
        // 4. 數據庫不存在,緩存空對象
        if (user == null) {
            // 使用一個特殊標識表示空值,避免緩存穿透
            user = new User();
            user.setId(-1L); // 特殊標識
            redisTemplate.opsForValue().set(key, user, NULL_VALUE_TTL, TimeUnit.MINUTES);
            return null;
        }
        
        // 5. 數據庫存在,緩存數據
        redisTemplate.opsForValue().set(key, user, 30, TimeUnit.MINUTES);
        return user;
    }
}
方案二:布隆過濾器

布隆過濾器是一種空間效率極高的概率型數據結構,用于判斷一個元素是否在集合中。可以在請求到達緩存層之前,先通過布隆過濾器判斷key是否存在,過濾掉一定不存在的請求。

@Configuration
public class BloomFilterConfig {

    // 預計數據量
    private static final int EXPECTED_INSERTIONS = 1000000;
    // 誤判率,越小需要的空間越大
    private static final double FALSE_POSITIVE_RATE = 0.01;

    @Bean
    public BloomFilter<String> userBloomFilter() {
        // 創建布隆過濾器
        BloomFilter<String> bloomFilter = BloomFilter.create(
                Funnels.stringFunnel(StandardCharsets.UTF_8),
                EXPECTED_INSERTIONS,
                FALSE_POSITIVE_RATE
        );
        
        // 初始化:將已存在的用戶ID添加到布隆過濾器
        // 實際項目中可以從數據庫加載
        // userMapper.findAllIds().forEach(id -> bloomFilter.put("user:" + id));
        
        return bloomFilter;
    }
}
@Service
@RequiredArgsConstructor
public class BloomFilterUserService {

    private final UserMapper userMapper;
    private final RedisTemplate<String, Object> redisTemplate;
    private final BloomFilter<String> userBloomFilter;
    
    public User getUserById(Long id) {
        String key = "user:" + id;
        
        // 1. 先通過布隆過濾器判斷ID是否可能存在
        if (!userBloomFilter.mightContain(key)) {
            // 布隆過濾器判斷不存在,直接返回null
            return null;
        }
        
        // 2. 布隆過濾器判斷可能存在,查詢緩存
        User user = (User) redisTemplate.opsForValue().get(key);
        if (user != null) {
            return user;
        }
        
        // 3. 緩存不存在,查詢數據庫
        user = userMapper.selectById(id);
        if (user == null) {
            return null;
        }
        
        // 4. 緩存數據
        redisTemplate.opsForValue().set(key, user, 30, TimeUnit.MINUTES);
        return user;
    }
}

緩存擊穿

方案一:互斥鎖

當緩存失效時,不是立即去查詢數據庫,而是先嘗試獲取鎖,只有獲取到鎖的線程才去查詢數據庫,其他線程則等待重試。

@Service
@RequiredArgsConstructor
public class ProductService {

    private final ProductMapper productMapper;
    private final RedisTemplate<String, Object> redisTemplate;
    
    // 鎖的過期時間,防止死鎖
    private static final long LOCK_TTL = 5;
    // 緩存過期時間
    private static final long CACHE_TTL = 30;
    
    public Product getProductById(Long id) {
        String key = "product:" + id;
        
        // 1. 先查詢緩存
        Product product = (Product) redisTemplate.opsForValue().get(key);
        if (product != null) {
            return product;
        }
        
        // 2. 緩存不存在,嘗試獲取鎖
        String lockKey = "lock:product:" + id;
        try {
            // 嘗試獲取鎖,setIfAbsent等價于Redis的SETNX命令
            Boolean locked = redisTemplate.opsForValue().setIfAbsent(lockKey, "1", LOCK_TTL, TimeUnit.SECONDS);
            
            if (Boolean.TRUE.equals(locked)) {
                // 3. 獲取到鎖,查詢數據庫
                product = productMapper.selectById(id);
                if (product != null) {
                    // 4. 緩存數據
                    redisTemplate.opsForValue().set(key, product, CACHE_TTL, TimeUnit.MINUTES);
                }
                return product;
            } else {
                // 5. 未獲取到鎖,等待一段時間后重試
                TimeUnit.MILLISECONDS.sleep(50);
                return getProductById(id); // 遞歸重試
            }
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
            return null;
        } finally {
            // 6. 釋放鎖
            if (Boolean.TRUE.equals(redisTemplate.hasKey(lockKey))) {
                redisTemplate.delete(lockKey);
            }
        }
    }
}
方案二:熱點數據永不過期

對于特別熱點的數據,可以設置為永不過期,通過后臺線程定期更新緩存數據,避免緩存過期導致的擊穿問題。

@Service
@RequiredArgsConstructor
public class HotProductService {

    private final ProductMapper productMapper;
    private final RedisTemplate<String, Object> redisTemplate;
    
    // 熱點商品ID列表
    private static final List<Long> HOT_PRODUCT_IDS = List.of(1001L, 1002L, 1003L);
    
    // 1. 查詢熱點商品,緩存永不過期
    public Product getHotProductById(Long id) {
        // 檢查是否為熱點商品
        if (!HOT_PRODUCT_IDS.contains(id)) {
            throw new IllegalArgumentException("不是熱點商品");
        }
        
        String key = "hot_product:" + id;
        
        // 先查詢緩存
        Product product = (Product) redisTemplate.opsForValue().get(key);
        if (product != null) {
            return product;
        }
        
        // 緩存不存在,查詢數據庫并緩存(永不過期)
        product = productMapper.selectById(id);
        if (product != null) {
            // 設置為永不過期(實際可以設置一個很大的過期時間)
            redisTemplate.opsForValue().set(key, product);
        }
        return product;
    }
    
    // 2. 定時任務更新熱點商品緩存,每10分鐘執行一次
    @Scheduled(fixedRate = 10 * 60 * 1000)
    public void refreshHotProductCache() {
        for (Long productId : HOT_PRODUCT_IDS) {
            Product product = productMapper.selectById(productId);
            if (product != null) {
                String key = "hot_product:" + productId;
                redisTemplate.opsForValue().set(key, product);
            }
        }
    }
}

緩存雪崩

方案一:過期時間隨機化

為不同的key設置隨機的過期時間,避免大量key在同一時間點過期。

@Service
@RequiredArgsConstructor
public class OrderService {

    private final OrderMapper orderMapper;
    private final RedisTemplate<String, Object> redisTemplate;
    
    // 基礎過期時間:30分鐘
    private static final long BASE_TTL = 30;
    // 隨機過期時間范圍:0-10分鐘
    private static final int RANDOM_TTL_RANGE = 10;
    
    private final Random random = new Random();
    
    public Order getOrderById(Long id) {
        String key = "order:" + id;
        
        // 1. 查詢緩存
        Order order = (Order) redisTemplate.opsForValue().get(key);
        if (order != null) {
            return order;
        }
        
        // 2. 緩存不存在,查詢數據庫
        order = orderMapper.selectById(id);
        if (order == null) {
            return null;
        }
        
        // 3. 計算隨機過期時間,避免大量key同時過期
        long randomTTL = random.nextInt(RANDOM_TTL_RANGE);
        long ttl = BASE_TTL + randomTTL;
        
        // 4. 緩存數據
        redisTemplate.opsForValue().set(key, order, ttl, TimeUnit.MINUTES);
        return order;
    }
}
方案二:多級緩存

使用本地緩存(如Caffeine)+ 分布式緩存(如Redis)的多級緩存架構,即使分布式緩存失效,本地緩存也能提供一定的緩沖。

@Configuration
public class MultiLevelCacheConfig {

    // 1. 本地緩存配置(Caffeine)
    @Bean
    public CacheManager caffeineCacheManager() {
        CaffeineCacheManager cacheManager = new CaffeineCacheManager();
        // 設置緩存過期時間:5分鐘
        cacheManager.setCaffeine(Caffeine.newBuilder()
                .expireAfterWrite(5, TimeUnit.MINUTES)
                .maximumSize(10000)); // 最大緩存數量
        return cacheManager;
    }
    
    // 2. 分布式緩存配置(Redis)已在前面的RedisConfig中定義
    
    // 3. 自定義多級緩存管理器(組合本地緩存和Redis緩存)
    @Bean
    @Primary
    public CacheManager multiLevelCacheManager(CacheManager caffeineCacheManager, CacheManager redisCacheManager) {
        return new MultiLevelCacheManager(caffeineCacheManager, redisCacheManager);
    }
}
public class MultiLevelCacheManager implements CacheManager {

    private final CacheManager localCacheManager;
    private final CacheManager redisCacheManager;
    
    public MultiLevelCacheManager(CacheManager localCacheManager, CacheManager redisCacheManager) {
        this.localCacheManager = localCacheManager;
        this.redisCacheManager = redisCacheManager;
    }
    
    @Override
    @NonNull
    public Cache getCache(String name) {
        // 返回組合了本地緩存和Redis緩存的Cache實現
        return new MultiLevelCache(
                localCacheManager.getCache(name),
                redisCacheManager.getCache(name)
        );
    }
    
    @Override
    @NonNull
    public Iterable<String> getCacheNames() {
        return redisCacheManager.getCacheNames();
    }
}
public class MultiLevelCache implements Cache {

    private final Cache localCache;
    private final Cache redisCache;
    
    public MultiLevelCache(Cache localCache, Cache redisCache) {
        this.localCache = localCache;
        this.redisCache = redisCache;
    }
    
    @Override
    public String getName() {
        return redisCache.getName();
    }
    
    @Override
    public Object getNativeCache() {
        return this;
    }
    
    @Override
    @Nullable
    public ValueWrapper get(Object key) {
        // 1. 先查詢本地緩存
        ValueWrapper localValue = localCache.get(key);
        if (localValue != null) {
            return localValue;
        }
        
        // 2. 本地緩存沒有,查詢Redis緩存
        ValueWrapper redisValue = redisCache.get(key);
        if (redisValue != null) {
            // 3. 將Redis緩存的值同步到本地緩存
            localCache.put(key, redisValue.get());
        }
        
        return redisValue;
    }
    
    @Override
    @Nullable
    @SuppressWarnings("unchecked")
    public <T> T get(Object key, @Nullable Class<T> type) {
        // 1. 先查詢本地緩存
        T localValue = localCache.get(key, type);
        if (localValue != null) {
            return localValue;
        }
        
        // 2. 本地緩存沒有,查詢Redis緩存
        T redisValue = redisCache.get(key, type);
        if (redisValue != null) {
            // 3. 將Redis緩存的值同步到本地緩存
            localCache.put(key, redisValue);
        }
        
        return redisValue;
    }
    
    @Override
    @Nullable
    public <T> T get(Object key, Callable<T> valueLoader) {
        // 1. 先查詢本地緩存
        try {
            T localValue = localCache.get(key, valueLoader);
            return localValue;
        } catch (Exception e) {
            // 本地緩存沒有,繼續查詢Redis
        }
        
        // 2. 查詢Redis緩存
        T redisValue = redisCache.get(key, valueLoader);
        // 3. 同步到本地緩存
        localCache.put(key, redisValue);
        
        return redisValue;
    }
    
    @Override
    public void put(Object key, @Nullable Object value) {
        // 同時更新本地緩存和Redis緩存
        localCache.put(key, value);
        redisCache.put(key, value);
    }
    
    @Override
    @Nullable
    public ValueWrapper putIfAbsent(Object key, @Nullable Object value) {
        // 同時更新本地緩存和Redis緩存
        localCache.putIfAbsent(key, value);
        return redisCache.putIfAbsent(key, value);
    }
    
    @Override
    public void evict(Object key) {
        // 同時刪除本地緩存和Redis緩存
        localCache.evict(key);
        redisCache.evict(key);
    }
    
    @Override
    public void clear() {
        // 同時清空本地緩存和Redis緩存
        localCache.clear();
        redisCache.clear();
    }
}
方案三:緩存降級與熔斷

當緩存服務出現異常時,通過降級策略返回默認數據或提示信息,避免請求全部落到數據庫。可以使用SentinelHystrix實現熔斷降級。

@Service
@RequiredArgsConstructor
public class DegradedProductService {

    private final ProductMapper productMapper;
    private final RedisTemplate<String, Object> redisTemplate;
    
    // 使用Sentinel注解實現熔斷降級
    @SentinelResource(
        value = "getProductById",
        blockHandler = "handleGetProductBlocked", // 限流/熔斷時的處理方法
        fallback = "handleGetProductFallback" // 拋出異常時的處理方法
    )
    public Product getProductById(Long id) {
        String key = "product:" + id;
        
        // 1. 查詢緩存
        Product product = (Product) redisTemplate.opsForValue().get(key);
        if (product != null) {
            return product;
        }
        
        // 2. 緩存不存在,查詢數據庫
        product = productMapper.selectById(id);
        if (product != null) {
            // 3. 緩存數據,設置隨機過期時間
            long ttl = 30 + (long) (Math.random() * 10);
            redisTemplate.opsForValue().set(key, product, ttl, TimeUnit.MINUTES);
        }
        return product;
    }
    
    // 限流/熔斷時的降級處理
    public Product handleGetProductBlocked(Long id, BlockException e) {
        // 可以返回緩存的舊數據、默認數據或提示信息
        Product defaultProduct = new Product();
        defaultProduct.setId(id);
        defaultProduct.setName("服務繁忙,請稍后再試");
        return defaultProduct;
    }
    
    // 異常時的降級處理
    public Product handleGetProductFallback(Long id, Throwable e) {
        // 可以嘗試從本地緩存獲取,或返回兜底數據
        return getLocalCacheProduct(id);
    }
    
    // 本地緩存作為最后的兜底
    private Product getLocalCacheProduct(Long id) {
        // 實際項目中可以使用Caffeine等本地緩存
        return null;
    }
}

總結

圖片

最佳實踐

  • 分層防御:結合多種方案解決同一問題,如同時使用布隆過濾器和緩存空值防止穿透
  • 監控告警:實時監控緩存命中率、數據庫壓力等指標,及時發現問題
  • 限流保護:對接口進行限流,防止惡意攻擊和流量突增
  • 灰度發布:緩存策略變更時采用灰度發布,避免大規模影響
  • 災備演練:定期進行緩存失效演練,檢驗系統的容錯能力
責任編輯:武曉燕 來源: 一安未來
相關推薦

2019-11-05 14:24:31

緩存雪崩框架

2020-03-16 14:57:24

Redis面試雪崩

2019-10-12 14:19:05

Redis數據庫緩存

2023-03-10 13:33:00

緩存穿透緩存擊穿緩存雪崩

2022-11-18 14:34:28

2021-06-05 09:01:01

Redis緩存雪崩緩存穿透

2022-03-08 00:07:51

緩存雪崩數據庫

2022-05-27 07:57:20

緩存穿透緩存雪崩緩存擊穿

2020-10-23 10:46:03

緩存雪崩擊穿

2025-06-30 01:55:00

2023-11-10 14:58:03

2024-04-07 00:00:02

Redis雪崩緩存

2024-04-18 11:43:28

緩存數據庫Redis

2024-03-12 10:44:42

2023-04-14 07:34:19

2021-12-25 22:28:27

緩存穿透緩存擊穿緩存雪崩

2020-10-13 07:44:40

緩存雪崩 穿透

2023-12-06 13:38:00

Redis緩存穿透緩存擊穿

2020-12-28 12:37:36

緩存擊穿穿透

2020-03-05 09:09:18

緩存原因方案
點贊
收藏

51CTO技術棧公眾號

波多野结衣久久| 囯产精品一品二区三区| 99精品美女| 日韩视频在线一区二区| 日本中文字幕网址| 国产二区在线播放| 国产精品主播直播| 欧美在线一区二区视频| 国产高清视频免费在线观看| 伦理一区二区| 欧美精品日韩综合在线| 免费成人在线视频网站| 欧美成人性生活视频| 99久久99久久免费精品蜜臀| 国产精品三级在线| 国产主播在线播放| 国产精品99一区二区三| 精品亚洲夜色av98在线观看| 国内精品国产三级国产aⅴ久| 一个人看的www视频在线免费观看 一个人www视频在线免费观看 | 天天操天天干天天舔| 久久精品久久久精品美女| 2023亚洲男人天堂| 青青草成人免费| 成人在线一区| 亚洲午夜久久久久久久| www.啪啪.com| 免费看日产一区二区三区 | 97国产在线视频| 欧洲美女女同性互添| 精品国产精品久久一区免费式 | 搞黄视频在线观看| 不卡视频在线观看| 91中文字精品一区二区| 一级片在线免费观看视频| 模特精品在线| 97av在线影院| 国产福利拍拍拍| 亚洲午夜精品久久久久久app| 按摩亚洲人久久| 超薄肉色丝袜一二三| 啄木系列成人av电影| 日韩av一区在线| aaa黄色大片| 亚洲乱码一区| 精品国产乱码久久久久久浪潮| 日本美女久久久| 欧洲午夜精品| 6080yy午夜一二三区久久| 成人免费在线观看视频网站| 国模视频一区| 欧美性大战久久久久久久蜜臀| aaa毛片在线观看| 东京一区二区| 一本色道综合亚洲| 亚洲中文字幕久久精品无码喷水| 欧美gv在线观看| 色综合色狠狠天天综合色| 精品久久久久久久久久中文字幕| 91超碰在线| 红桃视频成人在线观看| a√天堂在线观看| 亚洲女色av| 日本精品一级二级| 天天干天天操天天玩| 国产成人精品一区二区三区视频| 欧美日韩亚州综合| 九九久久久久久| 日韩三级精品| 精品亚洲一区二区三区在线观看| 久久国产精品影院| jizzjizz欧美69巨大| 丝袜亚洲另类欧美重口| 国产黄色小视频网站| 欧美日韩国产欧| 97精品久久久中文字幕免费| 少妇太紧太爽又黄又硬又爽| 日本在线播放一区二区三区| 91久久久久久久久久久| 丰满人妻妇伦又伦精品国产| 91碰在线视频| 亚洲成人第一| 污污影院在线观看| 一本色道久久综合亚洲精品按摩| 亚洲这里只有精品| 香港久久久电影| 亚洲欧美变态国产另类| a一级免费视频| 亚洲美女一区| 国产精品视频999| 亚洲国产精品久久久久久久| 久久久综合网站| 欧美与动交zoz0z| 日韩理论视频| 欧美另类久久久品| 男男做爰猛烈叫床爽爽小说| 精品一区av| 欧美黄色性视频| 国产亚洲久一区二区| 国产成人午夜片在线观看高清观看| 久久久久久99| 羞羞的视频在线看| 欧美三级在线视频| 日韩av无码一区二区三区不卡| 欧美日韩在线播放视频| 国模吧一区二区| 91国内精品视频| 91丝袜美腿高跟国产极品老师 | 蜜臀av亚洲一区中文字幕| 成人蜜桃视频| 米奇777四色精品人人爽| 日韩欧美国产免费播放| 少妇欧美激情一区二区三区| 北条麻妃国产九九九精品小说| 韩国美女主播一区| 国产福利免费视频| 国产精品色在线观看| 九九九九免费视频| 亚洲专区**| 久久这里只有精品99| 在线免费观看av网址| 99久久久精品| 国产一级做a爰片久久毛片男| 久久亚洲国产精品尤物| 亚洲精品视频在线播放| 国产无码精品在线播放| 国产精品影视在线观看| 亚洲草草视频| 99久久伊人| 亚洲乱码国产乱码精品精| 国产精品suv一区二区69| 国产精品乡下勾搭老头1| 亚洲一区二区不卡视频| 日本美女久久| 国产一区二区久久精品| 男人的天堂av网站| 久久综合久久综合亚洲| 丰满的少妇愉情hd高清果冻传媒| 欧美久久久网站| 综合欧美国产视频二区| 波多野结衣小视频| 国产午夜久久久久| 无码人妻丰满熟妇区毛片| 欧美日韩直播| 青青久久av北条麻妃黑人| 完全免费av在线播放| 国产成人精品免费网站| 久久香蕉视频网站| 亚洲一区 二区| 欧美精品videos另类日本| 国产高潮在线观看| 亚洲黄色免费网站| 久久久久无码国产精品一区李宗瑞 | 国产69精品久久久久777| 国产911在线观看| 天堂精品久久久久| 久久男人的天堂| 香蕉人妻av久久久久天天| 欧美日韩亚洲一区二区三区| 手机av免费看| 奇米影视一区二区三区小说| 26uuu成人| aaa国产精品| 97香蕉超级碰碰久久免费的优势| 五月婷婷六月丁香综合| 色乱码一区二区三区88| 黄大色黄女片18免费| 精油按摩中文字幕久久| 日韩欧美猛交xxxxx无码| 精品国产乱子伦一区二区| 青青草99啪国产免费| 91九色在线porn| 日韩免费福利电影在线观看| 久久精品这里有| 久久免费国产精品| 在线免费观看视频黄| 91av精品| 久久草.com| 只有精品亚洲| 久久久噜噜噜久噜久久| 国产裸舞福利在线视频合集| 91麻豆精品国产91久久久久久| 精品在线免费观看视频| 国产三级精品三级在线专区| 国产又粗又长又爽又黄的视频| 黄色成人av网站| 日韩久久久久久久久久久久久| 日韩黄色在线| 国产91精品视频在线观看| 91露出在线| 亚洲国产精品久久久久久| 区一区二在线观看| 亚洲乱码日产精品bd| 国产ts丝袜人妖系列视频 | 国内精品久久久久久久影视麻豆| 狼狼综合久久久久综合网| 亚洲国产91视频| 77777少妇光屁股久久一区| 97在线观看免费观看高清| 亚洲爱爱爱爱爱| 亚洲中文字幕一区二区| 黑人精品xxx一区| 日韩欧美123区| 国产亚洲欧美日韩俺去了| 国产裸体视频网站| 久久成人免费网站| 国产裸体舞一区二区三区| 欧美在线看片| 午夜久久资源| 丝袜美腿一区二区三区动态图| 成人免费午夜电影| 怡红院成人在线| 久久久午夜视频| 精品国产丝袜高跟鞋| 亚洲精品一区二区网址| 亚洲xxx在线| 在线播放91灌醉迷j高跟美女| 国产精品免费精品一区| 亚洲国产欧美日韩另类综合| 中文字幕求饶的少妇| 国产亚洲精品7777| 免费日本黄色网址| 国产成人丝袜美腿| 中文字幕第66页| 久久精品理论片| 少妇激情一区二区三区| 亚洲欧美成人| 阿v天堂2017| 欧美三区视频| 亚洲天堂第一区| 亚洲精品一区二区在线看| 性欧美.com| 欧美综合视频| 亚洲乱码一区二区三区| 国产最新精品| 日韩欧美电影一区二区| 国产精品一区二区99| 欧美在线3区| 青青视频免费在线| 日韩人妻无码一区二区三区| 日本无删减在线| 大桥未久av一区二区三区| 久久久久久国产精品视频| 最新国产精品久久精品| 9.1片黄在线观看| 国产日韩精品一区二区浪潮av | 波多野结衣视频免费观看| 欧美午夜激情视频| 欧美一级特黄视频| 色婷婷亚洲综合| 中文字幕手机在线视频| 欧美影院午夜播放| 亚洲精品91天天久久人人| 欧美在线高清视频| 91麻豆成人精品国产| 666欧美在线视频| 精品人妻一区二区三区四区不卡| 91精品久久久久久久91蜜桃| 99热在线只有精品| 精品乱人伦小说| 天堂网av在线播放| 亚洲欧洲午夜一线一品| 三级外国片在线观看视频| 麻豆成人在线看| 草美女在线观看| 日韩av三级在线观看| 亚洲成人va| 成人亚洲激情网| 哺乳一区二区三区中文视频| 精品乱子伦一区二区三区| 国产成人精品免费视| 手机福利在线视频| 亚洲私拍自拍| 久久精品午夜福利| 老司机免费视频一区二区 | 操欧美女人视频| 精品久久精品久久| 久久视频精品| 17c丨国产丨精品视频| 乱码第一页成人| 99re精彩视频| 成人av免费在线观看| 亚洲精品国产一区黑色丝袜 | 九九热在线视频播放| 欧美亚洲综合在线| 精品区在线观看| 亚洲男人的天堂在线| 九义人在线观看完整免费版电视剧| 色综合五月天导航| 久久青青视频| 99精彩视频| 日韩精品午夜| 欧美一级欧美一级| 美国三级日本三级久久99| 成人在线观看一区二区| 国产三级一区二区三区| 久久综合久久鬼| 欧美日韩一区二区三区不卡| 后进极品白嫩翘臀在线视频| 色婷婷av一区二区三区久久| free性护士videos欧美| 成人激情春色网| 网友自拍一区| 亚洲国产一二三精品无码| 老**午夜毛片一区二区三区| 亚洲精品久久久久久| 中文子幕无线码一区tr| 精品欧美一区二区三区免费观看 | 日韩高清在线一区二区| 国产亚洲自拍一区| 日本一级淫片色费放| 91精品国产色综合久久ai换脸 | 91精品天堂福利在线观看| 国产又大又硬又粗| 成人涩涩免费视频| 精品国产欧美日韩不卡在线观看| 日本久久一区二区三区| 亚洲aⅴ在线观看| 欧美精品久久一区二区| 99精品美女视频在线观看热舞| 欧美日韩一区二区三区在线视频| 在线日韩电影| 亚洲熟妇一区二区| 亚洲欧洲制服丝袜| 中文在线a天堂| 亚洲人av在线影院| 天堂在线中文网官网| 国产三区精品| 欧美视频在线观看| 97超碰免费在线观看| 国产精品初高中害羞小美女文| 欧美一级淫片免费视频黄| 亚洲国产精品女人久久久| 波多野结衣中文字幕久久| av成人在线电影| 午夜日韩福利| 中文字幕1区2区| 一二三四社区欧美黄| 精品人妻少妇嫩草av无码专区| www国产精品视频| 青青在线精品| 伊人久久av导航| 韩国av一区二区三区| 国产一二三区精品| 日韩欧美你懂的| 大香伊人久久| 久久亚洲综合网| 久久99伊人| 国产精品酒店视频| 欧美精品18+| caoporn97在线视频| 97久久精品午夜一区二区| 欧美激情自拍| 大尺度做爰床戏呻吟舒畅| 婷婷夜色潮精品综合在线| 天堂91在线| 国产精品福利在线观看| 色婷婷色综合| 1314成人网| 五月综合激情网| 国产日韩精品在线看| 国产女人18毛片水18精品| 亚洲一区二区三区| 无码人妻一区二区三区在线| 欧美日韩激情美女| 自拍视频在线网| 高清国产一区| 亚洲欧美日韩一区在线观看| 色一情一交一乱一区二区三区| 欧美日本不卡视频| 青草视频在线免费直播| 国产在线视频欧美一区二区三区| 久久精选视频| 精品无码一区二区三区蜜臀| 精品国产亚洲一区二区三区在线观看| 国产社区精品视频| 天堂精品一区二区三区| 国产精品亚洲一区二区三区妖精| 国产精品99无码一区二区| 一区二区成人精品| 网站一区二区| www.亚洲天堂网| 亚洲欧美另类综合偷拍| 天堂在线中文资源| 91久久精品国产91性色| 性高湖久久久久久久久| 日韩在线一卡二卡| 日韩www在线| 亚洲综合资源| jizzjizzxxxx| 亚洲乱码国产乱码精品精的特点| 天堂视频中文在线| 亚洲伊人久久综合| 久久婷婷丁香| 久久久久久蜜桃| 丝袜美腿亚洲一区二区| 校园春色另类视频| 秋霞午夜鲁丝一区二区| 一本久道中文字幕精品亚洲嫩| 3d玉蒲团在线观看|