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

6—12呦国产精品| 久久久久麻豆v国产| gogo高清午夜人体在线| 91老师片黄在线观看| 国产精品私拍pans大尺度在线| www.5588.com毛片| 日韩有码av| 欧美日本一区二区三区| 91动漫在线看| 91电影在线播放| 成人免费高清在线| 国产精品视频最多的网站| 久久久国产精品黄毛片| 国产精品美女久久久久久不卡| 欧美一区二区免费观在线| 日本日本19xxxⅹhd乱影响| 伊人在线视频| 久久嫩草精品久久久精品| 5566av亚洲| 超碰在线免费97| 亚洲人成人一区二区三区| 日韩在线免费视频| 好吊一区二区三区视频| 日韩欧美激情| 色94色欧美sute亚洲线路二| 九九热只有这里有精品| 日本视频在线播放| 久久久久亚洲蜜桃| 国产精品一区二区三区免费| 国产视频在线免费观看| 三级亚洲高清视频| 国内精品一区二区三区| 加勒比婷婷色综合久久| 大片网站久久| 亚洲一区二区精品| 成人手机在线免费视频| 一区二区三区免费在线看| 欧美欧美欧美欧美首页| 黄色一级二级三级| 欧美男男tv网站在线播放| 一区二区三区四区亚洲| 国产福利片一区二区| www.视频在线.com| 国产视频在线观看一区二区三区| 久久99精品久久久久久秒播放器 | 婷婷在线视频观看| 久久一二三国产| 国产在线精品一区| 午夜久久久久久久久久| 国产老女人精品毛片久久| 国产日韩中文在线| 黄色大全在线观看| 久久久久久久尹人综合网亚洲| 91国偷自产一区二区三区的观看方式| 欧美日韩大片在线观看| 欧美福利视频| 九九久久国产精品| 91视频免费在线看| 亚洲国产日韩欧美在线| 久久久精品久久久久| 精品亚洲乱码一区二区| 国产精品久久久久久久久久10秀| 精品国产区一区二区三区在线观看| 久久久影视精品| 欧美一级成年大片在线观看| 久久久久免费看| 欧美黄色一级视频| 久久69精品久久久久久久电影好| 一级黄色录像视频| 狠狠爱综合网| 97国产在线视频| 中文字幕在线欧美| 美女网站久久| 国产欧美最新羞羞视频在线观看| 国产精品久久久久久免费免熟 | 国产999精品视频| 黄瓜视频在线免费观看| 日韩黄色免费电影| 成人黄色中文字幕| 精品人妻av一区二区三区| 福利电影一区二区三区| 久久精品二区| 天堂а√在线资源在线| 依依成人综合视频| 激情五月宗合网| 91国拍精品国产粉嫩亚洲一区| 欧美剧情电影在线观看完整版免费励志电影| 91看片破解版| 老牛影视av一区二区在线观看| 亚洲嫩模很污视频| 亚洲天堂av中文字幕| 欧美韩国一区| 日韩美女主播视频| 国产精品视频第一页| 懂色av一区二区三区免费看| 欧美日韩国产高清视频| 欧美三级黄网| 婷婷综合久久一区二区三区| 91国产精品视频在线观看| 亚洲开心激情| 亚洲系列中文字幕| 久草免费在线观看视频| 久久久久久9| 99久久精品免费看国产四区| 国产特黄在线| 亚洲图片欧美综合| 黑人粗进入欧美aaaaa| 99国产精品久久一区二区三区| 亚洲欧美另类人妖| 久久久久久免费观看| 日韩专区在线视频| 高清国产在线一区| 伊人在线视频| 欧美视频在线观看免费网址| 成年人网站av| 精品视频日韩| 91av在线免费观看| 国产黄a三级三级看三级| wwwwww.欧美系列| 一本大道东京热无码aⅴ| 色婷婷综合久久久中字幕精品久久| 日韩欧美一级二级| 国产视频123区| 久久在线精品| 国内外成人免费视频| 91极品在线| 欧美日韩免费一区二区三区视频| 国产精品无码久久久久久| 欧美成人久久| 成人免费网站在线| 成年人在线免费观看| 精品福利樱桃av导航| 91人妻一区二区三区| 欧美激情国产在线| 国产精品成人一区二区| 日本福利片在线| 亚洲女人小视频在线观看| www.激情小说.com| 国产欧美日韩影院| 日韩av手机在线看| 欧美日韩伦理片| 五月婷婷激情综合| 一个人看的视频www| 一区二区蜜桃| 91网站免费看| 国产精品扒开做爽爽爽的视频| 精品污污网站免费看| 中文字幕在线观看免费高清| 日韩精品欧美精品| 日韩精品一区二区三区丰满| 日本免费久久| 国产亚洲精品激情久久| jizz国产在线观看| 国产亚洲精品免费| 手机看片福利日韩| 色综合狠狠操| 91在线高清视频| 菠萝蜜视频国产在线播放| 欧美丰满一区二区免费视频| 国产极品美女在线| 国产精品1024久久| 免费的一级黄色片| 高潮久久久久久久久久久久久久| 性欧美激情精品| 色呦呦免费观看| 色综合久久久网| 国精产品一区一区| 国内精品久久久久影院色| 中国 免费 av| 9999久久久久| 456亚洲影院| 国产高清免费在线播放| 欧美日韩在线观看一区二区| 午夜精品一区二区三级视频| 国产精品综合网| 日韩黄色短视频| 欧美猛男做受videos| 国产精品精品久久久久久| 91高清在线视频| 日韩一区二区三区精品视频| 久久狠狠高潮亚洲精品| 久久精品视频在线看| 欧美特黄aaa| 精品电影一区| 欧美自拍资源在线| 精品国产三区在线| 午夜精品久久久久久久男人的天堂 | 欧美男人的天堂一二区| 精品爆乳一区二区三区无码av| 99综合电影在线视频| 北条麻妃av高潮尖叫在线观看| 久久久久电影| 国产欧美日本在线| 免费在线成人激情电影| 久久国产精品影视| 欧美一级一区二区三区| 欧美日韩在线播放三区| 免费在线黄色片| 国产日韩欧美精品综合| 久久国产免费视频| 久久综合图片| 欧美这里只有精品| 欧美色图激情小说| 高清国产在线一区| 久久av影院| 91精品国产电影| 黄色av网站在线播放| 日韩福利在线播放| 99久久精品国产一区色| 色哟哟精品一区| 久久久久久久久久91| 久久久久久久性| 欧洲成人午夜精品无码区久久| 青青草一区二区三区| 久久国产精品视频在线观看| 91精品久久久久久久蜜月 | 青青青草原在线| 日韩三级av在线播放| 天天天天天天天干| 欧美色视频日本高清在线观看| 免费在线观看黄视频| 国产精品久久久爽爽爽麻豆色哟哟| 好吊色视频一区二区三区| 九九九久久久精品| 成年人免费在线播放| 欧美三级在线| 熟妇熟女乱妇乱女网站| 精品美女视频| 欧美动漫一区二区| 国产suv精品一区| 91av一区二区三区| 中文成人在线| 国产精品com| 欧美xxx性| 69国产精品成人在线播放| 免费av不卡在线观看| 另类色图亚洲色图| 欧美18hd| 久久夜精品va视频免费观看| 在线免费观看黄| 日韩小视频在线观看| 成人精品一区二区三区校园激情 | 99re在线国产| 国产亚洲字幕| 亚洲xxxx18| 国产色99精品9i| 91日韩在线视频| 久久久精品区| www.成人av| 澳门久久精品| 国产高清精品一区二区三区| 2020最新国产精品| 不卡一区二区三区四区五区| 视频在线亚洲| 成人动漫视频在线观看免费| 国产一区二区三区免费在线 | 人妻一区二区三区| 精品国产一区二区三区不卡| 黄色av免费观看| 欧美精品一区二区在线观看| 秋霞欧美在线观看| 亚洲国产欧美自拍| 免费成人av电影| 一区二区三区美女xx视频| yiren22亚洲综合伊人22| 中文字幕日韩欧美在线视频| 青青青青在线| 欧美成人午夜激情| 精品精品导航| 国产91精品不卡视频| 亚洲精品.com| 91久久嫩草影院一区二区| 欧美经典影片视频网站| 国产女人水真多18毛片18精品| 一本色道久久综合亚洲精品酒店 | 3d动漫精品啪啪一区二区三区免费| 美国十次综合久久| 国产欧美综合精品一区二区| 亚洲人挤奶视频| 一区二区不卡在线视频 午夜欧美不卡' | 亚洲第一福利网站| 欧美zzoo| 久久久av亚洲男天堂| 24小时免费看片在线观看| 2020久久国产精品| 青青伊人久久| 高清视频在线观看一区| 神马久久一区二区三区| 国产成人免费高清视频| 一区二区国产精品| 伊人网在线综合| 99麻豆久久久国产精品免费 | 亚洲一二三四在线| 精品人妻一区二区三区免费看| 欧美日韩一卡二卡| 欧美77777| 中文字幕av一区二区| 2021天堂中文幕一二区在线观| 国产精品大陆在线观看| 日韩精品成人| 日韩欧美精品久久| 欧美日韩亚洲一区| 成年人免费大片| 国产高清精品久久久久| 亚洲av无码一区二区三区人 | 欧美xxxx吸乳| 久久精品国产清高在天天线| aaaaaaaa毛片| 国产欧美视频一区二区| 国产极品在线播放| 欧美日韩另类一区| 日本护士...精品国| 欧美福利小视频| 日韩国产一二三区| 蜜桃传媒视频麻豆第一区免费观看 | 99精品一级欧美片免费播放| 亚洲免费网站| 91人妻一区二区| 亚洲欧美一区二区三区久本道91| 中文字幕精品视频在线观看| 亚洲国产日韩欧美在线图片 | 日韩av大片免费看| 亚洲va欧美va人人爽成人影院| 五月天亚洲综合| 午夜一区不卡| 欧美大片免费播放器| 一二三四社区欧美黄| 国产精品特级毛片一区二区三区| 亚洲欧美一区二区三区四区| wwww亚洲| 国产高清精品一区二区三区| 中文视频一区| www.久久久久久久久久久| 国产日产欧产精品推荐色| 草久久免费视频| 亚洲第一av网| a'aaa级片在线观看| 99c视频在线| 午夜精品av| 成人免费播放视频| 综合网在线视频| 国产乱码久久久久| 俺去亚洲欧洲欧美日韩| 亚洲欧美专区| 在线播放 亚洲| 紧缚捆绑精品一区二区| 亚洲精品国产精品乱码在线观看| 欧美性做爰猛烈叫床潮| 国模精品一区二区| 国产91在线高潮白浆在线观看| 免费成人高清在线视频theav| 国产a级一级片| 国产视频一区在线播放| 一级久久久久久| 在线亚洲国产精品网| 福利一区二区免费视频| 一区二区不卡在线| 国产一区二区三区免费看| 永久免费看黄网站| 欧美成人性战久久| 成年人国产在线观看| 精品999在线观看| 亚洲免费中文| 欧美激情 一区| 欧美高清一级片在线| 成人高清免费在线| 亚洲自拍av在线| 99综合精品| av男人的天堂av| 欧美精品在欧美一区二区少妇| av大大超碰在线| 国产乱码精品一区二区三区不卡| 在线综合亚洲| www.日本高清视频| 日韩亚洲欧美成人一区| 17videosex性欧美| 日本不卡二区高清三区| 美女免费视频一区| 特级片在线观看| 日韩国产高清视频在线| 99久久er| 青草青青在线视频 | 欧美一区免费观看| 日韩欧美一级二级三级| 一区二区电影免费观看| 亚洲一区二区三区涩| 国产不卡视频在线播放| 黄色片免费观看视频| 日韩一区av在线| 久久精品色综合| www.日本一区| 亚洲高清在线视频| 高清国产福利在线观看| av成人综合网| 日韩国产精品大片| 青青操国产视频| 亚洲系列中文字幕| 成人h动漫精品一区二区器材| 日本va中文字幕| 亚洲成人精品影院|