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

訂單 30 分鐘未支付就自動取消?這五個狠招幫你搞定!

開發 前端
訂單 30 分鐘未支付自動取消這個功能,看似簡單,背后卻有很多技術細節需要考慮。從簡單的數據庫輪詢到復雜的分布式定時器,每種方案都有自己的適用場景和優缺點。大家在實際開發中,要根據自己的系統情況選擇合適的方案,同時注意冪等性、事務處理、性能優化和監控報警等問題。
兄弟們,不知道大家有沒有這樣的經歷:點外賣時選了半天,最后糾結癥發作沒付款,過一會兒再看訂單居然自己消失了;網上購物時加入購物車一頓操作,結果有事耽擱沒付錢,回來發現訂單 “不翼而飛”。其實這背后藏著一個重要的技術需求 —— 訂單 30 分鐘未支付自動取消。今天咱就來聊聊怎么用技術手段搞定這個需求,讓你的系統也能像這些大廠一樣智能。

一、先搞明白需求本質

咱先不著急上代碼,先把需求掰扯清楚。訂單自動取消功能,核心就是在訂單創建后的 30 分鐘內,如果用戶沒完成支付,系統就自動把這個訂單關掉。這里面有幾個關鍵點得注意:

  1. 時間準確性:必須嚴格在 30 分鐘后執行取消操作,不能早也不能晚,不然用戶體驗可就不好了。比如用戶剛付完錢,訂單就被取消了,那不得罵娘。
  2. 可靠性:不管系統是高峰期還是低谷期,都得保證該取消的訂單一定能取消,不能漏掉任何一個。要是有訂單沒取消,可能會導致庫存錯誤、資金結算異常等問題。
  3. 性能影響:不能因為這個功能把系統搞得卡頓,尤其是在訂單量大的時候,得考慮如何高效地處理這些定時任務。

二、五大狠招逐個解析

狠招一:數據庫輪詢 —— 簡單直接但有點笨的辦法

這是最容易想到的辦法,就像班主任盯著全班學生抄作業一樣,定時去數據庫里查一遍所有未支付的訂單,看看有沒有超過 30 分鐘的,有的話就取消。

實現步驟

  1. 建一張訂單表,里面得有訂單狀態(比如未支付、已支付、已取消)、創建時間等字段。
  2. 寫一個定時任務,比如用 Spring 的 @Scheduled 注解,每隔一段時間(比如 1 分鐘)就去數據庫查詢一次狀態為未支付且創建時間超過 30 分鐘的訂單。
  3. 對查詢出來的訂單執行取消操作,更新訂單狀態,可能還需要釋放庫存、發送通知等。

代碼示例

@Service
public class OrderCancelService {
    @Autowired
    private OrderRepository orderRepository;
    @Scheduled(fixedRate = 60 * 1000) // 每分鐘執行一次
    public void cancelUnpaidOrders() {
        Date thirtyMinutesAgo = new Date(System.currentTimeMillis() - 30 * 60 * 1000);
        List<Order> unpaidOrders = orderRepository.findByStatusAndCreateTimeBefore(OrderStatus.UNPAID, thirtyMinutesAgo);
        for (Order order : unpaidOrders) {
            // 執行取消邏輯
            order.setStatus(OrderStatus.CANCELED);
            // 釋放庫存等操作
            releaseStock(order);
            // 發送通知
            sendCancelNotification(order);
            orderRepository.save(order);
        }
    }
    private void releaseStock(Order order) {
        // 具體庫存釋放邏輯
    }
    private void sendCancelNotification(Order order) {
        // 發送短信、APP通知等邏輯
    }
}

優缺點分析

  • 優點:簡單易懂,不需要引入額外的中間件,對于小型系統來說,快速就能實現。
  • 缺點:太笨了!定時任務的間隔不好把握,間隔短了會頻繁查詢數據庫,影響性能;間隔長了又可能導致訂單取消不及時。而且如果訂單量很大,每次查詢都可能是全表掃描,數據庫壓力山大,就像讓一個小學生去搬一堆磚,累得氣喘吁吁。

狠招二:JDK 自帶定時器 —— 稍微聰明一點的本地方案

Java 自帶了一個 Timer 類,可以實現定時任務,相當于在本地搞了個小鬧鐘,到時間就提醒系統去取消訂單。

實現原理

Timer 類可以安排 TimerTask 任務在指定的時間執行,或者周期性地執行。我們可以在訂單創建的時候,啟動一個 Timer,讓它在 30 分鐘后執行訂單取消任務。

實現步驟

  1. 訂單創建時,獲取訂單的創建時間,計算出 30 分鐘后的執行時間。
  2. 創建一個 TimerTask 任務,在 run 方法里實現訂單取消邏輯。
  3. 通過 Timer 的 schedule 方法,把任務安排在計算好的時間執行。

代碼示例

public class OrderService {
    private Timer timer = new Timer("OrderCancelTimer");
    public void createOrder(Order order) {
        // 保存訂單到數據庫
        saveOrder(order);
        // 安排取消任務
        scheduleCancelTask(order);
    }
    private void scheduleCancelTask(Order order) {
        long delay = 30 * 60 * 1000; // 30分鐘
        TimerTask task = new TimerTask() {
            @Override
            public void run() {
                // 檢查訂單狀態,防止重復取消或已支付的情況
                Order existingOrder = getOrderById(order.getId());
                if (existingOrder.getStatus() == OrderStatus.UNPAID) {
                    cancelOrder(existingOrder);
                }
            }
        };
        timer.schedule(task, delay);
    }
    private void cancelOrder(Order order) {
        // 執行取消邏輯,更新數據庫等
    }
}

優缺點分析

  • 優點:比數據庫輪詢更精準,每個訂單都有自己的 “鬧鐘”,到時間就執行,不會有延遲。而且是 JDK 自帶的,不需要額外依賴。
  • 缺點:局限性很大,只適用于單節點部署的系統。如果是分布式系統,每個節點都得自己管理定時器,任務無法共享,容易出現重復執行或者漏執行的情況。而且 Timer 線程是非守護線程,如果程序不關閉,它會一直運行,可能會有資源泄漏的問題,就像你養了一堆小寵物,卻不管它們,最后家里亂成一團。

狠招三:消息隊列延遲隊列 —— 分布式場景的好幫手

現在很多系統都是分布式部署的,這時候就需要一個分布式的解決方案,延遲隊列就派上用場了。比如 RabbitMQ 的死信隊列、RocketMQ 的延遲消息,都可以實現這個功能。

以 RabbitMQ 死信隊列為例

  1. 什么是死信隊列:死信隊列就是當消息成為死信后,會被發送到的那個隊列。而消息成為死信的原因有很多,比如消息被拒絕、超時未消費等。我們可以利用消息超時未消費這一點來實現延遲隊列。
  2. 實現步驟:

創建一個普通隊列(死信源隊列),設置隊列的過期時間(TTL)為 30 分鐘。

創建一個死信隊列,用于接收過期的消息。

將死信源隊列和死信隊列綁定,當死信源隊列中的消息過期后,會自動轉發到死信隊列。

消費者監聽死信隊列,當收到消息時,執行訂單取消邏輯。

代碼示例(RabbitMQ)

// 配置類
@Configuration
public class RabbitMQConfig {
    // 死信源隊列
    public static final String DEAD_LETTER_QUEUE = "dead_letter_queue";
    // 死信交換器
    public static final String DEAD_LETTER_EXCHANGE = "dead_letter_exchange";
    // 死信路由鍵
    public static final String DEAD_LETTER_ROUTING_KEY = "dead_letter_routing_key";
    // 真正的死信隊列
    public static final String REAL_DEAD_LETTER_QUEUE = "real_dead_letter_queue";
    @Bean
    public Queue deadLetterQueue() {
        Map<String, Object> arguments = new HashMap<>();
        // 設置隊列過期時間30分鐘
        arguments.put("x-message-ttl", 30 * 60 * 1000);
        // 設置死信交換器
        arguments.put("x-dead-letter-exchange", DEAD_LETTER_EXCHANGE);
        // 設置死信路由鍵
        arguments.put("x-dead-letter-routing-key", DEAD_LETTER_ROUTING_KEY);
        return new Queue(DEAD_LETTER_QUEUE, true, false, false, arguments);
    }
    @Bean
    public Exchange deadLetterExchange() {
        return ExchangeBuilder.directExchange(DEAD_LETTER_EXCHANGE).durable(true).build();
    }
    @Bean
    public Queue realDeadLetterQueue() {
        return new Queue(REAL_DEAD_LETTER_QUEUE, true);
    }
    @Bean
    public Binding binding() {
        return BindingBuilder.bind(realDeadLetterQueue()).to(deadLetterExchange()).with(DEAD_LETTER_ROUTING_KEY).noargs();
    }
}
// 生產者,訂單創建時發送消息到死信源隊列
@Service
public class OrderProducer {
    @Autowired
    private RabbitTemplate rabbitTemplate;
    public void sendOrderToDeadLetterQueue(Order order) {
        // 將訂單信息轉換為JSON
        String orderJson = JSON.toJSONString(order);
        rabbitTemplate.convertAndSend(RabbitMQConfig.DEAD_LETTER_EXCHANGE, RabbitMQConfig.DEAD_LETTER_ROUTING_KEY, orderJson);
    }
}
// 消費者,監聽真正的死信隊列
@Service
public class OrderConsumer {
    @RabbitListener(queues = RabbitMQConfig.REAL_DEAD_LETTER_QUEUE)
    public void handleDeadLetterMessage(String orderJson) {
        Order order = JSON.parseObject(orderJson, Order.class);
        // 執行訂單取消邏輯
        cancelOrder(order);
    }
}

優缺點分析

  • 優點:適合分布式系統,解耦了訂單創建和訂單取消邏輯,消息隊列可以承載大量的延遲任務,性能較好。而且通過設置 TTL,能比較準確地控制延遲時間。
  • 缺點:不同的消息隊列實現方式略有不同,比如 RabbitMQ 的 TTL 是隊列級別的,一旦設置,隊列里所有消息的過期時間都一樣,不夠靈活;RocketMQ 雖然支持不同的延遲級別,但需要提前配置好,不能動態設置延遲時間。而且引入消息隊列會增加系統的復雜度,需要處理消息的可靠性、重復消費等問題,就像找了個幫手,但這個幫手有時候也會鬧點小脾氣,得花時間磨合。

狠招四:分布式定時器 —— 專業的定時任務框架

如果系統是分布式的,而且定時任務很多,要求也比較高,那就可以用專業的分布式定時器框架,比如 Quartz、Elastic-Job、XXL-JOB 等。這里以 Quartz 為例來看看。

Quartz 實現原理

Quartz 是一個功能強大的開源作業調度框架,支持分布式部署。它有一個調度器(Scheduler),可以管理多個作業(Job)和觸發器(Trigger)。觸發器可以設置觸發時間,比如在指定時間執行一次,或者周期性執行。作業就是具體要執行的任務。

實現步驟

  1. 引入 Quartz 依賴。
  2. 創建 Job 類,實現具體的訂單取消邏輯。
  3. 在訂單創建時,創建 Trigger 和 JobDetail,設置觸發時間為訂單創建時間 + 30 分鐘,然后將它們注冊到 Scheduler 中。
  4. 配置 Quartz 的集群,確保在分布式環境下任務不會重復執行。

代碼示例

// Job類
public class OrderCancelJob implements Job {
    @Autowired
    private OrderService orderService;
    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
        JobDataMap dataMap = context.getJobDetail().getJobDataMap();
        String orderId = dataMap.getString("orderId");
        orderService.cancelOrder(orderId);
    }
}
// 訂單創建時調度任務
public class OrderService {
    @Autowired
    private Scheduler scheduler;
    public void createOrder(Order order) {
        // 保存訂單
        saveOrder(order);
        // 調度取消任務
        scheduleCancelJob(order);
    }
    private void scheduleCancelJob(Order order) throws SchedulerException {
        // 創建JobDetail
        JobDetail jobDetail = JobBuilder.newJob(OrderCancelJob.class)
               .withIdentity("orderCancelJob_" + order.getId(), "orderCancelGroup")
               .usingJobData("orderId", order.getId().toString())
               .build();
        // 創建Trigger,30分鐘后觸發
        Trigger trigger = TriggerBuilder.newTrigger()
               .withIdentity("orderCancelTrigger_" + order.getId(), "orderCancelGroup")
               .startAt(new Date(System.currentTimeMillis() + 30 * 60 * 1000))
               .build();
        // 將Job和Trigger注冊到Scheduler
        scheduler.scheduleJob(jobDetail, trigger);
    }
}
// Quartz集群配置(application.properties)
# Quartz配置
quartz.job-store-type=jdbc
quartz.data-source=quartzDataSource
quartz.jdbc.driver=com.mysql.cj.jdbc.Driver
quartz.jdbc.url=jdbc:mysql://localhost:3306/quartz_db?useUnicode=true&characterEncoding=utf-8
quartz.jdbc.user=root
quartz.jdbc.password=123456
# 啟用集群
quartz.scheduler.instanceName=ClusterScheduler
quartz.scheduler.instanceId=AUTO
quartz.job-store-is-clustered=true

優缺點分析

  • 優點:功能強大,支持分布式集群,任務調度精準,可配置性高,能處理大量的定時任務。而且有豐富的監聽器和管理接口,方便監控和管理。
  • 缺點:引入 Quartz 框架需要學習成本,配置相對復雜,尤其是集群環境下的配置。而且如果任務量非常大,數據庫中存儲的 Trigger 和 Job 數據會越來越多,需要定期清理,否則會影響性能,就像家里東西太多不收拾,最后找東西都難。

狠招五:Redis 過期監聽 —— 利用緩存特性實現

Redis 是一個高性能的鍵值對數據庫,它支持為鍵設置過期時間,當鍵過期時,可以通過發布訂閱模式通知客戶端。我們可以利用這個特性來實現訂單的自動取消。

實現原理

  1. 在訂單創建時,將訂單信息存儲到 Redis 中,并設置 30 分鐘的過期時間。
  2. 開啟 Redis 的過期鍵通知功能,當訂單鍵過期時,Redis 會發布一個事件。
  3. 客戶端監聽這個事件,收到事件后,執行訂單取消邏輯。

實現步驟

  • 配置 Redis,開啟過期鍵通知。在 redis.conf 中設置:
notify-keyspace-events Ex

然后重啟 Redis 服務。

  • 訂單創建時,將訂單 ID 作為鍵,存儲到 Redis 中,設置過期時間 30 分鐘。可以選擇是否存儲訂單的其他信息,也可以只存儲訂單 ID,取消時再從數據庫查詢詳細信息。
  • 使用 Redis 的發布訂閱功能,創建一個監聽器,監聽鍵過期事件。
  • 監聽器收到事件后,獲取訂單 ID,執行取消邏輯。

代碼示例(Spring Boot 集成 Redis)

// 訂單創建時存儲到Redis
@Service
public class OrderService {
    @Autowired
    private StringRedisTemplate stringRedisTemplate;
    public void createOrder(Order order) {
        // 保存訂單到數據庫
        saveOrderToDatabase(order);
        // 將訂單ID存儲到Redis,設置30分鐘過期
        stringRedisTemplate.opsForValue().set("order:unpaid:" + order.getId(), "1", 30, TimeUnit.MINUTES);
    }
}
// Redis監聽器
@Component
public class RedisKeyExpirationListener extends KeyExpirationEventMessageListener {
    private final ApplicationEventPublisher applicationEventPublisher;
    public RedisKeyExpirationListener(RedisMessageListenerContainer listenerContainer, ApplicationEventPublisher applicationEventPublisher) {
        super(listenerContainer);
        this.applicationEventPublisher = applicationEventPublisher;
    }
    @Override
    public void onMessage(Message message, byte[] pattern) {
        // 獲取過期的鍵
        String expiredKey = message.toString();
        if (expiredKey.startsWith("order:unpaid:")) {
            String orderId = expiredKey.split(":")[2];
            // 發布訂單過期事件
            applicationEventPublisher.publishEvent(new OrderExpiredEvent(this, orderId));
        }
    }
}
// 訂單過期事件處理
@Service
public class OrderExpiredEventHandler {
    @EventListener
    public void handleOrderExpiredEvent(OrderExpiredEvent event) {
        String orderId = event.getOrderId();
        // 查詢訂單狀態,防止已支付的情況
        Order order = getOrderFromDatabase(orderId);
        if (order.getStatus() == OrderStatus.UNPAID) {
            cancelOrder(order);
        }
    }
}

優缺點分析

  • 優點:利用 Redis 的高性能和過期通知特性,能快速處理大量的訂單過期事件,適用于高并發場景。而且實現相對簡單,不需要引入復雜的框架,只需要依賴 Redis 即可。
  • 缺點:Redis 的過期通知不是實時的,可能會有一定的延遲,因為 Redis 是單線程處理,只有在處理到過期鍵時才會發布事件。另外,如果系統對 Redis 的依賴很強,一旦 Redis 出現故障,可能會影響訂單取消功能,需要做好容災處理,就像你太依賴一個朋友,他要是生病了,你可能就麻煩了。

三、五大方案對比與選擇建議

方案

優點

缺點

適用場景

數據庫輪詢

簡單易實現,無需額外依賴

性能差,實時性低,訂單量大時壓力大

小型系統,訂單量少

JDK 自帶定時器

精準,單節點適用

分布式支持差,資源管理麻煩

單節點應用,定時任務少

消息隊列延遲隊列

分布式支持好,解耦度高

不同 MQ 實現有局限,復雜度增加

分布式系統,對解耦有要求

分布式定時器

功能強大,支持集群,可配置性高

學習成本高,配置復雜

大型分布式系統,定時任務多

Redis 過期監聽

高性能,適合高并發

通知有延遲,依賴 Redis

高并發場景,對實時性要求不是極高

選擇的時候可以根據自己的系統規模、并發量、架構復雜度來決定。如果是小型系統,訂單量不大,用數據庫輪詢或者 JDK 定時器就能搞定;要是分布式系統,訂單量中等,消息隊列延遲隊列是個不錯的選擇;如果是大型分布式系統,定時任務很多,對可靠性和功能要求高,那就選分布式定時器;要是高并發場景,Redis 過期監聽則更合適。

四、踩坑指南

  1. 冪等性問題:不管用哪種方案,都要保證訂單取消操作是冪等的,也就是多次執行和執行一次的結果是一樣的。比如在取消訂單前,先檢查訂單狀態,只有未支付的訂單才取消,防止重復取消已支付或已取消的訂單。
  2. 事務處理:在執行訂單取消時,涉及到更新訂單狀態、釋放庫存、通知用戶等操作,要保證這些操作要么全部成功,要么全部失敗,避免出現部分成功的情況。
  3. 性能優化:對于數據庫輪詢和分布式定時器等方案,要做好數據庫索引優化,避免全表掃描;對于消息隊列和 Redis 方案,要合理設置過期時間和隊列參數,提高系統吞吐量。
  4. 監控與報警:一定要對訂單取消功能進行監控,比如統計每分鐘取消的訂單量、失敗的訂單量等,一旦出現異常,及時報警處理,避免大量訂單未取消的情況發生。

五、總結

訂單 30 分鐘未支付自動取消這個功能,看似簡單,背后卻有很多技術細節需要考慮。從簡單的數據庫輪詢到復雜的分布式定時器,每種方案都有自己的適用場景和優缺點。大家在實際開發中,要根據自己的系統情況選擇合適的方案,同時注意冪等性、事務處理、性能優化和監控報警等問題。

責任編輯:武曉燕 來源: 石杉的架構筆記
相關推薦

2024-08-27 13:43:38

Spring系統業務

2023-10-09 16:35:19

方案Spring支付

2021-09-07 08:14:26

訂單超時未支付

2020-10-21 09:25:01

互聯網訂單自動關閉

2023-11-27 08:15:26

Spring訂單取消

2023-11-20 08:39:24

Spring定時任務

2021-01-18 11:41:22

SQL數據庫編程語言

2017-10-12 13:50:49

大數據企業分析專家

2024-02-26 08:50:37

訂單自動取消消息

2025-03-18 10:25:59

2016-08-24 11:46:28

移動應用DevOps私有云

2017-10-20 23:50:36

大數據數據分析企業

2025-07-01 07:54:00

2022-12-01 08:25:03

訂單超時定時任務

2023-01-30 08:12:53

訂單超時自動取消延長訂單

2017-09-26 10:51:55

提高數據庫性能

2021-12-01 06:50:50

Docker底層原理

2024-03-28 08:32:10

美團關閉訂單輪訓

2025-11-14 01:20:00

點贊
收藏

51CTO技術棧公眾號

国产精品高潮粉嫩av| 日韩一区二区高清| 视频一区国产精品| 国产影视一区二区| 亚洲高清不卡| 亚洲无线码在线一区观看| 日韩成人精品视频在线观看| 精品精品导航| 日本一区二区三级电影在线观看 | 日本在线播放不卡| 国产又爽又黄又嫩又猛又粗| av成人激情| 久久精品这里热有精品| 女尊高h男高潮呻吟| 99久热在线精品视频观看| 亚洲一区在线电影| 午夜精品短视频| 亚洲h视频在线观看| 男女激情视频一区| 国内精品一区二区三区| 潮喷失禁大喷水aⅴ无码| 欧美日韩精品一区二区三区在线观看| 欧美日韩一区二区在线视频| 日韩国产一级片| 日本在线天堂| 久久综合网色—综合色88| 亚洲自拍偷拍区| 中文字幕资源网| 免费国产自线拍一欧美视频| 精品中文字幕在线观看| 精品无码在线观看| 日韩中出av| 日韩女优毛片在线| 日日夜夜精品视频免费观看| 99riav视频一区二区| 狠狠色噜噜狠狠狠狠97| 香港三级日本三级a视频| 欧美尤物美女在线| 亚洲国产激情av| 麻豆91av| 水莓100在线视频| 成人一区在线看| 91pron在线| 国产伦精品一区二区三区视频痴汉| 久久永久免费| 欧美在线日韩在线| 久草国产精品视频| 99xxxx成人网| 97精品免费视频| 日本少妇在线观看| 亚洲一级二级| 久久久日本电影| 久久综合成人网| 欧美日韩1区| 精品少妇一区二区30p| www日韩在线| 婷婷亚洲综合| 久久亚洲综合国产精品99麻豆精品福利 | 国产免费久久久久| 亚洲精品成人无限看| 欧美成人亚洲成人| 久久久美女视频| 最新亚洲视频| 91成人性视频| 久久精品视频1| 久久精品麻豆| 国产精品视频大全| 国产精品高潮呻吟久久久| 久久99国产精品麻豆| 亚洲自拍欧美色图| 免费的黄色av| 久久九九国产精品| 亚洲开发第一视频在线播放| 国产区在线观看| 一区二区三区精品在线| 亚洲精品蜜桃久久久久久| 国模精品视频| 欧美视频在线一区二区三区 | 日本少妇裸体做爰| 国产欧美亚洲一区| 国产精品白嫩初高中害羞小美女| 一区二区三区日| 国产精品一区三区| 麻豆精品传媒视频| 又爽又大又黄a级毛片在线视频| 中文字幕永久在线不卡| 成人污网站在线观看| 高清毛片在线观看| 欧洲激情一区二区| 深夜做爰性大片蜜桃| 欧美jizz19性欧美| 色先锋资源久久综合5566| 欧美黑吊大战白妞| 丝袜美腿亚洲色图| 91在线观看免费观看| 人妻偷人精品一区二区三区| 久久精品日韩一区二区三区| 一二三四中文字幕| 九九热线视频只有这里最精品| 欧美人伦禁忌dvd放荡欲情| 韩国av中国字幕| 欧美女王vk| 欧美成人精品在线观看| 无码人妻av一区二区三区波多野| 国产毛片精品视频| 欧美日韩国产一二| 国产福利视频在线| 欧亚洲嫩模精品一区三区| 男插女视频网站| 国产欧美日韩影院| 欧美激情国产高清| 在线观看亚洲一区二区| 不卡一区二区在线| 久久久久亚洲av无码专区喷水| 日韩伦理福利| 91精品国产综合久久久久久久 | 欧美久久精品一级黑人c片| 国产精品19乱码一区二区三区| 美女诱惑一区二区| 久久精品ww人人做人人爽| av网址在线| 欧美午夜不卡视频| 国产精品无码久久久久久| 综合久久99| 国产欧美日韩免费| 黄色视屏网站在线免费观看| 亚洲第一成年网| 91精产国品一二三| 综合在线视频| 成人欧美在线视频| 1024视频在线| 欧洲亚洲精品在线| 亚洲日本精品视频| 欧美一级播放| 欧美日韩国产一二| 蜜桃视频在线网站| 亚洲精品成人久久| 欧美一级高潮片| 国产91丝袜在线观看| 中文字幕一区二区三区精彩视频| 欧美影视资讯| 一个人www欧美| 成人免费视频国产免费| 2021国产精品久久精品| www.浪潮av.com| 亚洲女娇小黑人粗硬| 8x海外华人永久免费日韩内陆视频 | 国产精品国产三级国产专业不| 亚洲国产日本| 黄色99视频| www在线看| 亚洲国产成人精品久久| 亚洲黄色一区二区| 99精品久久99久久久久| 可以在线看的av网站| 欧美freesex8一10精品| 欧美亚洲成人精品| 久久这里精品| 欧美中文字幕一二三区视频| 99国产精品免费| 精品一区二区三区久久| 青青视频免费在线| 91成人短视频| 97欧美精品一区二区三区| 先锋av资源站| 一本到不卡精品视频在线观看| 成人性生交大免费看| 久久久亚洲一区| 丝袜足脚交91精品| 99国内精品久久久久| 欧美国产日韩视频| 色哟哟中文字幕| 一本在线高清不卡dvd| 这里只有久久精品| 久久99精品国产.久久久久久| 黄色一级视频播放| 欧美顶级毛片在线播放| 日韩美女免费观看| 快射av在线播放一区| 欧美变态tickle挠乳网站| 久久国产精品系列| 欧美激情一区在线| 成年人看片网站| 裸体素人女欧美日韩| 一区不卡字幕| jizz久久精品永久免费| 国产精品1234| 在线播放免费av| 亚洲日韩中文字幕在线播放| 国产精品欧美激情在线| 亚洲成av人片在线观看| 日本精品在线观看视频| 国产成人精品免费在线| 嫩草av久久伊人妇女超级a| 中文乱码免费一区二区三区下载| 国产一级特黄a大片99| 成人福利一区二区| 欧美高清无遮挡| 福利视频在线看| 日韩精品一区二| 一区二区视频免费| 午夜亚洲福利老司机| 久久精品在线观看视频| jlzzjlzz国产精品久久| 欧美在线aaa| av成人毛片| 8x8x华人在线| 欧美先锋资源| 精品无码久久久久久久动漫| 亚洲精品第一| 日韩av电影院| 91超碰在线免费| 毛片精品免费在线观看| 加勒比一区二区三区在线| 91精品国产福利| 中国女人一级一次看片| 精品国产电影一区| 国产亚洲精品女人久久久久久| 国产精品灌醉下药二区| 性欧美一区二区| 92精品国产成人观看免费| 性生交大片免费看l| 蜜臀av亚洲一区中文字幕| 黄色免费视频大全| 亚洲性视频h| 综合一区中文字幕| 欧美视频网址| 欧美午夜精品久久久久免费视 | 久久激情综合网| 国产成人亚洲精品无码h在线| 欧美三级午夜理伦三级中文幕| 7777在线视频| 99热国内精品永久免费观看| 欧美亚洲丝袜| 亚洲bt欧美bt精品777| 国产在线欧美日韩| 白嫩白嫩国产精品| dy888夜精品国产专区| 精品国产伦一区二区三区观看说明| 国产精品亚洲网站| 99精品国自产在线| 国产精品日韩专区| 99欧美精品| 国产精品久久一| 久久久加勒比| 国产精品专区一| 欧美美女被草| 国产日韩中文字幕在线| 亚洲精品66| 91免费国产网站| 亚洲综合色婷婷在线观看| 99精彩视频在线观看免费| 清纯唯美激情亚洲| 不卡日韩av| 88久久精品| 久久国产精品久久| 国产一区二区精品福利地址| 欧美精品七区| 欧美美女一区| 亚洲一区二区在线免费观看| 久久中文视频| 肉大捧一出免费观看网站在线播放| 欧美日本一区| 欧美日韩性生活片| 天堂精品中文字幕在线| 亚洲三级av在线| 黄色片子在线观看| 成人免费一区二区三区视频 | 成人高清电影网站| 日韩精品国内| 香港欧美日韩三级黄色一级电影网站| 91大学生片黄在线观看| 激情综合激情| 久久精品午夜福利| 麻豆成人久久精品二区三区红| 99久久99精品| 成人免费高清视频在线观看| 国产制服丝袜在线| 国产欧美精品在线观看| 欧美激情图片小说| 精品美女国产在线| 国产精品乱码一区二区视频| 欧美一级精品大片| 日本黄色不卡视频| 中文日韩在线视频| 最新国产在线拍揄自揄视频| 69视频在线免费观看| 久久伊人国产| 国产精品一区在线观看| 成人3d动漫在线观看| 国产手机视频在线观看| 亚洲欧美日韩专区| 欧美特级aaa| 成人在线视频首页| av片在线免费看| 午夜免费久久看| 国产精品一区二区三区在线免费观看| 日韩天堂av| 狠狠精品干练久久久无码中文字幕| 国产精品豆花视频| 日日碰狠狠躁久久躁婷婷| 国产精选一区二区三区| 三上悠亚影音先锋| 一区二区三区四区高清精品免费观看 | 欧美综合自拍| 在线视频亚洲自拍| 米奇777在线欧美播放| 亚洲美女精品视频| 中文字幕不卡三区| 麻豆久久久久久久久久| 欧美一区二区三区在线观看视频| 国产中文字幕在线观看| 97人人模人人爽人人喊中文字| 亚洲综合资源| 欧洲在线视频一区| 99热在线精品观看| 黄页网站在线看| 中文字幕乱码久久午夜不卡| 国产午夜精品无码一区二区| 91麻豆精品国产综合久久久久久| 九色视频成人自拍| 韩国美女主播一区| 美女日韩一区| 欧美 日韩 国产 在线观看| 狂野欧美一区| 国产三级视频网站| 亚洲狠狠爱一区二区三区| 国产三区在线播放| 日韩三级影视基地| 色猫猫成人app| 日本日本精品二区免费| 亚洲美女视频在线免费观看 | 久久一留热品黄| 国产无遮无挡120秒| 91精品国产91久久久久久一区二区| √天堂资源地址在线官网| 国产97在线|日韩| 亚洲精品国产动漫| 3d动漫一区二区三区| 不卡av在线免费观看| 国产精彩视频在线观看| 精品捆绑美女sm三区| 性爱视频在线播放| 亚洲一区二区在线播放| 欧美在线高清| 国内自拍第二页| 亚洲日本中文字幕区| 亚洲一区在线观| 精品国偷自产在线视频| 亚洲三级在线| 秋霞在线一区二区| 国产精品一区二区在线观看不卡| 国产一二三区精品| 欧美一区二区三区视频| 香蕉久久aⅴ一区二区三区| 99re在线国产| 亚洲婷婷在线| 91精品小视频| 欧美日韩激情小视频| 牛牛澡牛牛爽一区二区| 国产成人精品一区二区| 欧美综合一区| 亚洲午夜激情影院| 依依成人精品视频| 人妻无码中文字幕| 日本精品视频在线播放| 青青草91久久久久久久久| 国内外成人免费在线视频| 亚洲欧美日韩在线| 亚洲大尺度网站| 国产91ⅴ在线精品免费观看| 精品国产乱码久久久久久果冻传媒| 天天爽人人爽夜夜爽| 亚洲天堂成人网| 黄色av网址在线| 日本精品中文字幕| 99精品视频在线| 野战少妇38p| 色香蕉久久蜜桃| 老司机福利在线视频| 国产欧美韩日| 日本在线不卡一区| 天天看片中文字幕| 国产视频久久久久| 亚洲一区二区小说| 日韩a∨精品日韩在线观看| 欧美极品美女视频| 亚洲av永久无码国产精品久久| 日本欧美黄网站| 亚洲最大av| 亚洲国产欧美视频| 欧美久久高跟鞋激| 欧美少妇精品| ijzzijzzij亚洲大全| 91一区二区在线| yjizz国产| 久色乳综合思思在线视频| 国产精品天天看天天狠| xxx国产在线观看| 精品久久香蕉国产线看观看亚洲|