精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

久久精品免费在线观看| 欧美a级片视频| 亚洲宅男天堂在线观看无病毒| 成人激情电影一区二区| 成年人二级毛片| 日本一区二区乱| 夜夜揉揉日日人人青青一国产精品| 91免费看网站| 国产精品30p| 欧美日韩另类图片| 欧美在线短视频| 正在播放一区| 高h调教冰块play男男双性文| 极品日韩av| 亚洲欧美在线免费| 欧美午夜aaaaaa免费视频| 日本福利在线| 粉嫩13p一区二区三区| 2019最新中文字幕| www.日本高清视频| 日韩中文字幕一区二区高清99| 亚洲一二三区在线观看| 精品中文字幕人| 综合久久中文字幕| 性欧美freehd18| 中文字幕在线一区| 久久婷婷开心| 午夜精品一二三区| 久久99精品久久久久久国产越南| 国内揄拍国内精品| 日韩国产第一页| 久久99国产成人小视频| 精品国产电影一区二区| 日日干日日操日日射| 欧美男女交配| 五月天婷婷综合| 久草视频这里只有精品| 蜜芽在线免费观看| 国产欧美日韩卡一| 欧美国产二区| 天天操天天射天天舔| 国内精品伊人久久久久av影院| 国产99久久精品一区二区永久免费 | 亚洲欧美久久234| 女人偷人在线视频| 91在线国产观看| 国产精品综合久久久久久| 国产片在线播放| 久久99精品国产| 国产精品久久久久影院日本| 日本熟女毛茸茸| 午夜亚洲一区| 奇米4444一区二区三区| 国产激情美女久久久久久吹潮| 又色又爽又高潮免费视频国产| 99爱在线观看| 亚洲午夜视频在线观看| av在线com| 视频在线这里都是精品| 亚洲精品成人在线| 国产黄色激情视频| 国产蜜臀在线| 香蕉影视欧美成人| 免费国产a级片| 在线视频超级| 色综合天天狠狠| 日本999视频| 韩日一区二区| 欧美区一区二区三区| 免费精品99久久国产综合精品应用| 爱情岛亚洲播放路线| 亚洲第一激情av| 欧美日韩亚洲一| 久久精品女人天堂av免费观看| 色哟哟在线观看一区二区三区| 黄色a级片免费| 粉嫩一区二区三区| 欧美色国产精品| 99re6在线观看| 日韩精品一区二区三区中文| 精品国产凹凸成av人网站| 久久久老熟女一区二区三区91| 欧美sss在线视频| 国产视频久久久久久久| 久久精品无码一区| 亚洲国产日韩欧美在线| 欧美激情一区二区三区久久久| 日本学生初尝黑人巨免费视频| 亚洲欧美日韩专区| 国产自摸综合网| 亚洲精品视频专区| 久久嫩草精品久久久久| 国产日韩一区二区三区| 欧美大片aaa| 国产精品初高中害羞小美女文| 久久久久久久久久久久久国产| 女囚岛在线观看| 日韩人在线观看| 色婷婷.com| 久久男人av| xvideos亚洲人网站| 久久久久久久9999| 久久欧美肥婆一二区| 91欧美激情另类亚洲| 亚洲欧美日韩动漫| 综合久久综合久久| 亚洲精品无码久久久久久| 四虎国产精品免费久久| 亚洲精品福利在线| 久久噜噜色综合一区二区| 99国产精品99久久久久久粉嫩| 国产精品久久久久久久久久久久久| 懂色av一区二区三区在线播放| 日韩av大片在线观看| 日本不卡一二三区黄网| 国产精品久久7| 在线观看黄色av| 黄色一区二区三区| 国产又粗又猛大又黄又爽| 亚洲素人在线| 欧美精品www| 91丨porny丨在线中文 | 亚洲av无码一区二区三区网址| 欧美午夜精品一区二区三区电影| 毛片精品免费在线观看| 无码人妻精品一区二区三区不卡 | 中文字幕一区二区三区久久网站| 88xx成人精品| 亚洲国产一二三区| 综合久久综合久久| 91热这里只有精品| 国产毛片一区二区三区| 97视频免费在线看| www.综合色| 亚洲免费视频成人| 一道本在线免费视频| 国产精品入口久久| 欧洲精品久久久| 国产激情av在线| 国产剧情在线| 欧美三级乱人伦电影| a视频免费观看| 亚洲第一毛片| 国产九色91| www视频在线观看| 欧美一级午夜免费电影| 天天爽天天爽天天爽| 免费在线观看视频一区| 日韩欧美在线电影| 日韩123区| 欧美tk丨vk视频| 午夜精品福利在线视频| 国内精品久久久久影院一蜜桃| 亚洲不卡1区| 日本不卡一二三| 亚洲免费高清视频| 亚洲婷婷综合网| 久久久久久久网| 久久久久人妻精品一区三寸| 欧美美女在线直播| 欧美一区二区三区免费视| 色综合免费视频| 精品国产乱码久久久久久婷婷 | www.国产一区| 国产日韩精品suv| 亚洲精品成人天堂一二三| 手机看片国产精品| 亚洲国产免费看| 久久综合色一本| 日本精品不卡| 日韩在线国产精品| 亚洲AV无码一区二区三区性| 亚洲国产精品麻豆| 玖草视频在线观看| 日韩高清一级片| 日本黄色播放器| 电影一区二区在线观看| 欧美亚洲激情视频| melody高清在线观看| 制服视频三区第一页精品| 免费在线观看av网址| 99久久久精品| 国产真人无码作爱视频免费| 国产韩日影视精品| 国产另类自拍| 久久久成人av毛片免费观看| 久久久999精品| 五月激情六月婷婷| 欧美日韩你懂的| 国产精品成人国产乱| 久久久不卡影院| 成人国产精品色哟哟| 香蕉视频在线观看黄| 欧美破处大片在线视频| 久久久久久久免费| 欧美成人福利| 97人洗澡人人免费公开视频碰碰碰| 你懂的在线视频| 欧美一区二区三区男人的天堂| 日韩精品成人一区| 国产精品国产三级国产aⅴ原创| 免费在线观看日韩av| 日本怡春院一区二区| 成人国产在线看| 精品大片一区二区| 超碰97人人在线| 日韩av一级| 国内外成人免费激情在线视频| av在线1区2区| 日韩精品在线视频观看| 国产人妖一区二区| 在线观看免费一区| 国产精品 欧美 日韩| 国产精品久久网站| 少妇大叫太粗太大爽一区二区| 国产一区二区三区精品欧美日韩一区二区三区| 九九爱精品视频| 中文字幕人成人乱码| 欧美亚洲国产免费| 国产精品18hdxxxⅹ在线| 国产日韩精品在线| 26uuu亚洲电影| 国内精品久久久久久久| a级影片在线| xvideos成人免费中文版| 国产大学生校花援交在线播放| 精品国产一区二区三区不卡 | 欧美日本乱大交xxxxx| 国产手机在线视频| 一区二区三区自拍| 99热6这里只有精品| 久久久综合网站| 一级特级黄色片| 成人午夜短视频| 国产精品二区视频| 国产一区视频网站| 国产欧美精品一二三| 美女网站一区二区| 色婷婷综合久久久久中文字幕| 国产日韩欧美一区| 欧美一级欧美一级| 欧美区日韩区| 日韩精品在线中文字幕| 欧美有码视频| 亚洲精品天堂成人片av在线播放 | 懂色av色香蕉一区二区蜜桃| 国产精品入口尤物| 亚洲精品555| 国产精品免费网站| 精品免费av一区二区三区| 国产999精品久久久影片官网| 中国色在线日|韩| 情事1991在线| 欧美性xxx| 国产精品一区久久久| 久久亚洲精品人成综合网| 国产精品国内视频| 国产精品伦一区二区| 国产区亚洲区欧美区| 韩日精品一区| 91久久国产精品91久久性色| 国产精品一区二区三区四区在线观看| 国产视频999| 国产一区二区三区免费在线| 亚洲一区二区三区乱码aⅴ蜜桃女 亚洲一区二区三区乱码aⅴ | 国产在线日韩精品| 亚洲二区三区四区| 99re久久最新地址获取| 国产又粗又硬又长| 亚洲视频久久| 国产精品-区区久久久狼| 日韩极品在线观看| 中文字幕视频三区| 丰满亚洲少妇av| av在线网站观看| 国产精品久久久久四虎| 69av.com| 欧美日韩日本国产| 黄色一区二区视频| 欧美一区二区三区在线观看视频| 亚洲精品一区二区三区四区| 日韩精品中文字| 欧美尤物美女在线| 欧美精品激情blacked18| 亚洲精品永久免费视频| 国产在线观看一区二区三区 | 免费精品视频一区| 97精品一区二区| 草b视频在线观看| 日本v片在线高清不卡在线观看| 亚洲免费成人在线视频| 97国产精品videossex| 欧美自拍偷拍网| 亚洲一区二区中文在线| 精品国产乱子伦| 日韩午夜av电影| 日色在线视频| 九九热这里只有在线精品视| 朝桐光一区二区| 国产精品xxxx| 久久久久国产| 久久久精品在线视频| 精品一区二区三区香蕉蜜桃| 亚洲观看黄色网| 综合欧美亚洲日本| 天干夜夜爽爽日日日日| 精品对白一区国产伦| av片在线免费观看| 2019日本中文字幕| 国产午夜久久av| 天堂一区二区三区| 亚洲经典在线| 中文字幕一区二区三区四| 91啪亚洲精品| 精品少妇一二三区| 欧美欧美欧美欧美首页| 免费国产在线观看| 久久久免费精品视频| 国产精品2区| 性刺激综合网| 久久午夜精品一区二区| 无码人妻精品一区二区三| 亚洲视频资源在线| 免费看av在线| 国产小视频国产精品| 美女的胸无遮挡在线观看| 99久久99久久| 一个色综合网| 999久久久精品视频| 亚洲国产精品精华液2区45| 亚洲久久在线观看| 亚洲精品国产精品国自产在线| 欧美黄色激情| 国产欧美日韩中文| 不卡av一区二区| 日韩精品无码一区二区三区免费| 99久久精品免费看国产| 久久免费视频6| 日韩久久久久久| 亚洲妇熟xxxx妇色黄| 亚洲va男人天堂| 亚洲电影影音先锋| 婷婷激情5月天| 亚洲人午夜精品天堂一二香蕉| 97av免费视频| 久久久精品久久久久| 日韩成人精品一区二区三区| 亚洲图片都市激情| 激情伊人五月天久久综合| 国产日产在线观看| 3d动漫精品啪啪| jizz性欧美| 国产精品久久久久久免费观看| 欧美日韩综合| 私密视频在线观看| 色又黄又爽网站www久久| 欧美视频免费一区二区三区| 日韩av电影在线播放| 国产一区二区三区四区五区传媒| 成年人在线看片| 国产精品久久午夜| 国内精品久久久久久久久久久| 欧美日韩成人黄色| 加勒比视频一区| 哪个网站能看毛片| 国产精品天干天干在观线| 一级爱爱免费视频| 欧美成人精品一区二区| 国产精品网在线观看| 无码人妻精品一区二区三区在线| 久久久久久久综合色一本| 在线观看av大片| 九九热精品视频| 香蕉一区二区| 国产三级国产精品国产专区50| 中文字幕日韩欧美一区二区三区| 精品国产乱码一区二区三 | yy6080久久伦理一区二区| 亚洲综合第一| 丁香激情综合国产| 日本黄色一级视频| 久久久国产精品一区| 亚洲综合影院| 91av在线免费播放| 亚洲男人都懂的| 久久国产精品高清一区二区三区| 国产精品自产拍在线观看中文 | 久久婷婷国产精品| 日韩一区中文字幕| 天堂a中文在线| 92裸体在线视频网站| 亚洲一区二区成人| 91视频青青草| 日韩激情av在线播放| 伊人久久一区| 欧美 国产 小说 另类| 亚洲免费在线播放| 福利片在线看| 狠狠色综合色区| 国产精品性做久久久久久|