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

亚洲欧美激情在线观看| 国产免费a级片| 午夜精品一区| 国产高清在线精品| 欧美一级大片在线免费观看| 日本高清黄色片| 亚洲一区二区三区免费| 日韩欧美在线免费观看| 一区二区免费在线视频| 手机av在线免费观看| 蜜臀av性久久久久蜜臀aⅴ| 久操成人在线视频| www.99热| 美女视频免费精品| 7777精品伊人久久久大香线蕉经典版下载 | 8x海外华人永久免费日韩内陆视频| 成人性生交大免费看| 日韩精品视频在线看| 日本高清不卡视频| 蜜臀av无码一区二区三区| 男人资源在线播放| 久久久国产精品不卡| yellow视频在线观看一区二区| 亚洲精品久久久久久久蜜桃| 亚洲性色视频| 久久这里只有精品视频首页| 97超碰在线资源| 国产一区在线电影| 日韩一级免费一区| 最新免费av网址| 最新日韩一区| 色综合久久综合| 国产精品久久中文字幕| av免费在线观看网站| 国产精品沙发午睡系列990531| 黄色91av| 无套内谢的新婚少妇国语播放| 国产一区999| 国产日韩在线免费| 在线观看国产成人| 麻豆国产精品官网| 国产精品中文字幕在线| 国产主播第一页| 媚黑女一区二区| 欧美一性一乱一交一视频| 欧美成人三级视频| 欧美福利视频| 欧美丰满少妇xxxxx| 黄色片在线观看网站| 97久久视频| 久久成人18免费网站| 91高清免费看| 欧美日本一区二区视频在线观看| 久久精品最新地址| 26uuu成人网| 中文字幕午夜精品一区二区三区| 欧美成人在线免费| 久久亚洲成人av| 在线精品一区| 欧亚精品在线观看| 青娱乐在线免费视频| 日韩va欧美va亚洲va久久| 国产精品美乳一区二区免费| 中文字幕av片| 国产精品一区二区三区乱码| 国产精品久久国产三级国电话系列| 亚洲精品一区二区三区新线路 | 三上悠亚ssⅰn939无码播放| 亚洲另类春色校园小说| 亚洲天堂影视av| 国产三级精品三级观看| 你懂的国产精品永久在线| 久久69精品久久久久久久电影好| 国产一级淫片免费| 欧美亚洲专区| 国产在线播放不卡| 亚洲精品一区二区三区区别| 久久亚洲一区二区三区明星换脸| 日韩免费电影一区二区| 尤物在线视频| 亚洲午夜久久久久久久久久久| 18岁网站在线观看| 日本在线中文字幕一区二区三区| 欧美一区二区三区免费大片 | 99精品在线看| 91亚洲精品久久久蜜桃网站 | 黄色精品免费| 日韩av电影在线免费播放| 中国老头性行为xxxx| 国产精品888| 欧美日韩亚洲免费| 超碰在线观看免费版| 午夜欧美2019年伦理| 国产一二三区av| 超碰成人福利| 日韩在线精品一区| 国产成人精品亚洲男人的天堂| 石原莉奈在线亚洲三区| aa成人免费视频| 成人午夜影视| 天天爽夜夜爽夜夜爽精品视频| 杨幂毛片午夜性生毛片| 激情小说亚洲色图| 久久亚洲综合国产精品99麻豆精品福利| 日韩精品久久久久久久| 精品一区二区三区在线观看国产| 久久久久久高清| 在线观看小视频| 在线观看不卡视频| 国产精品麻豆入口| 欧美91大片| 国产精品香蕉在线观看| 色播色播色播色播色播在线 | 玖玖玖视频精品| 亚洲欧洲成视频免费观看| 91成人福利视频| 久久精品99国产精品日本| 久久99欧美| 午夜av在线免费观看| 欧美色精品在线视频| 国产在线观看无码免费视频| 午夜久久美女| 91视频九色网站| 在线观看国产原创自拍视频| 精品久久中文字幕| 亚洲国产精品第一页| 欧美好骚综合网| 国产精品www| 欧美男男同志| 欧美三级免费观看| 一级国产黄色片| 伊人成人在线| 国产亚洲欧美一区二区三区| 调教一区二区| 日韩欧美一级精品久久| 色老板免费视频| 久久国产夜色精品鲁鲁99| 欧美一区二区三区四区在线观看地址 | 伊人久久综合影院| 欧美一级大片视频| 欧美拍拍视频| 色婷婷综合中文久久一本| av直播在线观看| 久久福利影视| 日韩精品不卡| jvid一区二区三区| 日韩在线视频免费观看高清中文| 影音先锋黄色网址| 国产精品第一页第二页第三页| jizzzz日本| 天天做天天爱天天综合网| 成人国产精品久久久| 免费av网站在线看| 日韩亚洲欧美在线观看| 精品无码人妻一区二区三区品| 成人美女视频在线观看| 5月婷婷6月丁香| 色综合综合网| 国产精品亚发布| 在线中文字幕视频观看| 精品不卡在线视频| 99久热在线精品996热是什么| 久久亚洲精华国产精华液 | 国产精品综合二区| 免费视频爱爱太爽了| 欧美电影完整版在线观看| 欧洲午夜精品久久久| 超碰国产在线观看| 91精品一区二区三区在线观看| 免费一级片在线观看| 99久久免费视频.com| 久久久精品三级| 一区二区影院| 国产精品嫩草在线观看| 巨茎人妖videos另类| 中文字幕欧美精品日韩中文字幕| 国产精品久久久久久在线| 亚洲一区二区在线视频| 国产呦小j女精品视频| 久久国产夜色精品鲁鲁99| 日本一本中文字幕| 精品国产精品久久一区免费式| 91精品在线一区| 蜜臀久久精品| 久久久精品欧美| 青青草视频在线观看| 欧美精品自拍偷拍动漫精品| 精品午夜福利视频| 中文乱码免费一区二区 | 日本一区二区三区久久久久久久久不 | 国产精品视频一区在线观看| 成人免费在线视频| 懂色av粉嫩av蜜乳av| 美女在线观看视频一区二区| 91成人综合网| 国产一区毛片| 国产亚洲欧美一区二区三区| 四虎在线精品| 欧美在线激情网| 羞羞视频在线免费国产| 亚洲人成网站777色婷婷| 午夜精品久久久久久久第一页按摩| 欧美性猛交99久久久久99按摩| 日本爱爱小视频| 久久久夜色精品亚洲| www日本在线观看| 久久国产精品露脸对白| 欧美日韩在线不卡视频| 国产精品theporn| 桥本有菜av在线| 国产精品一区高清| 国产一区二区三区免费不卡| 四虎国产精品免费久久5151| 热99精品里视频精品| 久草在线视频资源| 久久香蕉频线观| 丁香婷婷在线观看| 国产午夜精品理论片a级探花| 精品人妻一区二区三区浪潮在线 | 日本中文字幕久久看| 欧美xxx黑人xxx水蜜桃| 色99之美女主播在线视频| 色鬼7777久久| 日韩精品视频在线播放| 欧美自拍第一页| 欧美第一区第二区| 国产精品一品二区三区的使用体验| 欧美中文字幕一区| 久久人妻免费视频| 色综合天天综合在线视频| 特一级黄色大片| 亚洲国产精品久久一线不卡| 欧美成人黄色网| 一区二区三区中文字幕电影 | 91在线不卡| 国产午夜精品视频| 黄色av免费在线观看| 亚洲精品自拍视频| 日本大片在线观看| 日韩精品在线观看视频| 四虎成人免费在线| 亚洲国内高清视频| 欧美美女搞黄| 亚洲人免费视频| 成年人在线观看| 中文字幕不卡在线视频极品| 91短视频版在线观看www免费| 国产一区二区三区丝袜| 成人免费视频| 久久影视电视剧免费网站| 国产原创精品视频| 欧美激情日韩图片| 国产一二在线播放| 欧美孕妇与黑人孕交| 巨茎人妖videos另类| 国产精品美女久久| 国产精品美女久久久久| 99久久久精品免费观看国产| 成人精品动漫一区二区三区| 国产在线精品二区| 国产欧美日韩| 91免费网站视频| 欧美日本免费| 午夜精品久久久内射近拍高清| 日韩精品亚洲一区| 亚洲黄色片免费看| av电影在线观看一区| 精品人妻中文无码av在线| 中文字幕在线不卡一区二区三区| 一区二区在线观看免费视频| 亚洲综合久久av| 亚洲熟妇无码乱子av电影| 欧美日韩在线综合| 亚洲精华国产精华精华液网站| 亚洲激情久久久| 一区二区高清不卡| 欧美激情一二区| 怡红院红怡院欧美aⅴ怡春院| 性色av一区二区三区| 本网站久久精品| 国产精品视频免费一区| 精品国精品国产自在久国产应用 | www.黄色com| 图片区小说区区亚洲影院| 超碰在线97观看| www.爱久久.com| 一卡二卡三卡四卡| 亚洲色图视频网| 91video| 制服丝袜中文字幕亚洲| 熟妇人妻系列aⅴ无码专区友真希| 亚洲天堂免费在线| 丰乳肥臀在线| 国产美女精品视频| 羞羞答答一区二区| 亚洲av首页在线| 日日摸夜夜添夜夜添精品视频 | 麻豆视频久久| 日本一区视频在线| 亚洲日本激情| 欧美激情第一区| 久久久亚洲欧洲日产国码αv| 东方av正在进入| 欧洲亚洲精品在线| 丰满人妻一区二区三区免费视频 | 日本一卡二卡在线播放| 亚洲国产一区视频| 国产熟女一区二区三区五月婷| 亚洲美女性生活视频| 欧美aaaaaaa| 成人黄色av播放免费| 亚洲自拍电影| 久久国产精品网| 国产成人午夜电影网| 小嫩苞一区二区三区| 91久久香蕉国产日韩欧美9色| 懂色av一区二区三区四区| 精品国模在线视频| 成人精品国产亚洲| 欧美日韩喷水| 免费中文字幕日韩欧美| 欧美夫妇交换xxx| 亚洲午夜激情av| 亚洲精品久久久久久久久久久久久久 | 欧美成人猛片aaaaaaa| 免费黄色网页在线观看| 国产精品久久久久av| 国产99久久精品一区二区300| 日韩a∨精品日韩在线观看| 国产精品一级片在线观看| 国产一区第一页| 欧美日韩综合在线| 懂色一区二区三区| 国产美女直播视频一区| 成人无号精品一区二区三区| 欧美性猛交久久久乱大交小说 | 日韩精品在线第一页| 国产精品电影| 蜜桃传媒视频第一区入口在线看| 亚洲黄色av| 尤物网站在线观看| 欧美日韩免费看| 欧美一区二区少妇| 日韩av电影免费观看高清| 奇米亚洲欧美| 欧美日韩一区二区三区69堂| 国产精品久久久久毛片软件| 中文字幕永久在线观看| 日韩中文视频免费在线观看| 日韩免费在线电影| 真人做人试看60分钟免费| 国产精品77777| 日韩精品无码一区二区| 日韩精品极品在线观看| 性感美女一区二区在线观看| 色一情一乱一伦一区二区三欧美| 青青草国产成人99久久| 日本一级片免费| 精品奇米国产一区二区三区| av手机在线观看| 欧美久久电影| 毛片av一区二区| 激情综合网五月天| 亚洲精品久久久久国产| 日韩av超清在线观看| 椎名由奈jux491在线播放 | 国产在线一卡二卡| 亚洲成人免费在线视频| 在线视频cao| 亚洲最大免费| 99精品国产一区二区三区不卡| 日韩在线播放中文字幕| 久久精品视频亚洲| 国产suv精品一区| 日韩精品一区中文字幕| 亚洲麻豆国产自偷在线| 视频福利在线| 成人av电影天堂| 中国女人久久久| а天堂中文在线资源| 精品99一区二区| 99久久er| 黄色一级视频在线播放| 中文字幕成人网| 欧美在线 | 亚洲| 国产日韩精品在线播放| 亚洲高清免费| 午夜三级在线观看| 亚洲乱码国产乱码精品精天堂| 欧美videos粗暴| 欧美亚洲另类色图| 亚洲另类中文字| 毛片免费在线观看| 粉嫩精品一区二区三区在线观看| 视频在线观看一区| 久久精品性爱视频| 久久精品国产亚洲| 国精一区二区| 青青草成人免费视频| 日韩一区和二区|