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

Spring Boot 多級緩存實踐:本地緩存 + 分布式緩存的最佳組合

開發 前端
本文詳細介紹了 Spring Boot 應用中以 Caffeine 為本地一級緩存、Redis 為分布式二級緩存的多層緩存實現,從手動管理的粗糙方案、Spring CompositeCacheManager 的優化方案,到自定義 CacheManager 實現緩存自動同步的完美方案。

在本文中,我們將深入探討 Spring Boot 應用中多層緩存的實現思路。具體而言,我們會采用本地一級緩存(L1) 與遠程分布式二級緩存(L2) 的組合方案:其中一級緩存使用較短的過期時間,二級緩存則配置較長的過期時間。

多層緩存的核心邏輯是優先查詢本地緩存,若本地緩存未命中,則再查詢二級緩存。其核心目標是通過減少與遠程服務的往返通信次數,顯著提升應用性能。

技術選型說明

  • 一級緩存(L1):采用 Caffeine 緩存庫實現。Caffeine 是當前性能最優的本地緩存方案之一,基于 W-TinyLFU 淘汰算法(高命中率),支持高效的內存管理、靈活的過期策略(寫入后過期、訪問后過期等),且對 Java 8+ 特性適配良好。
  • 二級緩存(L2):采用 Redis 實現。Redis 作為主流的分布式內存數據存儲,具備高可用、高并發支持能力,適合作為跨服務共享的二級緩存。

需要說明的是,本文的實現方案具備通用性——只需輕微調整,即可適配 Ehcache、Hazelcast 等其他緩存組件。

一、Caffeine 依賴引入

要在 Spring Boot 項目中使用 Caffeine,需先引入對應的依賴。推薦通過 Spring Boot 官方的依賴管理(spring-boot-dependencies)控制版本,避免版本沖突;若未使用 Spring Boot 父工程,則需手動指定 Caffeine 版本。

Maven 項目依賴

在 pom.xml 中添加以下依賴:

<!-- 方式1:直接引入 Caffeine 核心依賴(推薦,版本由 Spring Boot 父工程管理) -->
<dependency>
    <groupId>com.github.ben-manes.caffeine</groupId>
    <artifactId>caffeine</artifactId>
</dependency>

<!-- 方式2:若需使用 Spring 對 Caffeine 的緩存適配(如 CaffeineCacheManager),可引入 spring-boot-starter-cache -->
<!-- 注:spring-boot-starter-cache 已間接包含 Caffeine 依賴(需確保項目已啟用緩存抽象) -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-cache</artifactId>
</dependency>

Caffeine 優勢

選擇 Caffeine 作為一級緩存,核心原因在于其卓越的性能與靈活性:

  • 高命中率:采用 W-TinyLFU(Window Tiny Least Frequently Used)淘汰算法,在高并發場景下比傳統 LRU 算法命中率提升 10%-20%。
  • 低延遲:底層基于 Java 并發容器(如 ConcurrentHashMap),讀寫操作均為低延遲設計,支持每秒數百萬次緩存訪問。
  • 靈活的過期策略:支持 expireAfterWrite(寫入后過期)、expireAfterAccess(訪問后過期)、expireAfter(自定義過期邏輯),滿足不同業務場景。
  • 內存安全:支持配置最大緩存容量(maximumSize),當緩存達到閾值時自動淘汰舊數據,避免內存溢出。

二、簡單卻粗糙的雙層緩存實現方案

在 Spring Boot 中,我們通常使用 @Cacheable 注解實現方法結果緩存。若要實現雙層緩存,最直接的思路是:手動檢查一級緩存(Caffeine),未命中時再查詢二級緩存(Redis)。

首先看二級緩存服務的實現(基于 @Cacheable 注解):

public class L2CacheService {

    @Cacheable(value = "myCache", key = "#id")
    public String getFromCache(String id) {
        // 該方法的返回結果會被自動緩存(默認對接二級緩存)
        return "Hello " + id;
    }
}

在此基礎上,封裝一級緩存邏輯,形成雙層緩存調用:

public class L1CacheService {

    @Autowired
    private L2CacheService l2CacheService;

    // 初始化 Caffeine 本地緩存:最大緩存數 100,寫入后 10 分鐘過期
    private Cache<String, String> caffeineCache = Caffeine.newBuilder()
        .maximumSize(100)
        .expireAfterWrite(10, TimeUnit.MINUTES)
        .build();

    public String getFromCache(String id) {
        // 1. 優先查詢一級緩存
        String result = caffeineCache.getIfPresent(id);
        if (result == null) {
            // 2. 一級緩存未命中,查詢二級緩存
            result = l2CacheService.getFromCache(id);
            // 3. 若二級緩存命中,同步到一級緩存
            if (result != null) {
                caffeineCache.put(id, result);
            }
        }
        return result;
    }
}

顯然,這種方案并不理想:代碼冗余度高,且需為每個緩存場景單獨創建服務類,極易因手動維護緩存邏輯導致錯誤(如緩存同步遺漏、過期時間不一致等)。我們有更優的實現方式。

三、基于 Spring 緩存抽象的優化方案

Spring 提供的 CompositeCacheManager(組合緩存管理器)可將多個緩存組件整合,大幅簡化雙層緩存的配置邏輯。以下是具體實現:

1. 緩存配置類

@Configuration
@EnableCaching// 啟用 Spring 緩存抽象
publicclass CacheConfig {

    @Bean
    public CacheManager cacheManager() {
        // 1. 配置一級緩存(Caffeine)
        CaffeineCacheManager caffeineCacheManager = new CaffeineCacheManager("myCache");
        caffeineCacheManager.setCaffeine(caffeineCacheBuilder());
        caffeineCacheManager.setAllowNullValues(false); // 不允許緩存 null 值

        // 2. 配置二級緩存(Redis)
        RedisCacheManager redisCacheManager = new RedisCacheManager(redisTemplate());
        redisCacheManager.setUsePrefix(true); // 啟用緩存鍵前綴,避免鍵沖突

        // 3. 組合緩存管理器:優先使用 Caffeine 緩存,未命中則查詢 Redis
        CompositeCacheManager compositeCacheManager = new CompositeCacheManager(caffeineCacheManager, redisCacheManager);
        compositeCacheManager.setFallbackToNoOpCache(true); // 當緩存不存在時,啟用無操作緩存降級(避免報錯)

        return compositeCacheManager;
    }

    // 配置 Caffeine 緩存策略
    private Caffeine<Object, Object> caffeineCacheBuilder() {
        return Caffeine.newBuilder()
            .maximumSize(100) // 最大緩存條目數
            .expireAfterWrite(10, TimeUnit.MINUTES); // 寫入后 10 分鐘過期
    }

    // 配置 Redis 模板(序列化方式)
    @Bean
    public RedisTemplate<String, String> redisTemplate() {
        RedisTemplate<String, String> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(redisConnectionFactory());
        // 配置鍵/值的序列化器(避免 Redis 中存儲亂碼)
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setValueSerializer(new StringRedisSerializer());
        return redisTemplate;
    }

    // 配置 Redis 連接工廠(默認使用 Lettuce 客戶端)
    @Bean
    public RedisConnectionFactory redisConnectionFactory() {
        returnnew LettuceConnectionFactory();
    }
}

2. 業務服務實現

只需在方法上添加 @Cacheable 注解,即可自動觸發雙層緩存邏輯:

@Cacheable(value = "myCache", key = "#id")
public String getFromCache(String id) {
    return "Hello " + id;
}

方案優勢與局限性

  • 優勢:基于 Spring 原生緩存抽象,無需手動維護緩存調用邏輯,代碼簡潔且容錯性強。
  • 局限性:CompositeCacheManager 僅支持“一級緩存未命中則查詢二級緩存”,但不會將二級緩存的命中結果同步到一級緩存。若需實現緩存同步,仍需在業務方法中手動編寫邏輯:
public String getFromCache(String id) {
    // 1. 查詢一級緩存
    String result = caffeineCacheManager.getCache("myCache").get(id, String.class);
    if (result == null) {
        // 2. 一級緩存未命中,查詢二級緩存
        result = redisCacheManager.getCache("myCache").get(id, String.class);
        // 3. 同步二級緩存結果到一級緩存
        if (result != null) {
            caffeineCacheManager.getCache("myCache").put(id, result);
        }
    }
    return result;
}

顯然,這種“配置+手動代碼”的混合模式仍不完美。接下來,我們將通過自定義緩存管理器,實現真正無縫的雙層緩存同步。

四、基于自定義 CacheManager 的完美方案

通過實現 Spring 的 CacheManager 接口與 Cache 接口,我們可以完全掌控雙層緩存的讀寫、同步與過期邏輯,實現“一次注解,雙向同步”。

1. 自定義緩存管理器(CustomCacheManager)

import org.springframework.cache.Cache;
import org.springframework.cache.CacheManager;
import java.util.Collection;

publicclass CustomCacheManager implements CacheManager {

    // 依賴注入一級緩存管理器(Caffeine)與二級緩存管理器(Redis)
    privatefinal CacheManager caffeineCacheManager;
    privatefinal CacheManager redisCacheManager;

    public CustomCacheManager(CacheManager caffeineCacheManager, CacheManager redisCacheManager) {
        this.caffeineCacheManager = caffeineCacheManager;
        this.redisCacheManager = redisCacheManager;
    }

    // 獲取緩存實例:返回自定義的雙層緩存實現
    @Override
    public Cache getCache(String name) {
        Cache caffeineCache = caffeineCacheManager.getCache(name);
        Cache redisCache = redisCacheManager.getCache(name);
        returnnew CustomCache(caffeineCache, redisCache);
    }

    // 獲取所有緩存名稱(與一級緩存保持一致)
    @Override
    public Collection<String> getCacheNames() {
        return caffeineCacheManager.getCacheNames();
    }
}

2. 自定義緩存實現(CustomCache)

import org.springframework.cache.Cache;
import org.springframework.cache.support.SimpleValueWrapper;
import java.util.concurrent.Callable;

// 采用 record 類型簡化代碼(JDK 16+ 支持),也可使用 class 實現
public record CustomCache(Cache firstLevelCache, Cache secondLevelCache) implements Cache {

    // 緩存名稱:與一級緩存保持一致
    @Override
    public String getName() {
        return firstLevelCache.getName();
    }

    // 原生緩存實例:返回一級緩存的原生實例
    @Override
    public Object getNativeCache() {
        return firstLevelCache.getNativeCache();
    }

    // 緩存查詢:優先查一級,未命中則查二級,并同步到一級
    @Override
    public ValueWrapper get(Object key) {
        // 1. 查詢一級緩存
        ValueWrapper valueWrapper = firstLevelCache.get(key);
        if (valueWrapper == null) {
            // 2. 一級未命中,查詢二級緩存
            valueWrapper = secondLevelCache.get(key);
            if (valueWrapper != null) {
                // 3. 同步二級緩存結果到一級
                firstLevelCache.put(key, valueWrapper.get());
            }
        }
        return valueWrapper;
    }

    // 帶類型的緩存查詢:邏輯與 get(Object key) 一致
    @Override
    public <T> T get(Object key, Class<T> type) {
        T value = firstLevelCache.get(key, type);
        if (value == null) {
            value = secondLevelCache.get(key, type);
            if (value != null) {
                firstLevelCache.put(key, value);
            }
        }
        return value;
    }

    // 帶值加載器的查詢:優先從一級緩存加載,失敗則從二級加載
    @Override
    public <T> T get(Object key, Callable<T> valueLoader) {
        try {
            // 優先從一級緩存加載
            return firstLevelCache.get(key, valueLoader);
        } catch (Exception e) {
            // 一級緩存加載失敗(如無數據),從二級緩存加載
            return secondLevelCache.get(key, valueLoader);
        }
    }

    // 緩存寫入:同時寫入一級與二級緩存
    @Override
    public void put(Object key, Object value) {
        firstLevelCache.put(key, value);
        secondLevelCache.put(key, value);
    }

    // 緩存刪除:同時刪除一級與二級緩存的對應鍵
    @Override
    public void evict(Object key) {
        firstLevelCache.evict(key);
        secondLevelCache.evict(key);
    }

    // 緩存清空:同時清空一級與二級緩存
    @Override
    public void clear() {
        firstLevelCache.clear();
        secondLevelCache.clear();
    }
}

3. 配置自定義緩存管理器

@Configuration
@EnableCaching
publicclass CacheConfig {

    publicstaticfinal String CACHE_NAME = "doubleCachingCache";

    // 配置自定義緩存管理器
    @Bean
    public CacheManager customCacheManager(RedisConnectionFactory redisConnectionFactory) {
        // 1. 配置一級緩存(Caffeine)
        CaffeineCacheManager caffeineCacheManager = new CaffeineCacheManager();
        caffeineCacheManager.setCaffeine(
                Caffeine.newBuilder()
                        .maximumSize(100) // 一級緩存最大條目數
                        .expireAfterWrite(Duration.ofMinutes(10)) // 一級緩存過期時間:10 分鐘
        );

        // 2. 配置二級緩存(Redis)
        RedisCacheManager redisCacheManager = RedisCacheManager.builder(redisConnectionFactory)
                .cacheDefaults(
                        RedisCacheConfiguration.defaultCacheConfig()
                                .entryTtl(Duration.ofHours(1)) // 二級緩存過期時間:1 小時
                )
                .build();

        // 3. 返回自定義緩存管理器(整合一級與二級緩存)
        returnnew CustomCacheManager(caffeineCacheManager, redisCacheManager);
    }
}

4. 業務服務使用

無需任何額外代碼,僅通過 @Cacheable 注解即可觸發完整的雙層緩存邏輯:

@Cacheable(value = CacheConfig.CACHE_NAME, key = "#id")
public String getFromCache(String id) {
    return "Hello " + id;
}

核心邏輯說明

  • 查詢邏輯:一級緩存命中 → 直接返回;一級未命中 → 查詢二級緩存 → 同步到一級緩存后返回。
  • 寫入邏輯:數據同時寫入一級與二級緩存,確保緩存一致性。
  • 刪除/清空邏輯:操作同時作用于兩級緩存,避免“一級緩存已刪、二級緩存仍存在”的臟數據問題。

以下圖表展示了完整的操作流程:

圖片圖片

五、總結

本文詳細介紹了 Spring Boot 應用中以 Caffeine 為本地一級緩存、Redis 為分布式二級緩存的多層緩存實現,從手動管理的粗糙方案、Spring CompositeCacheManager 的優化方案,到自定義 CacheManager 實現緩存自動同步的完美方案。為提升應用性能、保證緩存一致性提供了可落地的實踐指南。

責任編輯:武曉燕 來源: 程序員wayn
相關推薦

2023-05-12 11:52:21

緩存場景性能

2023-02-28 07:01:11

分布式緩存平臺

2023-05-05 06:13:51

分布式多級緩存系統

2022-06-13 10:23:34

Helios緩存服務端

2009-02-06 09:38:38

memcached分布式緩存系統ASP.NET

2018-02-07 10:46:20

數據存儲

2024-05-20 08:08:00

分布式系統緩存C#

2019-02-18 11:16:12

Redis分布式緩存

2013-06-13 11:29:14

分布式分布式緩存

2022-04-07 17:13:09

緩存算法服務端

2019-07-04 15:13:16

分布式緩存Redis

2015-09-21 09:20:11

C#Couchbase使用

2017-12-12 14:51:15

分布式緩存設計

2009-11-09 09:25:24

Memcached入門

2009-02-10 08:57:01

分布式緩存.Net開發

2025-03-27 04:10:00

2017-12-27 12:01:39

2019-11-05 14:24:31

緩存雪崩框架

2018-12-14 10:06:22

緩存分布式系統

2017-09-27 10:53:53

分布式數據集SparkRDD
點贊
收藏

51CTO技術棧公眾號

任我爽在线视频| 玩弄中年熟妇正在播放| 99久久婷婷国产一区二区三区| 亚洲午夜极品| 国产一区二区三区网站| 51自拍视频在线观看| 免费h视频在线观看| 欧美激情一区三区| 成人看片视频| 最新黄色网址在线观看| 在线成人亚洲| 久久精品视频免费播放| jlzzjizz在线播放观看| 香蕉久久一区| 欧美影院一区二区| 青青草国产精品视频| 免费大片黄在线| 99热在这里有精品免费| 成人免费在线网址| 无码人妻精品一区二区三区不卡| 欧美日韩视频| 日日狠狠久久偷偷四色综合免费 | 精品国产一区二区在线观看| 中文字幕国内自拍| 在线一区av| 亚洲成人动漫在线观看| eeuss中文| 天天在线视频色| 337p粉嫩大胆噜噜噜噜噜91av| 91影院在线免费观看视频| www.久久视频| 羞羞答答国产精品www一本| 久久99精品视频一区97| 天天爽天天爽天天爽| 国产探花在线精品一区二区| 亚洲国内精品在线| 日本50路肥熟bbw| 精品一区二区三区免费看| 欧美性大战久久| 日韩中文字幕二区| jizz内谢中国亚洲jizz| 亚洲va天堂va国产va久| 免费人成在线观看视频播放| 最新黄网在线观看| 亚洲欧美日韩国产综合在线| 一区二区三区视频在线播放| 亚洲成人三级| 国产精品嫩草影院com| 日韩精品久久一区二区三区| 经典三级在线| 国产日产欧美一区二区视频| 欧美日韩一区二区三区在线观看免| 日本激情视频网站| 99亚偷拍自图区亚洲| 久久天堂国产精品| 色视频免费在线观看| 91蜜桃在线免费视频| 欧美日韩一区二区视频在线 | 精品中文字幕视频| 久久国产露脸精品国产| 国产综合自拍| 亚州国产精品久久久| 欧美精品二区三区| 丝袜亚洲精品中文字幕一区| 日本欧美黄网站| 亚洲精品一区二区二区| 国产一区在线观看视频| 99三级在线| 亚洲三区在线观看无套内射| 国产午夜精品理论片a级大结局| 日韩一区国产在线观看| 久久bbxx| 亚洲一级二级三级| 男女高潮又爽又黄又无遮挡| 在线观看爽视频| 欧美影院精品一区| 欧美xxxxxbbbbb| 久久99偷拍| 亚洲午夜未满十八勿入免费观看全集| 久久久国产一级片| 欧美区亚洲区| 欧美中文在线观看| 国产三级三级在线观看| 99国产精品视频免费观看| 日本一区二区三区在线视频| 超碰个人在线| 黑人精品xxx一区一二区| 欧美精品性生活| 日韩免费成人| 亚洲天堂av在线免费观看| 性生交大片免费全黄| 亚洲人成高清| 国产精品亚洲аv天堂网| 亚洲第一视频在线| 亚洲国产精品精华液ab| 国产资源在线免费观看| 电影久久久久久| 精品蜜桃在线看| 五月天精品在线| 在线精品福利| 91精品视频免费| 欧美18xxxxx| 亚洲一区在线看| 嫩草av久久伊人妇女超级a| 日韩中文字幕视频网| 在线观看日韩欧美| 日韩毛片在线播放| 韩国一区二区三区| 欧洲成人一区二区| 超免费在线视频| 91精品欧美综合在线观看最新| 欧产日产国产精品98| 91tv官网精品成人亚洲| 国产成人精品免费久久久久 | 在线观看日韩av| 99热只有这里有精品| 国产一区二区三区综合| 色噜噜色狠狠狠狠狠综合色一| 国产传媒在线观看| 日韩一级免费观看| 美女三级黄色片| 日产国产高清一区二区三区| 久久亚裔精品欧美| 黄页在线观看免费| 日韩一区二区免费在线观看| 污污视频网站在线免费观看| 亚久久调教视频| 精品蜜桃传媒| 暧暧视频在线免费观看| 日韩一级在线观看| 成年人午夜剧场| 激情偷乱视频一区二区三区| 亚洲成人网上| 性欧美videohd高精| 亚洲精品美女在线观看播放| 一区二区三区免费高清视频| 国产成人免费av在线| 国内外成人激情免费视频| 伊人国产精品| 久久精品国产一区二区三区| 一级二级三级视频| 中文字幕亚洲不卡| www.com操| 91久久夜色精品国产按摩| 国产精品电影网站| 8888四色奇米在线观看| 欧美三级三级三级爽爽爽| 午夜精产品一区二区在线观看的| 媚黑女一区二区| 欧美日韩另类丝袜其他| 456成人影院在线观看| 国产亚洲精品久久| 美女黄页在线观看| 国产精品美女久久久久久久久久久| 午夜激情在线观看视频| 91视频精品| 91免费看网站| ****av在线网毛片| 亚洲精品视频在线观看视频| 国产精品熟女视频| 亚洲欧美综合在线精品| 欧美69精品久久久久久不卡| 亚洲精品乱码| 欧美日韩一区在线播放| 日韩精品第二页| 美女精品久久久| 日本精品一二区| 欧美日韩在线免费| 黄大色黄女片18免费| 国产一区二区三区综合| 日韩精品 欧美| 精品久久久久久久| 91九色视频在线观看| 久草在线资源福利站| 亚洲天堂网站在线观看视频| 91片黄在线观看喷潮| 亚洲天天做日日做天天谢日日欢| 国产乱国产乱老熟300部视频| 亚洲日本久久| 亚洲成人一区二区三区| 99re8这里有精品热视频免费| 青青在线视频一区二区三区| 毛片激情在线观看| 精品国产凹凸成av人导航| 潘金莲一级淫片aaaaaa播放| 亚洲同性gay激情无套| 噜噜噜在线视频| 美女视频一区在线观看| 福利视频一区二区三区四区| 成人羞羞网站入口免费| 风间由美久久久| 日韩经典一区| 欧美激情乱人伦| av资源网站在线观看| 亚洲精品一区二区三区在线观看 | 久久久久久a亚洲欧洲aⅴ| 成人国产在线| 午夜精品久久久久久久久久久久久 | www.欧美精品一二区| 午夜欧美福利视频| 激情亚洲成人| 伊人色综合影院| 尤物tv在线精品| 成人黄色在线免费观看| 欧美97人人模人人爽人人喊视频| 国产做受69高潮| 黄色网页在线免费观看| 亚洲天天在线日亚洲洲精| 超碰人人人人人人| 欧美日韩国产首页在线观看| 久久久久久少妇| 亚洲永久精品国产| 国产suv精品一区二区68| 久久蜜桃香蕉精品一区二区三区| 一级黄色大片免费看| 精品在线一区二区三区| 欧美日韩在线中文| 亚洲国产精品一区制服丝袜| 中文字幕一区二区三区最新| 国产欧美一区二区精品久久久| 国产乱码精品一区二区三区不卡| 精品中文在线| 91啪国产在线| 欧美啪啪网站| 国产精品久久一区主播| 在线免费日韩片| 欧美专区国产专区| 草草在线视频| 97在线视频免费观看| 毛片在线导航| 欧美日韩成人网| www在线免费观看视频| 最新日韩中文字幕| 欧美尤物美女在线| 日韩在线免费视频观看| 第一福利在线| 国产一区二区三区四区福利| 国产高清一区在线观看| 国产亚洲精品一区二555| 久久经典视频| 国产一区二区日韩| 91在线网址| 最近2019中文字幕第三页视频| 国产免费a∨片在线观看不卡| 亚洲天堂久久av| yw在线观看| 中文字幕欧美国内| 免费**毛片在线| 久久av在线播放| 婷婷在线播放| 91国偷自产一区二区三区的观看方式| 182在线播放| 热re91久久精品国99热蜜臀| 日本成人片在线| 国产精品视频播放| 日本一区二区三区播放| av电影成人| 亚洲图区在线| 日韩区国产区| 91成人网在线观看| 成人短视频在线观看免费| 禁久久精品乱码| 久久精品.com| 秋霞成人午夜伦在线观看| 91丝袜超薄交口足| 懂色av一区二区三区蜜臀| 色呦呦一区二区| 国产拍欧美日韩视频二区| 日韩国产第一页| 亚洲影院久久精品| 五月天婷婷激情| 9191精品国产综合久久久久久| 精品国产一级片| 日韩精品亚洲元码| 日本在线免费网| 欧美精品激情在线观看| 桃子视频成人app| 亚洲专区在线视频| 婷婷亚洲精品| 一区二区不卡在线观看| 亚洲激情一区| 国产又黄又猛又粗又爽的视频| 国产精品99久久久久久久女警| 人妻丰满熟妇av无码久久洗澡| 亚洲国产岛国毛片在线| 久久精品性爱视频| 在线观看亚洲精品| 国产成人三级在线观看视频| 国产亚洲精品va在线观看| 日本色护士高潮视频在线观看 | 免费在线黄网站| 久热精品视频| www.四虎在线| 中文字幕一区三区| 亚洲国产成人精品激情在线| 欧美日韩三级视频| 日本又骚又刺激的视频在线观看| 久久久成人av| 天天综合网站| 国产一区二区三区高清| 99精品国产一区二区三区| 国模吧无码一区二区三区| 国产综合色产在线精品| 免费污网站在线观看| 亚洲狠狠爱一区二区三区| 伊人网视频在线| 日韩精品极品视频免费观看| 成视频免费观看在线看| 国产精品久久久久久久9999| 久久97精品| 男女裸体影院高潮| 看片的网站亚洲| 91视频在线网站| 午夜久久电影网| 性欧美18一19性猛交| 中文字幕日本精品| 日本欧美不卡| 区一区二区三区中文字幕| 亚洲天堂偷拍| 国产精品99久久久精品无码| 国产精品超碰97尤物18| 国产成人无码专区| 精品一区二区电影| 大菠萝精品导航| 成人av网站观看| 欧美日韩免费| 人妻巨大乳一二三区| 亚洲欧洲av另类| 国产又粗又猛又爽又黄91| 国产一区二区三区久久精品| 色老太综合网| 欧美性天天影院| 亚洲欧美视频| 人妻少妇精品视频一区二区三区| 亚洲一区二区欧美| 黄色av免费观看| 久久免费视频网| 好吊妞国产欧美日韩免费观看网站| 日本大胆人体视频| 国产高清亚洲一区| 免看一级a毛片一片成人不卡| 欧美大片日本大片免费观看| 伊人电影在线观看| 成人在线看片| 亚洲大胆av| 国产麻豆xxxvideo实拍| 午夜国产不卡在线观看视频| 少妇精品视频一区二区| 78m国产成人精品视频| 色天下一区二区三区| 女性女同性aⅴ免费观女性恋| 91美女片黄在线观看| 中文字幕手机在线视频| 一区二区三区精品99久久| 在线观看精品| 综合久久国产| 国产成人精品一区二区三区网站观看 | xx欧美撒尿嘘撒尿xx| 成人免费在线视频| www.香蕉视频| 91sa在线看| 激情五月综合网| 欧美成人乱码一二三四区免费| 自拍偷拍亚洲欧美日韩| 亚洲经典一区二区三区| 欧美一区二区三区……| 国产99久久精品一区二区300| 亚洲少妇久久久| 一区二区三区国产豹纹内裤在线| 天天射,天天干| 国产精品欧美一区二区| 欧美88av| 中文字幕av网址| 欧美日韩在线三级| 欧美四级在线| 日韩**一区毛片| 永久免费看mv网站入口78| 欧美日韩亚洲丝袜制服| 一色桃子av在线| 欧美成熟毛茸茸复古| 久久精品国产99| 精品一级少妇久久久久久久| 亚洲色图校园春色| 国产日韩一区二区三免费高清 | 久久精品官网| 香蕉成人在线视频| 亚洲高清不卡av| 久久天天久久| 国产精品自拍片| 亚洲欧洲av在线| 男女网站在线观看| 成人美女av在线直播| 久久xxxx精品视频| 麻豆changesxxx国产| 国产亚洲精品成人av久久ww| 成功精品影院| 在线视频观看一区二区| 欧美日韩亚洲精品一区二区三区| 免费人成在线观看播放视频| 精品无人区一区二区三区竹菊|