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

輕量分布式定時任務:Spring Boot 時間輪方案

云計算 分布式
在分布式系統中,定時任務是常見的需求,比如數據同步、訂單超時處理、日志清理等。傳統的定時任務方案如??Quartz??雖然功能強大,但在高并發、輕量級場景下,存在配置復雜、資源占用較高的問題。

引言

在分布式系統中,定時任務是常見的需求,比如數據同步、訂單超時處理、日志清理等。傳統的定時任務方案如Quartz雖然功能強大,但在高并發、輕量級場景下,存在配置復雜、資源占用較高的問題。而Spring Boot自帶的@Scheduled注解僅適用于單機環境,無法滿足分布式部署的需求。

時間輪算法是什么

時間輪(Time Wheel)是一種高效的定時任務調度模型,靈感來源于時鐘的輪盤結構。它將時間劃分為多個槽位(Slot),每個槽位對應一個時間區間(如1秒、10秒),并維護一個任務鏈表。

  • 單級時間輪:類似鐘表,有多個槽位(如60個,對應60秒),指針每秒轉動一次,指向當前需要執行的槽位,然后執行該槽位下的所有任務。
  • 多級時間輪:當任務的延遲時間超過單級時間輪的最大范圍時(如單級最大60秒,任務延遲1小時),會通過級聯機制,將任務先放入高級時間輪,當時間接近時,再降級到低級時間輪,最終觸發執行。

時間輪的優勢在于:

  • O (1)時間復雜度:任務的添加、刪除、觸發均為常數時間,效率遠高于定時器鏈表(O (n))。
  • 低資源占用:通過批量觸發減少線程喚醒頻率,降低CPU消耗。

實現

整體架構

本方案的架構分為三層,自上而下分別是:

  • 任務提交層:提供API接口,接收業務系統提交的定時任務(如延遲10秒執行訂單超時處理)。
  • 時間輪調度層:基于Netty HashedWheelTimer實現,負責按時間觸發任務,并通過Redis鎖保證分布式唯一性。
  • 任務執行層:接收調度層的觸發信號,執行具體的業務邏輯(如調用訂單關閉接口)。
[業務系統] → [任務提交API] → [Redis存儲任務] → [時間輪調度器] → [Redis分布式鎖] → [任務執行器]

時間輪參數設計

Netty HashedWheelTimer為例,核心參數需根據業務場景調整:

  • tickDuration:時間輪指針轉動一次的時間(如1秒),決定任務觸發的精度。
  • ticksPerWheel:時間輪的槽位數量(如60),單級時間輪的最大覆蓋時間 = tickDuration × ticksPerWheel(如60秒)。
  • threadFactory:線程工廠,用于創建時間輪的工作線程。

示例:

// 時間輪配置:1秒/ tick,60個槽位,最大覆蓋60秒
HashedWheelTimer timer = new HashedWheelTimer(
    Executors.defaultThreadFactory(), // 線程工廠
    Duration.ofSeconds(1), // 每1秒轉動一次
    TimeUnit.SECONDS,
    60 // 60個槽位
);

核心依賴

<!-- Redis 與 Redisson(分布式鎖) -->
<dependency>
    <groupId>org.redisson</groupId>
    <artifactId>redisson-spring-boot-starter</artifactId>
    <version>3.17.6</version>
</dependency>

<!-- Netty 時間輪(高性能) -->
<dependency>
    <groupId>io.netty</groupId>
    <artifactId>netty-common</artifactId>
    <version>4.1.82.Final</version>
</dependency>

<!-- 工具類 -->
<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>5.8.16</version>
</dependency>

分布式鎖工具類(Redisson)

@Component
public class RedissonLockUtil {

    @Resource
    private RedissonClient redissonClient;

    /**
     * 嘗試獲取分布式鎖
     * @param lockKey 鎖的key(建議用任務ID)
     * @param waitTime 等待時間(毫秒)
     * @param leaseTime 鎖的自動釋放時間(毫秒)
     * @return 是否獲取成功
     */
    public boolean tryLock(String lockKey, long waitTime, long leaseTime) {
        RLock lock = redissonClient.getLock(lockKey);
        try {
            // 嘗試獲取鎖,等待waitTime毫秒,獲取成功后leaseTime毫秒自動釋放
            return lock.tryLock(waitTime, leaseTime, TimeUnit.MILLISECONDS);
        } catch (InterruptedException e) {
            returnfalse;
        }
    }

    /**
     * 釋放分布式鎖
     * @param lockKey 鎖的key
     */
    public void unlock(String lockKey) {
        RLock lock = redissonClient.getLock(lockKey);
        if (lock.isHeldByCurrentThread()) {
            lock.unlock();
        }
    }
}

任務模型與 Redis 存儲

任務模型
@Data
public class ScheduledTask implements Serializable {
    // 任務唯一ID(UUID生成)
    private String taskId;
    // 任務類型(如ORDER_TIMEOUT:訂單超時)
    private String taskType;
    // 任務參數(JSON格式,如{"orderId": "123456"})
    private String taskParam;
    // 任務延遲時間(毫秒)
    private long delayMs;
    // 任務提交時間
    private Date submitTime;
    // 任務預計執行時間
    private Date executeTime;
}
Redis 存儲工具類
@Component
public class TaskRedisUtil {

    @Resource
    private StringRedisTemplate stringRedisTemplate;

    // Redis key前綴(避免key沖突)
    private static final String TASK_KEY_PREFIX = "scheduled:task:";

    /**
     * 存儲任務到Redis
     * @param task 任務對象
     * @param expireMs 過期時間(毫秒,避免Redis內存溢出)
     */
    public void saveTask(ScheduledTask task, long expireMs) {
        String key = TASK_KEY_PREFIX + task.getTaskId();
        String taskJson = JSONUtil.toJsonStr(task);
        stringRedisTemplate.opsForValue().set(key, taskJson, expireMs, TimeUnit.MILLISECONDS);
    }

    /**
     * 從Redis獲取任務
     * @param taskId 任務ID
     * @return 任務對象(null表示不存在)
     */
    public ScheduledTask getTask(String taskId) {
        String key = TASK_KEY_PREFIX + taskId;
        String taskJson = stringRedisTemplate.opsForValue().get(key);
        if (taskJson == null) {
            return null;
        }
        return JSONUtil.toBean(taskJson, ScheduledTask.class);
    }

    /**
     * 從Redis刪除任務(任務執行完成后)
     * @param taskId 任務ID
     */
    public void deleteTask(String taskId) {
        String key = TASK_KEY_PREFIX + taskId;
        stringRedisTemplate.delete(key);
    }
}

時間輪調度器實現

基于Netty HashedWheelTimer實現時間輪調度器,核心邏輯是:

  • 接收任務,計算任務的延遲時間。
  • 將任務提交到時間輪,設置延遲觸發。
  • 任務觸發時,先獲取Redis分布式鎖,確保唯一執行。
  • 執行任務邏輯,執行完成后刪除Redis中的任務和鎖。
@Component
public class TimeWheelScheduler {

    // 時間輪實例(單例)
    private HashedWheelTimer hashedWheelTimer;

    // 任務執行線程池(避免任務執行阻塞時間輪)
    private ExecutorService taskExecutor;

    @Resource
    private RedissonLockUtil redissonLockUtil;

    @Resource
    private TaskRedisUtil taskRedisUtil;

    @Resource
    private TaskExecutor taskExecutorService; // 自定義任務執行器

    // 初始化時間輪和線程池
    @PostConstruct
    public void init() {
        // 時間輪配置:1秒/tick,60個槽位,最大覆蓋60秒
        hashedWheelTimer = new HashedWheelTimer(
                Executors.defaultThreadFactory(),
                1000, // tickDuration:1000毫秒(1秒)
                TimeUnit.MILLISECONDS,
                60 // ticksPerWheel:60個槽位
        );

        // 任務執行線程池:核心線程數=CPU核心數,最大線程數=2*CPU核心數
        int corePoolSize = Runtime.getRuntime().availableProcessors();
        taskExecutor = Executors.newFixedThreadPool(corePoolSize * 2);
    }

    /**
     * 提交任務到時間輪
     * @param task 定時任務
     */
    public void submitTask(ScheduledTask task) {
        // 1. 計算任務延遲時間(如果任務已過期,直接執行)
        long delayMs = task.getDelayMs();
        if (delayMs < 0) {
            delayMs = 0;
        }

        // 2. 存儲任務到Redis(過期時間=延遲時間+30秒,避免任務未執行就被刪除)
        taskRedisUtil.saveTask(task, delayMs + 30 * 1000);

        // 3. 將任務提交到時間輪
        hashedWheelTimer.newTimeout(new TimerTask() {
            @Override
            public void run(Timeout timeout) throws Exception {
                // 4. 任務觸發時,提交到線程池執行(避免阻塞時間輪)
                taskExecutor.submit(() -> executeTask(task));
            }
        }, delayMs, TimeUnit.MILLISECONDS);
    }

    /**
     * 執行任務(帶分布式鎖)
     * @param task 定時任務
     */
    private void executeTask(ScheduledTask task) {
        String taskId = task.getTaskId();
        String lockKey = "scheduled:lock:" + taskId;

        try {
            // 1. 嘗試獲取分布式鎖(等待1秒,自動釋放30秒)
            boolean lockSuccess = redissonLockUtil.tryLock(lockKey, 1000, 30 * 1000);
            if (!lockSuccess) {
                // 鎖獲取失敗,說明其他節點已執行該任務
                return;
            }

            // 2. 再次從Redis獲取任務(避免任務已被刪除)
            ScheduledTask redisTask = taskRedisUtil.getTask(taskId);
            if (redisTask == null) {
                return;
            }

            // 3. 執行具體的業務邏輯(調用自定義任務執行器)
            taskExecutorService.execute(redisTask);

            // 4. 任務執行完成,刪除Redis中的任務
            taskRedisUtil.deleteTask(taskId);

        } catch (Exception e) {
            // 任務執行失敗,可記錄日志并進行重試
        } finally {
            // 5. 釋放分布式鎖
            redissonLockUtil.unlock(lockKey);
        }
    }

    // 銷毀時間輪和線程池(應用關閉時)
    @PreDestroy
    public void destroy() {
        if (hashedWheelTimer != null) {
            hashedWheelTimer.stop();
        }
        if (taskExecutor != null) {
            taskExecutor.shutdown();
        }
    }
}

任務執行器(業務邏輯)

@Component
public class OrderTimeoutTaskExecutor implements TaskExecutor {

    // 任務類型(與ScheduledTask的taskType對應)
    public static final String TASK_TYPE = "ORDER_TIMEOUT";

    @Override
    public void execute(ScheduledTask task) {
        // 1. 校驗任務類型
        if (!TASK_TYPE.equals(task.getTaskType())) {
            return;
        }

        // 2. 解析任務參數(JSON → Map)
        String taskParam = task.getTaskParam();
        Map<String, String> paramMap = JSONUtil.toBean(taskParam, Map.class);
        String orderId = paramMap.get("orderId");
        if (orderId == null) {
            return;
        }

        // 3. 執行訂單超時邏輯(如關閉訂單、退還庫存等)
        System.out.println("執行訂單超時處理:orderId=" + orderId);
        // TODO: 調用訂單服務的關閉接口
    }
}

任務執行器工廠(根據任務類型選擇執行器)

@Component
public class TaskExecutorFactory {

    // 存儲任務類型與執行器的映射
    private final Map<String, TaskExecutor> executorMap = new HashMap<>();

    // 注入所有TaskExecutor實現類(Spring會自動收集)
    @Resource
    public void setExecutorMap(Map<String, TaskExecutor> executorMap) {
        this.executorMap.clear();
        // 遍歷所有執行器,將“任務類型”作為key存入map
        for (TaskExecutor executor : executorMap.values()) {
            if (executor instanceof OrderTimeoutTaskExecutor) {
                this.executorMap.put(OrderTimeoutTaskExecutor.TASK_TYPE, executor);
            }
            // TODO: 其他任務類型的執行器(如日志清理)
        }
    }

    /**
     * 根據任務類型獲取執行器
     * @param taskType 任務類型
     * @return 任務執行器(null表示無匹配)
     */
    public TaskExecutor getExecutor(String taskType) {
        return executorMap.get(taskType);
    }
}


責任編輯:武曉燕 來源: 一安未來
相關推薦

2025-08-01 08:47:45

2025-07-28 01:12:00

2022-03-23 11:45:39

Quartz數據庫節點

2025-09-18 07:45:55

2024-02-19 00:00:00

分布式定時任務框架

2022-08-09 08:40:37

框架分布式定時任務

2022-03-28 07:51:25

分布式定時任務

2025-11-11 07:51:00

2023-01-04 09:23:58

2022-03-17 09:55:05

架構分布式選型

2022-03-07 11:20:01

分布式代碼微服務

2019-11-12 09:32:39

分布式elastic-job分片

2024-10-10 10:32:04

2024-10-15 16:41:35

2025-10-09 07:47:04

2012-02-07 13:31:14

SpringJava

2022-01-04 11:15:02

Spring Boot任務阻塞

2025-01-08 09:55:37

Spring接口數據庫

2025-06-04 01:00:00

2020-07-15 16:50:57

Spring BootRedisJava
點贊
收藏

51CTO技術棧公眾號

亚洲在线视频播放| 亚洲精品99久久久久| 日韩一区二区福利| 男人添女荫道口图片| 在线视频免费观看一区| 中文字幕av亚洲精品一部二部| 国产日产欧美一区| 97色伦亚洲国产| 亚洲成a人无码| 中日韩高清电影网| 久久国产精品亚洲人一区二区三区 | 亚洲自拍第三页| 国产三级在线观看| 欧美亚洲网站| 亚洲男女性事视频| 亚洲国产精品久久久久婷蜜芽| 欧美一级免费片| 亚洲美女网站| 亚洲黄色有码视频| 九九热精品在线播放| 亚洲欧美视频一区二区| 美女一区二区久久| 最近的2019中文字幕免费一页| 一区二区三区入口| 欧美私人网站| 国产精品系列在线观看| 久久99热这里只有精品国产| 亚洲少妇中文字幕| 欧美成人家庭影院| 亚洲欧美在线高清| 91免费人成网站在线观看18| 亚洲一级生活片| 538任你躁精品视频网免费| 亚洲国产视频一区| 欧美日韩亚洲一区二区三区四区| 亚洲GV成人无码久久精品| 国产亚洲第一伦理第一区| 在线视频一区二区三区| 不卡中文字幕在线| 精品人妻无码一区二区三区蜜桃一 | 亚洲人体视频| 国产三级欧美三级日产三级99| 国产欧美日韩伦理| 青青视频在线免费观看| 久久影视一区| 欧美一二三在线| 国产精品专区在线| av在线女优影院| 国产精品123区| 1769国内精品视频在线播放| 99精品欧美一区二区| 亚洲欧美在线人成swag| 亚洲国产乱码最新视频| av电影一区二区三区| 欧洲av在线播放| 成人在线视频首页| 国产精品免费在线免费| 免费在线黄色片| 欧美极品中文字幕| 6080亚洲精品一区二区| 精品少妇在线视频| av成人福利| 中文字幕在线观看一区| 狠狠色噜噜狠狠狠狠色吗综合| 无码人妻aⅴ一区二区三区有奶水| 国产日韩一区| 欧美成人激情在线| 精品人妻无码一区二区三区| 国产一区一区| 欧美综合一区二区| 无限资源日本好片| 不卡一区视频| 日韩限制级电影在线观看| 女人扒开双腿让男人捅| 成人在线视频观看| 精品magnet| av不卡在线免费观看| 成人在线播放| 国产精品亲子乱子伦xxxx裸| 激情五月综合色婷婷一区二区| 免费国产精品视频| 久久久不卡影院| 精品国产一区二区三区麻豆免费观看完整版| 天天操天天干天天爱| 国产一区二区免费看| 国产精品第100页| 国产精品18p| 久久久久久美女精品 | 风韵丰满熟妇啪啪区老熟熟女| 日韩网站中文字幕| 天天操天天综合网| 丝袜制服一区二区三区| 正在播放日韩精品| 欧美日韩高清一区二区不卡| 最近免费中文字幕中文高清百度| 韩国日本一区| 一区二区理论电影在线观看| 一区二区三区|亚洲午夜| 黄网在线观看| 久久久久国产一区二区三区四区| 亚洲高清视频一区| www.黄在线观看| 亚洲国产精品久久不卡毛片 | www.26天天久久天堂| 日韩美女主播在线视频一区二区三区| 国模私拍视频在线观看| 午夜av成人| 在线观看成人小视频| 国产一级片中文字幕| 精品国产三区在线| 日韩一区二区在线免费观看| 91传媒视频免费| heyzo亚洲| 日韩亚洲精品视频| 免费精品在线视频| 免费欧美视频| 欧美丰满少妇xxxxx| 清纯粉嫩极品夜夜嗨av| 日韩av电影天堂| 国产精品高清免费在线观看| 亚洲欧美国产高清va在线播放| 国产精品一区二区在线观看不卡 | 亚洲天堂av一区| 亚洲午夜精品久久| 亚洲少妇视频| 亚洲成成品网站| 水蜜桃av无码| 你懂的视频欧美| 久久久久久这里只有精品| 亚洲国产精品午夜在线观看| 国产日韩亚洲欧美精品| av蓝导航精品导航| 亚洲av电影一区| 久久精品一级爱片| 日本少妇高潮喷水视频| 亚洲人体视频| 日韩av在线影院| 成人性生交大片免费看无遮挡aⅴ| 91麻豆精品国产91久久久平台| 51午夜精品视频| 亚洲精品91天天久久人人| 久久精品国产77777蜜臀| 97超碰人人看人人| 国产盗摄在线观看| 欧美精品日韩精品| 国产xxxx视频| 亚洲香蕉网站| 久久99亚洲热视| 99热精品在线播放| 91视频xxxx| 香蕉视频在线网址| 欧美大片网站| 久久亚洲成人精品| wwwxxx亚洲| 国产在线精品免费av| 欧美亚洲视频一区| 国产精品777777在线播放| 久久精品亚洲一区| 91在线视频在线观看| 精品亚洲成a人| 久久99导航| 成人免费看片| 欧美一级国产精品| 亚洲国产精一区二区三区性色| 粉嫩高潮美女一区二区三区| 日韩欧美一区二区视频在线播放| 欧美aaaaaaa| 欧美日韩一区成人| 蜜臀av一区二区三区有限公司| 国产精品二区不卡| 日韩美女免费线视频| 亚洲经典一区二区三区| 中文久久乱码一区二区| 免费看国产曰批40分钟| 亚洲人成网亚洲欧洲无码| 欧美夫妻性生活xx| 五月婷婷在线播放| 欧洲另类一二三四区| xxxx日本少妇| 精品一区二区三区香蕉蜜桃 | 亚洲三级网址| 国产精品视频在线观看| 天天综合天天色| 91官网在线观看| 国产精品三级在线观看无码| 肉色丝袜一区二区| 久久综合久久久| av丝袜在线| 亚洲最大中文字幕| 狠狠狠狠狠狠狠| 久久久久久久久岛国免费| 日本高清久久久| 国产精品啊啊啊| 欧洲高清一区二区| 小视频免费在线观看| 日韩中文字幕网址| 午夜av免费观看| 欧美人狂配大交3d怪物一区| 四虎永久在线精品| 国产精品久久久久桃色tv| 艳妇乳肉亭妇荡乳av| 欧美日韩一卡| 91视频免费进入| 香蕉视频亚洲一级| 亚洲欧洲在线观看| 男人天堂视频网| 亚洲午夜久久久久久久久久久| 一级片免费在线观看视频| 国产精品亚洲综合色区韩国| av动漫免费观看| 精品国产一区探花在线观看| 国产精品jizz在线观看麻豆| 99免在线观看免费视频高清| 欧美午夜宅男影院| 人与动物性xxxx| 黑人精品欧美一区二区蜜桃| 国产91在线视频观看| 欧美成人一品| 岛国视频一区| 免费成人在线电影| 亚洲欧美制服另类日韩| 亚洲国产精品国自产拍久久| 欧美性大战久久| 青青青国产在线 | 无码视频在线观看| 午夜精品国产更新| 3d动漫精品啪啪一区二区下载| 福利视频网站一区二区三区| 日韩视频在线观看一区二区三区| 日韩—二三区免费观看av| 欧美日本视频在线观看| 欧美三区不卡| 91网站在线观看免费| 日韩欧美影院| 国产精品高潮呻吟久久av无限 | 999久久久国产精品| 日韩精品大片| 精品精品久久| 色一情一乱一伦一区二区三欧美| 欧美高清影院| 国产精品毛片a∨一区二区三区|国 | 国产视频一区在线观看| av网站免费在线看| 国产在线一区观看| 四季av一区二区三区| 久久91精品久久久久久秒播| 男操女免费网站| 麻豆视频观看网址久久| 午夜免费看毛片| 狠狠色丁香九九婷婷综合五月| 色综合天天色综合| 久久超碰97中文字幕| 欧美日韩精品区别| aa国产精品| 久草青青在线观看| 午夜精品av| 老子影院午夜伦不卡大全| 国产一区日韩| 日韩精品极品视频在线观看免费| 国产精品自拍区| 在线观看欧美亚洲| 香蕉视频一区二区三区| 欧美精品欧美精品系列c| 国产精品视频一区二区三区四蜜臂| 茄子视频成人在线观看 | 国产一区二区三区免费观看在线| 91夜夜未满十八勿入爽爽影院| 欧美午夜网站| 国产日韩在线一区二区三区| 亚洲日本三级| 超碰成人在线免费观看| 亚洲经典自拍| 最新不卡av| 欧美视频在线观看| 黄色片久久久久| 久久精品免费观看| 麻豆短视频在线观看| 91啪亚洲精品| 人人干在线观看| 亚洲国产欧美在线| а中文在线天堂| 日韩午夜激情av| 青青久草在线| 亚洲黄在线观看| 在线国产情侣| 久久免费福利视频| 欧美另类tv| 26uuu久久噜噜噜噜| 狂野欧美性猛交xxxx| 国产女主播一区二区| 国产尤物久久久| 一卡二卡三卡视频| 久久精品国产第一区二区三区 | 97成人超碰视| 风韵丰满熟妇啪啪区老熟熟女| 99re66热这里只有精品3直播| 自拍偷拍你懂的| 国产精品不卡一区二区三区| 久青草视频在线观看| 一区二区在线免费观看| 国产真实乱在线更新| 无码av免费一区二区三区试看| 少妇无套内谢久久久久| 精品国产凹凸成av人网站| 亚洲av无码专区在线| 亚洲人成电影在线| 男女在线视频| 亚洲一区二区三区香蕉| 欧美一区在线观看视频| 97碰碰视频| 日本精品三区| 欧美aaa在线观看| 亚洲一区国产| 不许穿内裤随时挨c调教h苏绵| 欧美国产日韩在线观看| 国产三级黄色片| 欧美视频一区二区三区…| av片免费观看| 亚洲激情在线观看视频免费| 手机av免费在线| 91chinesevideo永久地址| 国产麻豆一区二区三区| 图片区小说区区亚洲五月| 亚洲一区二区网站| 亚洲精品激情视频| 久久亚洲精精品中文字幕早川悠里| jizz欧美性20| 国产精品免费av| 无码任你躁久久久久久久| 日韩精品视频观看| 成人观看网址| 国产精品视频播放| 久久不见久久见中文字幕免费| youjizz.com在线观看| 宅男噜噜噜66国产日韩在线观看| 日韩精品视频网址| 亚洲欧美偷拍另类a∨色屁股| 国产情侣免费视频| 亚洲午夜精品久久久久久性色| 欧美激情免费| 国产在线a不卡| 精品成人自拍视频| 色视频一区二区三区| 全部av―极品视觉盛宴亚洲| 91网站免费入口| 在线欧美一区二区| av在线免费观看网| 国产日韩精品综合网站| 三级电影一区| 久久久久久久久久一区| 亚洲日本欧美天堂| 精品国产av一区二区| 欧美国产日本高清在线| www国产精品| 色99中文字幕| 久久99精品国产.久久久久| 美女视频久久久| 日韩欧美一区二区久久婷婷| 欧美卡一卡二| 久久一区免费| 日韩不卡手机在线v区| 国产又黄又粗又猛又爽的| 欧美欧美欧美欧美| 国产网红女主播精品视频| 国产亚洲第一区| 美女国产一区| 制服丝袜在线第一页| 精品久久久中文| 精品欧美不卡一区二区在线观看 | 国产午夜精品久久久久| 最新国产精品拍自在线播放| 精品国产亚洲一区二区三区大结局| 欧美黄色免费网址| 91视频你懂的| 亚洲一区二区三区高清视频| 欧美另类极品videosbest最新版本| www.久久东京| www.99av.com| 亚洲国产精品尤物yw在线观看| 亚洲av电影一区| 国产欧美一区二区三区视频| 国产精品a久久久久| 亚洲AV无码国产成人久久| 制服丝袜中文字幕一区| 性国产高清在线观看| 日本在线播放一区| 国产一区二区精品久久91| 日韩成人一区二区三区| 中文字幕日韩免费视频| 91精品韩国| 加勒比海盗1在线观看免费国语版| 久久99精品视频| 亚洲一区 视频| 久久精品国产v日韩v亚洲 | 日韩禁在线播放| 亚洲国产天堂| 一区二区日本伦理| 久久综合色婷婷| 精品人妻无码一区二区| 国产精品免费一区豆花|