国产无遮挡裸体免费直播视频,久久精品国产蜜臀av,动漫在线视频一区二区,欧亚日韩一区二区三区,久艹在线 免费视频,国产精品美女网站免费,正在播放 97超级视频在线观看,斗破苍穹年番在线观看免费,51最新乱码中文字幕

使用Redis實(shí)現(xiàn)延時(shí)任務(wù)的解決方案

 更新時(shí)間:2019年08月22日 08:33:03   作者:Throwable  
這篇文章主要介紹了使用Redis實(shí)現(xiàn)延時(shí)任務(wù)的解決方案,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

最近在生產(chǎn)環(huán)境剛好遇到了延時(shí)任務(wù)的場景,調(diào)研了一下目前主流的方案,分析了一下優(yōu)劣并且敲定了最終的方案。這篇文章記錄了調(diào)研的過程,以及初步方案的實(shí)現(xiàn)。

候選方案對比

下面是想到的幾種實(shí)現(xiàn)延時(shí)任務(wù)的方案,總結(jié)了一下相應(yīng)的優(yōu)勢和劣勢。

方案 優(yōu)勢 劣勢 選用場景
JDK 內(nèi)置的延遲隊(duì)列 DelayQueue 實(shí)現(xiàn)簡單 數(shù)據(jù)內(nèi)存態(tài),不可靠 一致性相對低的場景
調(diào)度框架和 MySQL 進(jìn)行短間隔輪詢 實(shí)現(xiàn)簡單,可靠性高 存在明顯的性能瓶頸 數(shù)據(jù)量較少實(shí)時(shí)性相對低的場景
RabbitMQ  DLX  TTL,一般稱為 死信隊(duì)列 方案 異步交互可以削峰 延時(shí)的時(shí)間長度不可控,如果數(shù)據(jù)需要持久化則性能會(huì)降低 -
調(diào)度框架和 Redis 進(jìn)行短間隔輪詢 數(shù)據(jù)持久化,高性能 實(shí)現(xiàn)難度大 常見于支付結(jié)果回調(diào)方案
時(shí)間輪 實(shí)時(shí)性高 實(shí)現(xiàn)難度大,內(nèi)存消耗大 實(shí)時(shí)性高的場景

如果應(yīng)用的數(shù)據(jù)量不高,實(shí)時(shí)性要求比較低,選用調(diào)度框架和 MySQL 進(jìn)行短間隔輪詢這個(gè)方案是最優(yōu)的方案。但是筆者遇到的場景數(shù)據(jù)量相對比較大,實(shí)時(shí)性并不高,采用掃庫的方案一定會(huì)對 MySQL 實(shí)例造成比較大的壓力。記得很早之前,看過一個(gè)PPT叫《盒子科技聚合支付系統(tǒng)演進(jìn)》,其中里面有一張圖片給予筆者一點(diǎn)啟發(fā):

里面剛好用到了調(diào)度框架和 Redis 進(jìn)行短間隔輪詢實(shí)現(xiàn)延時(shí)任務(wù)的方案,不過為了分?jǐn)倯?yīng)用的壓力,圖中的方案還做了分片處理。鑒于筆者當(dāng)前業(yè)務(wù)緊迫,所以在第一期的方案暫時(shí)不考慮分片,只做了一個(gè)簡化版的實(shí)現(xiàn)。

由于PPT中沒有任何的代碼或者框架貼出,有些需要解決的技術(shù)點(diǎn)需要自行思考,下面會(huì)重現(xiàn)一次整個(gè)方案實(shí)現(xiàn)的詳細(xì)過程。

場景設(shè)計(jì)

實(shí)際的生產(chǎn)場景是筆者負(fù)責(zé)的某個(gè)系統(tǒng)需要對接一個(gè)外部的資金方,每一筆資金下單后需要延時(shí)30分鐘推送對應(yīng)的附件。這里簡化為一個(gè)訂單信息數(shù)據(jù)延遲處理的場景,就是每一筆下單記錄一條訂單消息(暫時(shí)叫做 OrderMessage ),訂單消息需要延遲5到15秒后進(jìn)行異步處理。

否決的候選方案實(shí)現(xiàn)思路

下面介紹一下其它四個(gè)不選用的候選方案,結(jié)合一些偽代碼和流程分析一下實(shí)現(xiàn)過程。

JDK內(nèi)置延遲隊(duì)列

DelayQueue 是一個(gè)阻塞隊(duì)列的實(shí)現(xiàn),它的隊(duì)列元素必須是 Delayed 的子類,這里做個(gè)簡單的例子:

public class DelayQueueMain {
  private static final Logger LOGGER = LoggerFactory.getLogger(DelayQueueMain.class);
  public static void main(String[] args) throws Exception {
    DelayQueue<OrderMessage> queue = new DelayQueue<>();
    // 默認(rèn)延遲5秒
    OrderMessage message = new OrderMessage("ORDER_ID_10086");
    queue.add(message);
    // 延遲6秒
    message = new OrderMessage("ORDER_ID_10087", 6);
    queue.add(message);
    // 延遲10秒
    message = new OrderMessage("ORDER_ID_10088", 10);
    queue.add(message);
    ExecutorService executorService = Executors.newSingleThreadExecutor(r -> {
      Thread thread = new Thread(r);
      thread.setName("DelayWorker");
      thread.setDaemon(true);
      return thread;
    });
    LOGGER.info("開始執(zhí)行調(diào)度線程...");
    executorService.execute(() -> {
      while (true) {
        try {
          OrderMessage task = queue.take();
          LOGGER.info("延遲處理訂單消息,{}", task.getDescription());
        } catch (Exception e) {
          LOGGER.error(e.getMessage(), e);
        }
      }
    });
    Thread.sleep(Integer.MAX_VALUE);
  }
  private static class OrderMessage implements Delayed {
    private static final DateTimeFormatter F = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
    /**
     * 默認(rèn)延遲5000毫秒
     */
    private static final long DELAY_MS = 1000L * 5;
    /**
     * 訂單ID
     */
    private final String orderId;
    /**
     * 創(chuàng)建時(shí)間戳
     */
    private final long timestamp;
    /**
     * 過期時(shí)間
     */
    private final long expire;
    /**
     * 描述
     */
    private final String description;
    public OrderMessage(String orderId, long expireSeconds) {
      this.orderId = orderId;
      this.timestamp = System.currentTimeMillis();
      this.expire = this.timestamp + expireSeconds * 1000L;
      this.description = String.format("訂單[%s]-創(chuàng)建時(shí)間為:%s,超時(shí)時(shí)間為:%s", orderId,
          LocalDateTime.ofInstant(Instant.ofEpochMilli(timestamp), ZoneId.systemDefault()).format(F),
          LocalDateTime.ofInstant(Instant.ofEpochMilli(expire), ZoneId.systemDefault()).format(F));
    }
    public OrderMessage(String orderId) {
      this.orderId = orderId;
      this.timestamp = System.currentTimeMillis();
      this.expire = this.timestamp + DELAY_MS;
      this.description = String.format("訂單[%s]-創(chuàng)建時(shí)間為:%s,超時(shí)時(shí)間為:%s", orderId,
          LocalDateTime.ofInstant(Instant.ofEpochMilli(timestamp), ZoneId.systemDefault()).format(F),
          LocalDateTime.ofInstant(Instant.ofEpochMilli(expire), ZoneId.systemDefault()).format(F));
    }
    public String getOrderId() {
      return orderId;
    }
    public long getTimestamp() {
      return timestamp;
    }
    public long getExpire() {
      return expire;
    }
    public String getDescription() {
      return description;
    }
    @Override
    public long getDelay(TimeUnit unit) {
      return unit.convert(this.expire - System.currentTimeMillis(), TimeUnit.MILLISECONDS);
    }
    @Override
    public int compareTo(Delayed o) {
      return (int) (this.getDelay(TimeUnit.MILLISECONDS) - o.getDelay(TimeUnit.MILLISECONDS));
    }
  }
}

注意一下, OrderMessage 實(shí)現(xiàn) Delayed 接口,關(guān)鍵是需要實(shí)現(xiàn) Delayed#getDelay()Delayed#compareTo() 。運(yùn)行一下 main() 方法:

10:16:08.240 [main] INFO club.throwable.delay.DelayQueueMain - 開始執(zhí)行調(diào)度線程...
10:16:13.224 [DelayWorker] INFO club.throwable.delay.DelayQueueMain - 延遲處理訂單消息,訂單[ORDER_ID_10086]-創(chuàng)建時(shí)間為:2019-08-20 10:16:08,超時(shí)時(shí)間為:2019-08-20 10:16:13
10:16:14.237 [DelayWorker] INFO club.throwable.delay.DelayQueueMain - 延遲處理訂單消息,訂單[ORDER_ID_10087]-創(chuàng)建時(shí)間為:2019-08-20 10:16:08,超時(shí)時(shí)間為:2019-08-20 10:16:14
10:16:18.237 [DelayWorker] INFO club.throwable.delay.DelayQueueMain - 延遲處理訂單消息,訂單[ORDER_ID_10088]-創(chuàng)建時(shí)間為:2019-08-20 10:16:08,超時(shí)時(shí)間為:2019-08-20 10:16:18

調(diào)度框架 + MySQL

使用調(diào)度框架對 MySQL 表進(jìn)行短間隔輪詢是實(shí)現(xiàn)難度比較低的方案,通常服務(wù)剛上線,表數(shù)據(jù)不多并且實(shí)時(shí)性不高的情況下應(yīng)該首選這個(gè)方案。不過要注意以下幾點(diǎn):

MySQL

引入 Quartz 、 MySQL 的Java驅(qū)動(dòng)包和 spring-boot-starter-jdbc (這里只是為了方便用相對輕量級的框架實(shí)現(xiàn),生產(chǎn)中可以按場景按需選擇其他更合理的框架):

<dependency>
  <groupId>mysql</groupId>
  <artifactId>mysql-connector-java</artifactId>
  <version>5.1.48</version>
  <scope>test</scope>
</dependency>
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-jdbc</artifactId>
  <version>2.1.7.RELEASE</version>
  <scope>test</scope>
</dependency>
<dependency>
  <groupId>org.quartz-scheduler</groupId>
  <artifactId>quartz</artifactId>
  <version>2.3.1</version>
  <scope>test</scope>
</dependency>

假設(shè)表設(shè)計(jì)如下:

CREATE DATABASE `delayTask` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_520_ci;

USE `delayTask`;

CREATE TABLE `t_order_message`
(
  id      BIGINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
  order_id   VARCHAR(50) NOT NULL COMMENT '訂單ID',
  create_time DATETIME  NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '創(chuàng)建日期時(shí)間',
  edit_time  DATETIME  NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改日期時(shí)間',
  retry_times TINYINT   NOT NULL DEFAULT 0 COMMENT '重試次數(shù)',
  order_status TINYINT   NOT NULL DEFAULT 0 COMMENT '訂單狀態(tài)',
  INDEX idx_order_id (order_id),
  INDEX idx_create_time (create_time)
) COMMENT '訂單信息表';

# 寫入兩條測試數(shù)據(jù)
INSERT INTO t_order_message(order_id) VALUES ('10086'),('10087');

編寫代碼:

// 常量
public class OrderConstants {

  public static final int MAX_RETRY_TIMES = 5;

  public static final int PENDING = 0;

  public static final int SUCCESS = 1;

  public static final int FAIL = -1;

  public static final int LIMIT = 10;
}

// 實(shí)體
@Builder
@Data
public class OrderMessage {

  private Long id;
  private String orderId;
  private LocalDateTime createTime;
  private LocalDateTime editTime;
  private Integer retryTimes;
  private Integer orderStatus;
}

// DAO
@RequiredArgsConstructor
public class OrderMessageDao {

  private final JdbcTemplate jdbcTemplate;

  private static final ResultSetExtractor<List<OrderMessage>> M = r -> {
    List<OrderMessage> list = Lists.newArrayList();
    while (r.next()) {
      list.add(OrderMessage.builder()
          .id(r.getLong("id"))
          .orderId(r.getString("order_id"))
          .createTime(r.getTimestamp("create_time").toLocalDateTime())
          .editTime(r.getTimestamp("edit_time").toLocalDateTime())
          .retryTimes(r.getInt("retry_times"))
          .orderStatus(r.getInt("order_status"))
          .build());
    }
    return list;
  };

  public List<OrderMessage> selectPendingRecords(LocalDateTime start,
                          LocalDateTime end,
                          List<Integer> statusList,
                          int maxRetryTimes,
                          int limit) {
    StringJoiner joiner = new StringJoiner(",");
    statusList.forEach(s -> joiner.add(String.valueOf(s)));
    return jdbcTemplate.query("SELECT * FROM t_order_message WHERE create_time >= ? AND create_time <= ? " +
            "AND order_status IN (?) AND retry_times < ? LIMIT ?",
        p -> {
          p.setTimestamp(1, Timestamp.valueOf(start));
          p.setTimestamp(2, Timestamp.valueOf(end));
          p.setString(3, joiner.toString());
          p.setInt(4, maxRetryTimes);
          p.setInt(5, limit);
        }, M);
  }

  public int updateOrderStatus(Long id, int status) {
    return jdbcTemplate.update("UPDATE t_order_message SET order_status = ?,edit_time = ? WHERE id =?",
        p -> {
          p.setInt(1, status);
          p.setTimestamp(2, Timestamp.valueOf(LocalDateTime.now()));
          p.setLong(3, id);
        });
  }
}

// Service
@RequiredArgsConstructor
public class OrderMessageService {

  private static final Logger LOGGER = LoggerFactory.getLogger(OrderMessageService.class);

  private final OrderMessageDao orderMessageDao;

  private static final List<Integer> STATUS = Lists.newArrayList();

  static {
    STATUS.add(OrderConstants.PENDING);
    STATUS.add(OrderConstants.FAIL);
  }

  public void executeDelayJob() {
    LOGGER.info("訂單處理定時(shí)任務(wù)開始執(zhí)行......");
    LocalDateTime end = LocalDateTime.now();
    // 一天前
    LocalDateTime start = end.minusDays(1);
    List<OrderMessage> list = orderMessageDao.selectPendingRecords(start, end, STATUS, OrderConstants.MAX_RETRY_TIMES, OrderConstants.LIMIT);
    if (!list.isEmpty()) {
      for (OrderMessage m : list) {
        LOGGER.info("處理訂單[{}],狀態(tài)由{}更新為{}", m.getOrderId(), m.getOrderStatus(), OrderConstants.SUCCESS);
        // 這里其實(shí)可以優(yōu)化為批量更新
        orderMessageDao.updateOrderStatus(m.getId(), OrderConstants.SUCCESS);
      }
    }
    LOGGER.info("訂單處理定時(shí)任務(wù)開始完畢......");
  }
}

// Job
@DisallowConcurrentExecution
public class OrderMessageDelayJob implements Job {

  @Override
  public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
    OrderMessageService service = (OrderMessageService) jobExecutionContext.getMergedJobDataMap().get("orderMessageService");
    service.executeDelayJob();
  }

  public static void main(String[] args) throws Exception {
    HikariConfig config = new HikariConfig();
    config.setJdbcUrl("jdbc:mysql://localhost:3306/delayTask?useSSL=false&characterEncoding=utf8");
    config.setDriverClassName(Driver.class.getName());
    config.setUsername("root");
    config.setPassword("root");
    HikariDataSource dataSource = new HikariDataSource(config);
    OrderMessageDao orderMessageDao = new OrderMessageDao(new JdbcTemplate(dataSource));
    OrderMessageService service = new OrderMessageService(orderMessageDao);
    // 內(nèi)存模式的調(diào)度器
    StdSchedulerFactory factory = new StdSchedulerFactory();
    Scheduler scheduler = factory.getScheduler();
    // 這里沒有用到IOC容器,直接用Quartz數(shù)據(jù)集合傳遞服務(wù)引用
    JobDataMap jobDataMap = new JobDataMap();
    jobDataMap.put("orderMessageService", service);
    // 新建Job
    JobDetail job = JobBuilder.newJob(OrderMessageDelayJob.class)
        .withIdentity("orderMessageDelayJob", "delayJob")
        .usingJobData(jobDataMap)
        .build();
    // 新建觸發(fā)器,10秒執(zhí)行一次
    Trigger trigger = TriggerBuilder.newTrigger()
        .withIdentity("orderMessageDelayTrigger", "delayJob")
        .withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(10).repeatForever())
        .build();
    scheduler.scheduleJob(job, trigger);
    // 啟動(dòng)調(diào)度器
    scheduler.start();
    Thread.sleep(Integer.MAX_VALUE);
  }
}

這個(gè)例子里面用了 create_time 做輪詢,實(shí)際上可以添加一個(gè)調(diào)度時(shí)間 schedule_time 列做輪詢,這樣子才能更容易定制空閑時(shí)和忙碌時(shí)候的調(diào)度策略。上面的示例的運(yùn)行效果如下:

11:58:27.202 [main] INFO org.quartz.core.QuartzScheduler - Scheduler meta-data: Quartz Scheduler (v2.3.1) 'DefaultQuartzScheduler' with instanceId 'NON_CLUSTERED'
 Scheduler class: 'org.quartz.core.QuartzScheduler' - running locally.
 NOT STARTED.
 Currently in standby mode.
 Number of jobs executed: 0
 Using thread pool 'org.quartz.simpl.SimpleThreadPool' - with 10 threads.
 Using job-store 'org.quartz.simpl.RAMJobStore' - which does not support persistence. and is not clustered.

11:58:27.202 [main] INFO org.quartz.impl.StdSchedulerFactory - Quartz scheduler 'DefaultQuartzScheduler' initialized from default resource file in Quartz package: 'quartz.properties'
11:58:27.202 [main] INFO org.quartz.impl.StdSchedulerFactory - Quartz scheduler version: 2.3.1
11:58:27.209 [main] INFO org.quartz.core.QuartzScheduler - Scheduler DefaultQuartzScheduler_$_NON_CLUSTERED started.
11:58:27.212 [DefaultQuartzScheduler_QuartzSchedulerThread] DEBUG org.quartz.core.QuartzSchedulerThread - batch acquisition of 1 triggers
11:58:27.217 [DefaultQuartzScheduler_QuartzSchedulerThread] DEBUG org.quartz.simpl.PropertySettingJobFactory - Producing instance of Job 'delayJob.orderMessageDelayJob', class=club.throwable.jdbc.OrderMessageDelayJob
11:58:27.219 [HikariPool-1 connection adder] DEBUG com.zaxxer.hikari.pool.HikariPool - HikariPool-1 - Added connection com.mysql.jdbc.JDBC4Connection@10eb8c53
11:58:27.220 [DefaultQuartzScheduler_QuartzSchedulerThread] DEBUG org.quartz.core.QuartzSchedulerThread - batch acquisition of 0 triggers
11:58:27.221 [DefaultQuartzScheduler_Worker-1] DEBUG org.quartz.core.JobRunShell - Calling execute on job delayJob.orderMessageDelayJob
11:58:34.440 [DefaultQuartzScheduler_Worker-1] INFO club.throwable.jdbc.OrderMessageService - 訂單處理定時(shí)任務(wù)開始執(zhí)行......
11:58:34.451 [HikariPool-1 connection adder] DEBUG com.zaxxer.hikari.pool.HikariPool - HikariPool-1 - Added connection com.mysql.jdbc.JDBC4Connection@3d27ece4
11:58:34.459 [HikariPool-1 connection adder] DEBUG com.zaxxer.hikari.pool.HikariPool - HikariPool-1 - Added connection com.mysql.jdbc.JDBC4Connection@64e808af
11:58:34.470 [HikariPool-1 connection adder] DEBUG com.zaxxer.hikari.pool.HikariPool - HikariPool-1 - Added connection com.mysql.jdbc.JDBC4Connection@79c8c2b7
11:58:34.477 [HikariPool-1 connection adder] DEBUG com.zaxxer.hikari.pool.HikariPool - HikariPool-1 - Added connection com.mysql.jdbc.JDBC4Connection@19a62369
11:58:34.485 [HikariPool-1 connection adder] DEBUG com.zaxxer.hikari.pool.HikariPool - HikariPool-1 - Added connection com.mysql.jdbc.JDBC4Connection@1673d017
11:58:34.485 [HikariPool-1 connection adder] DEBUG com.zaxxer.hikari.pool.HikariPool - HikariPool-1 - After adding stats (total=10, active=0, idle=10, waiting=0)
11:58:34.559 [DefaultQuartzScheduler_Worker-1] DEBUG org.springframework.jdbc.core.JdbcTemplate - Executing prepared SQL query
11:58:34.565 [DefaultQuartzScheduler_Worker-1] DEBUG org.springframework.jdbc.core.JdbcTemplate - Executing prepared SQL statement [SELECT * FROM t_order_message WHERE create_time >= ? AND create_time <= ? AND order_status IN (?) AND retry_times < ? LIMIT ?]
11:58:34.645 [DefaultQuartzScheduler_Worker-1] DEBUG org.springframework.jdbc.datasource.DataSourceUtils - Fetching JDBC Connection from DataSource
11:58:35.210 [DefaultQuartzScheduler_Worker-1] DEBUG org.springframework.jdbc.core.JdbcTemplate - SQLWarning ignored: SQL state '22007', error code '1292', message [Truncated incorrect DOUBLE value: '0,-1']
11:58:35.335 [DefaultQuartzScheduler_Worker-1] INFO club.throwable.jdbc.OrderMessageService - 處理訂單[10086],狀態(tài)由0更新為1
11:58:35.342 [DefaultQuartzScheduler_Worker-1] DEBUG org.springframework.jdbc.core.JdbcTemplate - Executing prepared SQL update
11:58:35.346 [DefaultQuartzScheduler_Worker-1] DEBUG org.springframework.jdbc.core.JdbcTemplate - Executing prepared SQL statement [UPDATE t_order_message SET order_status = ?,edit_time = ? WHERE id =?]
11:58:35.347 [DefaultQuartzScheduler_Worker-1] DEBUG org.springframework.jdbc.datasource.DataSourceUtils - Fetching JDBC Connection from DataSource
11:58:35.354 [DefaultQuartzScheduler_Worker-1] INFO club.throwable.jdbc.OrderMessageService - 處理訂單[10087],狀態(tài)由0更新為1
11:58:35.355 [DefaultQuartzScheduler_Worker-1] DEBUG org.springframework.jdbc.core.JdbcTemplate - Executing prepared SQL update
11:58:35.355 [DefaultQuartzScheduler_Worker-1] DEBUG org.springframework.jdbc.core.JdbcTemplate - Executing prepared SQL statement [UPDATE t_order_message SET order_status = ?,edit_time = ? WHERE id =?]
11:58:35.355 [DefaultQuartzScheduler_Worker-1] DEBUG org.springframework.jdbc.datasource.DataSourceUtils - Fetching JDBC Connection from DataSource
11:58:35.361 [DefaultQuartzScheduler_Worker-1] INFO club.throwable.jdbc.OrderMessageService - 訂單處理定時(shí)任務(wù)開始完畢......
11:58:35.363 [DefaultQuartzScheduler_QuartzSchedulerThread] DEBUG org.quartz.core.QuartzSchedulerThread - batch acquisition of 1 triggers
11:58:37.206 [DefaultQuartzScheduler_QuartzSchedulerThread] DEBUG org.quartz.simpl.PropertySettingJobFactory - Producing instance of Job 'delayJob.orderMessageDelayJob', class=club.throwable.jdbc.OrderMessageDelayJob
11:58:37.206 [DefaultQuartzScheduler_QuartzSchedulerThread] DEBUG org.quartz.core.QuartzSchedulerThread - batch acquisition of 0 triggers

RabbitMQ死信隊(duì)列

使用 RabbitMQ 死信隊(duì)列依賴于 RabbitMQ 的兩個(gè)特性: TTLDLX

TTLTime To Live ,消息存活時(shí)間,包括兩個(gè)維度:隊(duì)列消息存活時(shí)間和消息本身的存活時(shí)間。

DLXDead Letter Exchange ,死信交換器。

畫個(gè)圖描述一下這兩個(gè)特性:

下面為了簡單起見, TTL 使用了針對隊(duì)列的維度。引入 RabbitMQ 的Java驅(qū)動(dòng):

<dependency>
  <groupId>com.rabbitmq</groupId>
  <artifactId>amqp-client</artifactId>
  <version>5.7.3</version>
  <scope>test</scope>
</dependency>

代碼如下:

public class DlxMain {

  private static final DateTimeFormatter F = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
  private static final Logger LOGGER = LoggerFactory.getLogger(DlxMain.class);

  public static void main(String[] args) throws Exception {
    ConnectionFactory factory = new ConnectionFactory();
    Connection connection = factory.newConnection();
    Channel producerChannel = connection.createChannel();
    Channel consumerChannel = connection.createChannel();
    // dlx交換器名稱為dlx.exchange,類型是direct,綁定鍵為dlx.key,隊(duì)列名為dlx.queue
    producerChannel.exchangeDeclare("dlx.exchange", "direct");
    producerChannel.queueDeclare("dlx.queue", false, false, false, null);
    producerChannel.queueBind("dlx.queue", "dlx.exchange", "dlx.key");
    Map<String, Object> queueArgs = new HashMap<>();
    // 設(shè)置隊(duì)列消息過期時(shí)間,5秒
    queueArgs.put("x-message-ttl", 5000);
    // 指定DLX相關(guān)參數(shù)
    queueArgs.put("x-dead-letter-exchange", "dlx.exchange");
    queueArgs.put("x-dead-letter-routing-key", "dlx.key");
    // 聲明業(yè)務(wù)隊(duì)列
    producerChannel.queueDeclare("business.queue", false, false, false, queueArgs);
    ExecutorService executorService = Executors.newSingleThreadExecutor(r -> {
      Thread thread = new Thread(r);
      thread.setDaemon(true);
      thread.setName("DlxConsumer");
      return thread;
    });
    // 啟動(dòng)消費(fèi)者
    executorService.execute(() -> {
      try {
        consumerChannel.basicConsume("dlx.queue", true, new DlxConsumer(consumerChannel));
      } catch (IOException e) {
        LOGGER.error(e.getMessage(), e);
      }
    });
    OrderMessage message = new OrderMessage("10086");
    producerChannel.basicPublish("", "business.queue", MessageProperties.TEXT_PLAIN,
        message.getDescription().getBytes(StandardCharsets.UTF_8));
    LOGGER.info("發(fā)送消息成功,訂單ID:{}", message.getOrderId());

    message = new OrderMessage("10087");
    producerChannel.basicPublish("", "business.queue", MessageProperties.TEXT_PLAIN,
        message.getDescription().getBytes(StandardCharsets.UTF_8));
    LOGGER.info("發(fā)送消息成功,訂單ID:{}", message.getOrderId());

    message = new OrderMessage("10088");
    producerChannel.basicPublish("", "business.queue", MessageProperties.TEXT_PLAIN,
        message.getDescription().getBytes(StandardCharsets.UTF_8));
    LOGGER.info("發(fā)送消息成功,訂單ID:{}", message.getOrderId());

    Thread.sleep(Integer.MAX_VALUE);
  }

  private static class DlxConsumer extends DefaultConsumer {

    DlxConsumer(Channel channel) {
      super(channel);
    }

    @Override
    public void handleDelivery(String consumerTag,
                  Envelope envelope,
                  AMQP.BasicProperties properties,
                  byte[] body) throws IOException {
      LOGGER.info("處理消息成功:{}", new String(body, StandardCharsets.UTF_8));
    }
  }

  private static class OrderMessage {

    private final String orderId;
    private final long timestamp;
    private final String description;

    OrderMessage(String orderId) {
      this.orderId = orderId;
      this.timestamp = System.currentTimeMillis();
      this.description = String.format("訂單[%s],訂單創(chuàng)建時(shí)間為:%s", orderId,
          LocalDateTime.ofInstant(Instant.ofEpochMilli(timestamp), ZoneId.systemDefault()).format(F));
    }

    public String getOrderId() {
      return orderId;
    }

    public long getTimestamp() {
      return timestamp;
    }

    public String getDescription() {
      return description;
    }
  }
}

運(yùn)行 main() 方法結(jié)果如下:

16:35:58.638 [main] INFO club.throwable.dlx.DlxMain - 發(fā)送消息成功,訂單ID:10086
16:35:58.641 [main] INFO club.throwable.dlx.DlxMain - 發(fā)送消息成功,訂單ID:10087
16:35:58.641 [main] INFO club.throwable.dlx.DlxMain - 發(fā)送消息成功,訂單ID:10088
16:36:03.646 [pool-1-thread-4] INFO club.throwable.dlx.DlxMain - 處理消息成功:訂單[10086],訂單創(chuàng)建時(shí)間為:2019-08-20 16:35:58
16:36:03.670 [pool-1-thread-5] INFO club.throwable.dlx.DlxMain - 處理消息成功:訂單[10087],訂單創(chuàng)建時(shí)間為:2019-08-20 16:35:58
16:36:03.670 [pool-1-thread-6] INFO club.throwable.dlx.DlxMain - 處理消息成功:訂單[10088],訂單創(chuàng)建時(shí)間為:2019-08-20 16:35:58

時(shí)間輪

時(shí)間輪 TimingWheel 是一種高效、低延遲的調(diào)度數(shù)據(jù)結(jié)構(gòu),底層采用數(shù)組實(shí)現(xiàn)存儲(chǔ)任務(wù)列表的環(huán)形隊(duì)列,示意圖如下:

這里暫時(shí)不對時(shí)間輪和其實(shí)現(xiàn)作分析,只簡單舉例說明怎么使用時(shí)間輪實(shí)現(xiàn)延時(shí)任務(wù)。這里使用 Netty 提供的 HashedWheelTimer ,引入依賴:

<dependency>
  <groupId>io.netty</groupId>
  <artifactId>netty-common</artifactId>
  <version>4.1.39.Final</version>
</dependency>

代碼如下:

public class HashedWheelTimerMain {

  private static final DateTimeFormatter F = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS");

  public static void main(String[] args) throws Exception {
    AtomicInteger counter = new AtomicInteger();
    ThreadFactory factory = r -> {
      Thread thread = new Thread(r);
      thread.setDaemon(true);
      thread.setName("HashedWheelTimerWorker-" + counter.getAndIncrement());
      return thread;
    };
    // tickDuration - 每tick一次的時(shí)間間隔, 每tick一次就會(huì)到達(dá)下一個(gè)槽位
    // unit - tickDuration的時(shí)間單位
    // ticksPerWhee - 時(shí)間輪中的槽位數(shù)
    Timer timer = new HashedWheelTimer(factory, 1, TimeUnit.SECONDS, 60);
    TimerTask timerTask = new DefaultTimerTask("10086");
    timer.newTimeout(timerTask, 5, TimeUnit.SECONDS);
    timerTask = new DefaultTimerTask("10087");
    timer.newTimeout(timerTask, 10, TimeUnit.SECONDS);
    timerTask = new DefaultTimerTask("10088");
    timer.newTimeout(timerTask, 15, TimeUnit.SECONDS);
    Thread.sleep(Integer.MAX_VALUE);
  }

  private static class DefaultTimerTask implements TimerTask {

    private final String orderId;
    private final long timestamp;

    public DefaultTimerTask(String orderId) {
      this.orderId = orderId;
      this.timestamp = System.currentTimeMillis();
    }

    @Override
    public void run(Timeout timeout) throws Exception {
      System.out.println(String.format("任務(wù)執(zhí)行時(shí)間:%s,訂單創(chuàng)建時(shí)間:%s,訂單ID:%s",
          LocalDateTime.now().format(F), LocalDateTime.ofInstant(Instant.ofEpochMilli(timestamp), ZoneId.systemDefault()).format(F), orderId));
    }
  }
}

運(yùn)行結(jié)果:

任務(wù)執(zhí)行時(shí)間:2019-08-20 17:19:49.310,訂單創(chuàng)建時(shí)間:2019-08-20 17:19:43.294,訂單ID:10086
任務(wù)執(zhí)行時(shí)間:2019-08-20 17:19:54.297,訂單創(chuàng)建時(shí)間:2019-08-20 17:19:43.301,訂單ID:10087
任務(wù)執(zhí)行時(shí)間:2019-08-20 17:19:59.297,訂單創(chuàng)建時(shí)間:2019-08-20 17:19:43.301,訂單ID:10088

一般來說,任務(wù)執(zhí)行的時(shí)候應(yīng)該使用另外的業(yè)務(wù)線程池,以免阻塞時(shí)間輪本身的運(yùn)動(dòng)。

選用的方案實(shí)現(xiàn)過程

最終選用了基于 Redis 的有序集合 Sorted SetQuartz 短輪詢進(jìn)行實(shí)現(xiàn)。具體方案是:

  • 訂單創(chuàng)建的時(shí)候,訂單ID和當(dāng)前時(shí)間戳分別作為 Sorted Set 的member和score添加到訂單隊(duì)列 Sorted Set 中。
  • 訂單創(chuàng)建的時(shí)候,訂單ID和推送內(nèi)容 JSON 字符串分別作為field和value添加到訂單隊(duì)列內(nèi)容 Hash 中。
  • 第1步和第2步操作的時(shí)候用 Lua 腳本保證原子性。
  • 使用一個(gè)異步線程通過 Sorted Set 的命令 ZREVRANGEBYSCORE 彈出指定數(shù)量的訂單ID對應(yīng)的訂單隊(duì)列內(nèi)容 Hash 中的訂單推送內(nèi)容數(shù)據(jù)進(jìn)行處理。

對于第4點(diǎn)處理有兩種方案:

  • 方案一:彈出訂單內(nèi)容數(shù)據(jù)的同時(shí)進(jìn)行數(shù)據(jù)刪除,也就是 ZREVRANGEBYSCORE 、 ZREMHDEL 命令要在同一個(gè) Lua 腳本中執(zhí)行,這樣的話 Lua 腳本的編寫難度大,并且由于彈出數(shù)據(jù)已經(jīng)在 Redis 中刪除,如果數(shù)據(jù)處理失敗則可能需要從數(shù)據(jù)庫重新查詢補(bǔ)償。
  • 方案二:彈出訂單內(nèi)容數(shù)據(jù)之后,在數(shù)據(jù)處理完成的時(shí)候再主動(dòng)刪除訂單隊(duì)列 Sorted Set 和訂單隊(duì)列內(nèi)容 Hash 中對應(yīng)的數(shù)據(jù),這樣的話需要控制并發(fā),有重復(fù)執(zhí)行的可能性。

最終暫時(shí)選用了方案一,也就是從 Sorted Set 彈出訂單ID并且從 Hash 中獲取完推送數(shù)據(jù)之后馬上刪除這兩個(gè)集合中對應(yīng)的數(shù)據(jù)。方案的流程圖大概是這樣:

這里先詳細(xì)說明一下用到的 Redis 命令。

Sorted Set相關(guān)命令

ZADD 命令 - 將一個(gè)或多個(gè)成員元素及其分?jǐn)?shù)值加入到有序集當(dāng)中。

ZADD KEY SCORE1 VALUE1.. SCOREN VALUEN

ZREVRANGEBYSCORE 命令 - 返回有序集中指定分?jǐn)?shù)區(qū)間內(nèi)的所有的成員。有序集成員按分?jǐn)?shù)值遞減(從大到小)的次序排列。

ZREVRANGEBYSCORE key max min [WITHSCORES] [LIMIT offset count]

max:分?jǐn)?shù)區(qū)間 - 最大分?jǐn)?shù)。 min:分?jǐn)?shù)區(qū)間 - 最小分?jǐn)?shù)。 WITHSCORES:可選參數(shù),是否返回分?jǐn)?shù)值,指定則會(huì)返回得分值。 LIMIT:可選參數(shù),offset和count原理和 MySQLLIMIT offset,size 一致,如果不指定此參數(shù)則返回整個(gè)集合的數(shù)據(jù)。 ZREM 命令 - 用于移除有序集中的一個(gè)或多個(gè)成員,不存在的成員將被忽略。

ZREM key member [member ...]

Hash相關(guān)命令 HMSET 命令 - 同時(shí)將多個(gè)field-value(字段-值)對設(shè)置到哈希表中。

HMSET KEY_NAME FIELD1 VALUE1 ...FIELDN VALUEN

HDEL 命令 - 刪除哈希表key中的一個(gè)或多個(gè)指定字段,不存在的字段將被忽略。

HDEL KEY_NAME FIELD1.. FIELDN

Lua相關(guān) 加載 Lua 腳本并且返回腳本的 SHA-1 字符串: SCRIPT LOAD script 。 執(zhí)行已經(jīng)加載的 Lua 腳本: EVALSHA sha1 numkeys key [key ...] arg [arg ...]unpack 函數(shù)可以把 table 類型的參數(shù)轉(zhuǎn)化為可變參數(shù),不過需要注意的是 unpack 函數(shù)必須使用在非變量定義的函數(shù)調(diào)用的最后一個(gè)參數(shù),否則會(huì)失效,詳細(xì)見 Stackoverflow 的提問 table.unpack() only returns the first element 。

PS:如果不熟悉Lua語言,建議系統(tǒng)學(xué)習(xí)一下,因?yàn)橄胗煤肦edis,一定離不開Lua。

引入依賴:

<dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-dependencies</artifactId>
      <version>2.1.7.RELEASE</version>
      <type>pom</type>
      <scope>import</scope>
    </dependency>
  </dependencies>
</dependencyManagement>

<dependencies>
  <dependency>
    <groupId>org.quartz-scheduler</groupId>
    <artifactId>quartz</artifactId>
    <version>2.3.1</version>
  </dependency>
  <dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>3.1.0</version>
  </dependency>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
  </dependency>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jdbc</artifactId>
  </dependency>  
  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context-support</artifactId>
    <version>5.1.9.RELEASE</version>
  </dependency> 
  <dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.8</version>
    <scope>provided</scope>
  </dependency>
  <dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.59</version>
  </dependency>    
</dependencies>

編寫 Lua 腳本 /lua/enqueue.lua/lua/dequeue.lua

-- /lua/enqueue.lua
local zset_key = KEYS[1]
local hash_key = KEYS[2]
local zset_value = ARGV[1]
local zset_score = ARGV[2]
local hash_field = ARGV[3]
local hash_value = ARGV[4]
redis.call('ZADD', zset_key, zset_score, zset_value)
redis.call('HSET', hash_key, hash_field, hash_value)
return nil

-- /lua/dequeue.lua
-- 參考jesque的部分Lua腳本實(shí)現(xiàn)
local zset_key = KEYS[1]
local hash_key = KEYS[2]
local min_score = ARGV[1]
local max_score = ARGV[2]
local offset = ARGV[3]
local limit = ARGV[4]
-- TYPE命令的返回結(jié)果是{'ok':'zset'}這樣子,這里利用next做一輪迭代
local status, type = next(redis.call('TYPE', zset_key))
if status ~= nil and status == 'ok' then
  if type == 'zset' then
    local list = redis.call('ZREVRANGEBYSCORE', zset_key, max_score, min_score, 'LIMIT', offset, limit)
    if list ~= nil and #list > 0 then
      -- unpack函數(shù)能把table轉(zhuǎn)化為可變參數(shù)
      redis.call('ZREM', zset_key, unpack(list))
      local result = redis.call('HMGET', hash_key, unpack(list))
      redis.call('HDEL', hash_key, unpack(list))
      return result
    end
  end
end
return nil

編寫核心API代碼:

// Jedis提供者
@Component
public class JedisProvider implements InitializingBean {

  private JedisPool jedisPool;

  @Override
  public void afterPropertiesSet() throws Exception {
    jedisPool = new JedisPool();
  }

  public Jedis provide(){
    return jedisPool.getResource();
  }
}

// OrderMessage
@Data
public class OrderMessage {

  private String orderId;
  private BigDecimal amount;
  private Long userId;
}

// 延遲隊(duì)列接口
public interface OrderDelayQueue {

  void enqueue(OrderMessage message);

  List<OrderMessage> dequeue(String min, String max, String offset, String limit);

  List<OrderMessage> dequeue();

  String enqueueSha();

  String dequeueSha();
}

// 延遲隊(duì)列實(shí)現(xiàn)類
@RequiredArgsConstructor
@Component
public class RedisOrderDelayQueue implements OrderDelayQueue, InitializingBean {

  private static final String MIN_SCORE = "0";
  private static final String OFFSET = "0";
  private static final String LIMIT = "10";
  private static final String ORDER_QUEUE = "ORDER_QUEUE";
  private static final String ORDER_DETAIL_QUEUE = "ORDER_DETAIL_QUEUE";
  private static final String ENQUEUE_LUA_SCRIPT_LOCATION = "/lua/enqueue.lua";
  private static final String DEQUEUE_LUA_SCRIPT_LOCATION = "/lua/dequeue.lua";
  private static final AtomicReference<String> ENQUEUE_LUA_SHA = new AtomicReference<>();
  private static final AtomicReference<String> DEQUEUE_LUA_SHA = new AtomicReference<>();
  private static final List<String> KEYS = Lists.newArrayList();

  private final JedisProvider jedisProvider;

  static {
    KEYS.add(ORDER_QUEUE);
    KEYS.add(ORDER_DETAIL_QUEUE);
  }

  @Override
  public void enqueue(OrderMessage message) {
    List<String> args = Lists.newArrayList();
    args.add(message.getOrderId());
    args.add(String.valueOf(System.currentTimeMillis()));
    args.add(message.getOrderId());
    args.add(JSON.toJSONString(message));
    try (Jedis jedis = jedisProvider.provide()) {
      jedis.evalsha(ENQUEUE_LUA_SHA.get(), KEYS, args);
    }
  }

  @Override
  public List<OrderMessage> dequeue() {
    // 30分鐘之前
    String maxScore = String.valueOf(System.currentTimeMillis() - 30 * 60 * 1000);
    return dequeue(MIN_SCORE, maxScore, OFFSET, LIMIT);
  }

  @SuppressWarnings("unchecked")
  @Override
  public List<OrderMessage> dequeue(String min, String max, String offset, String limit) {
    List<String> args = new ArrayList<>();
    args.add(max);
    args.add(min);
    args.add(offset);
    args.add(limit);
    List<OrderMessage> result = Lists.newArrayList();
    try (Jedis jedis = jedisProvider.provide()) {
      List<String> eval = (List<String>) jedis.evalsha(DEQUEUE_LUA_SHA.get(), KEYS, args);
      if (null != eval) {
        for (String e : eval) {
          result.add(JSON.parseObject(e, OrderMessage.class));
        }
      }
    }
    return result;
  }

  @Override
  public String enqueueSha() {
    return ENQUEUE_LUA_SHA.get();
  }

  @Override
  public String dequeueSha() {
    return DEQUEUE_LUA_SHA.get();
  }

  @Override
  public void afterPropertiesSet() throws Exception {
    // 加載Lua腳本
    loadLuaScript();
  }

  private void loadLuaScript() throws Exception {
    try (Jedis jedis = jedisProvider.provide()) {
      ClassPathResource resource = new ClassPathResource(ENQUEUE_LUA_SCRIPT_LOCATION);
      String luaContent = StreamUtils.copyToString(resource.getInputStream(), StandardCharsets.UTF_8);
      String sha = jedis.scriptLoad(luaContent);
      ENQUEUE_LUA_SHA.compareAndSet(null, sha);
      resource = new ClassPathResource(DEQUEUE_LUA_SCRIPT_LOCATION);
      luaContent = StreamUtils.copyToString(resource.getInputStream(), StandardCharsets.UTF_8);
      sha = jedis.scriptLoad(luaContent);
      DEQUEUE_LUA_SHA.compareAndSet(null, sha);
    }
  }

  public static void main(String[] as) throws Exception {
    DateTimeFormatter f = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS");
    JedisProvider jedisProvider = new JedisProvider();
    jedisProvider.afterPropertiesSet();
    RedisOrderDelayQueue queue = new RedisOrderDelayQueue(jedisProvider);
    queue.afterPropertiesSet();
    // 寫入測試數(shù)據(jù)
    OrderMessage message = new OrderMessage();
    message.setAmount(BigDecimal.valueOf(10086));
    message.setOrderId("ORDER_ID_10086");
    message.setUserId(10086L);
    message.setTimestamp(LocalDateTime.now().format(f));
    List<String> args = Lists.newArrayList();
    args.add(message.getOrderId());
    // 測試需要,score設(shè)置為30分鐘之前
    args.add(String.valueOf(System.currentTimeMillis() - 30 * 60 * 1000));
    args.add(message.getOrderId());
    args.add(JSON.toJSONString(message));
    try (Jedis jedis = jedisProvider.provide()) {
      jedis.evalsha(ENQUEUE_LUA_SHA.get(), KEYS, args);
    }
    List<OrderMessage> dequeue = queue.dequeue();
    System.out.println(dequeue);
  }
}

這里先執(zhí)行一次 main() 方法驗(yàn)證一下延遲隊(duì)列是否生效:

[OrderMessage(orderId=ORDER_ID_10086, amount=10086, userId=10086, timestamp=2019-08-21 08:32:22.885)]

確定延遲隊(duì)列的代碼沒有問題,接著編寫一個(gè) QuartzJob 類型的消費(fèi)者 OrderMessageConsumer

@DisallowConcurrentExecution
@Component
public class OrderMessageConsumer implements Job {

  private static final AtomicInteger COUNTER = new AtomicInteger();
  private static final ExecutorService BUSINESS_WORKER_POOL = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors(), r -> {
    Thread thread = new Thread(r);
    thread.setDaemon(true);
    thread.setName("OrderMessageConsumerWorker-" + COUNTER.getAndIncrement());
    return thread;
  });
  private static final Logger LOGGER = LoggerFactory.getLogger(OrderMessageConsumer.class);

  @Autowired
  private OrderDelayQueue orderDelayQueue;

  @Override
  public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
    StopWatch stopWatch = new StopWatch();
    stopWatch.start();
    LOGGER.info("訂單消息處理定時(shí)任務(wù)開始執(zhí)行......");
    List<OrderMessage> messages = orderDelayQueue.dequeue();
    if (!messages.isEmpty()) {
      // 簡單的列表等分放到線程池中執(zhí)行
      List<List<OrderMessage>> partition = Lists.partition(messages, 2);
      int size = partition.size();
      final CountDownLatch latch = new CountDownLatch(size);
      for (List<OrderMessage> p : partition) {
        BUSINESS_WORKER_POOL.execute(new ConsumeTask(p, latch));
      }
      try {
        latch.await();
      } catch (InterruptedException ignore) {
        //ignore
      }
    }
    stopWatch.stop();
    LOGGER.info("訂單消息處理定時(shí)任務(wù)執(zhí)行完畢,耗時(shí):{} ms......", stopWatch.getTotalTimeMillis());
  }

  @RequiredArgsConstructor
  private static class ConsumeTask implements Runnable {

    private final List<OrderMessage> messages;
    private final CountDownLatch latch;

    @Override
    public void run() {
      try {
        // 實(shí)際上這里應(yīng)該單條捕獲異常
        for (OrderMessage message : messages) {
          LOGGER.info("處理訂單信息,內(nèi)容:{}", message);
        }
      } finally {
        latch.countDown();
      }
    }
  }
}

上面的消費(fèi)者設(shè)計(jì)的時(shí)候需要有以下考量:

  • 使用 @DisallowConcurrentExecution 注解不允許 Job 并發(fā)執(zhí)行,其實(shí)多個(gè) Job 并發(fā)執(zhí)行意義不大,因?yàn)槲覀儾捎玫氖嵌涕g隔的輪詢,而 Redis 是單線程處理命令,在客戶端做多線程其實(shí)效果不佳。
  • 線程池 BUSINESS_WORKER_POOL 的線程容量或者隊(duì)列應(yīng)該綜合 LIMIT 值、等分訂單信息列表中使用的 size 值以及 ConsumeTask 里面具體的執(zhí)行時(shí)間進(jìn)行考慮,這里只是為了方便使用了固定容量的線程池。
  • ConsumeTask 中應(yīng)該對每一條訂單信息的處理單獨(dú)捕獲異常和吞并異常,或者把處理單個(gè)訂單信息的邏輯封裝成一個(gè)不拋出異常的方法。

其他 Quartz 相關(guān)的代碼:

// Quartz配置類
@Configuration
public class QuartzAutoConfiguration {

  @Bean
  public SchedulerFactoryBean schedulerFactoryBean(QuartzAutowiredJobFactory quartzAutowiredJobFactory) {
    SchedulerFactoryBean factory = new SchedulerFactoryBean();
    factory.setAutoStartup(true);
    factory.setJobFactory(quartzAutowiredJobFactory);
    return factory;
  }

  @Bean
  public QuartzAutowiredJobFactory quartzAutowiredJobFactory() {
    return new QuartzAutowiredJobFactory();
  }

  public static class QuartzAutowiredJobFactory extends AdaptableJobFactory implements BeanFactoryAware {

    private AutowireCapableBeanFactory autowireCapableBeanFactory;

    @Override
    public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
      this.autowireCapableBeanFactory = (AutowireCapableBeanFactory) beanFactory;
    }

    @Override
    protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception {
      Object jobInstance = super.createJobInstance(bundle);
      // 這里利用AutowireCapableBeanFactory從新建的Job實(shí)例做一次自動(dòng)裝配,得到一個(gè)原型(prototype)的JobBean實(shí)例
      autowireCapableBeanFactory.autowireBean(jobInstance);
      return jobInstance;
    }
  }
}

這里暫時(shí)使用了內(nèi)存態(tài)的 RAMJobStore 去存放任務(wù)和觸發(fā)器的相關(guān)信息,如果在生產(chǎn)環(huán)境最好替換成基于 MySQL 也就是 JobStoreTX 進(jìn)行集群化,最后是啟動(dòng)函數(shù)和 CommandLineRunner 的實(shí)現(xiàn):

@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class, TransactionAutoConfiguration.class})
public class Application implements CommandLineRunner {

  @Autowired
  private Scheduler scheduler;

  @Autowired
  private JedisProvider jedisProvider;

  public static void main(String[] args) {
    SpringApplication.run(Application.class, args);
  }

  @Override
  public void run(String... args) throws Exception {
    // 準(zhǔn)備一些測試數(shù)據(jù)
    prepareOrderMessageData();
    JobDetail job = JobBuilder.newJob(OrderMessageConsumer.class)
        .withIdentity("OrderMessageConsumer", "DelayTask")
        .build();
    // 觸發(fā)器5秒觸發(fā)一次
    Trigger trigger = TriggerBuilder.newTrigger()
        .withIdentity("OrderMessageConsumerTrigger", "DelayTask")
        .withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(5).repeatForever())
        .build();
    scheduler.scheduleJob(job, trigger);
  }

  private void prepareOrderMessageData() throws Exception {
    DateTimeFormatter f = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS");
    try (Jedis jedis = jedisProvider.provide()) {
      List<OrderMessage> messages = Lists.newArrayList();
      for (int i = 0; i < 100; i++) {
        OrderMessage message = new OrderMessage();
        message.setAmount(BigDecimal.valueOf(i));
        message.setOrderId("ORDER_ID_" + i);
        message.setUserId((long) i);
        message.setTimestamp(LocalDateTime.now().format(f));
        messages.add(message);
      }
      // 這里暫時(shí)不使用Lua
      Map<String, Double> map = Maps.newHashMap();
      Map<String, String> hash = Maps.newHashMap();
      for (OrderMessage message : messages) {
        // 故意把score設(shè)計(jì)成30分鐘前
        map.put(message.getOrderId(), Double.valueOf(String.valueOf(System.currentTimeMillis() - 30 * 60 * 1000)));
        hash.put(message.getOrderId(), JSON.toJSONString(message));
      }
      jedis.zadd("ORDER_QUEUE", map);
      jedis.hmset("ORDER_DETAIL_QUEUE", hash);
    }
  }
}

輸出結(jié)果如下:

2019-08-21 22:45:59.518  INFO 33000 --- [ryBean_Worker-1] club.throwable.OrderMessageConsumer      : 訂單消息處理定時(shí)任務(wù)開始執(zhí)行......
2019-08-21 22:45:59.525  INFO 33000 --- [onsumerWorker-4] club.throwable.OrderMessageConsumer      : 處理訂單信息,內(nèi)容:OrderMessage(orderId=ORDER_ID_91, amount=91, userId=91, timestamp=2019-08-21 22:45:59.475)
2019-08-21 22:45:59.525  INFO 33000 --- [onsumerWorker-2] club.throwable.OrderMessageConsumer      : 處理訂單信息,內(nèi)容:OrderMessage(orderId=ORDER_ID_95, amount=95, userId=95, timestamp=2019-08-21 22:45:59.475)
2019-08-21 22:45:59.525  INFO 33000 --- [onsumerWorker-1] club.throwable.OrderMessageConsumer      : 處理訂單信息,內(nèi)容:OrderMessage(orderId=ORDER_ID_97, amount=97, userId=97, timestamp=2019-08-21 22:45:59.475)
2019-08-21 22:45:59.525  INFO 33000 --- [onsumerWorker-0] club.throwable.OrderMessageConsumer      : 處理訂單信息,內(nèi)容:OrderMessage(orderId=ORDER_ID_99, amount=99, userId=99, timestamp=2019-08-21 22:45:59.475)
2019-08-21 22:45:59.525  INFO 33000 --- [onsumerWorker-3] club.throwable.OrderMessageConsumer      : 處理訂單信息,內(nèi)容:OrderMessage(orderId=ORDER_ID_93, amount=93, userId=93, timestamp=2019-08-21 22:45:59.475)
2019-08-21 22:45:59.539  INFO 33000 --- [onsumerWorker-2] club.throwable.OrderMessageConsumer      : 處理訂單信息,內(nèi)容:OrderMessage(orderId=ORDER_ID_94, amount=94, userId=94, timestamp=2019-08-21 22:45:59.475)
2019-08-21 22:45:59.539  INFO 33000 --- [onsumerWorker-1] club.throwable.OrderMessageConsumer      : 處理訂單信息,內(nèi)容:OrderMessage(orderId=ORDER_ID_96, amount=96, userId=96, timestamp=2019-08-21 22:45:59.475)
2019-08-21 22:45:59.539  INFO 33000 --- [onsumerWorker-3] club.throwable.OrderMessageConsumer      : 處理訂單信息,內(nèi)容:OrderMessage(orderId=ORDER_ID_92, amount=92, userId=92, timestamp=2019-08-21 22:45:59.475)
2019-08-21 22:45:59.539  INFO 33000 --- [onsumerWorker-0] club.throwable.OrderMessageConsumer      : 處理訂單信息,內(nèi)容:OrderMessage(orderId=ORDER_ID_98, amount=98, userId=98, timestamp=2019-08-21 22:45:59.475)
2019-08-21 22:45:59.539  INFO 33000 --- [onsumerWorker-4] club.throwable.OrderMessageConsumer      : 處理訂單信息,內(nèi)容:OrderMessage(orderId=ORDER_ID_90, amount=90, userId=90, timestamp=2019-08-21 22:45:59.475)
2019-08-21 22:45:59.540  INFO 33000 --- [ryBean_Worker-1] club.throwable.OrderMessageConsumer      : 訂單消息處理定時(shí)任務(wù)執(zhí)行完畢,耗時(shí):22 ms......
2019-08-21 22:46:04.515  INFO 33000 --- [ryBean_Worker-2] club.throwable.OrderMessageConsumer      : 訂單消息處理定時(shí)任務(wù)開始執(zhí)行......
2019-08-21 22:46:04.516  INFO 33000 --- [onsumerWorker-5] club.throwable.OrderMessageConsumer      : 處理訂單信息,內(nèi)容:OrderMessage(orderId=ORDER_ID_89, amount=89, userId=89, timestamp=2019-08-21 22:45:59.475)
2019-08-21 22:46:04.516  INFO 33000 --- [onsumerWorker-6] club.throwable.OrderMessageConsumer      : 處理訂單信息,內(nèi)容:OrderMessage(orderId=ORDER_ID_87, amount=87, userId=87, timestamp=2019-08-21 22:45:59.475)
2019-08-21 22:46:04.516  INFO 33000 --- [onsumerWorker-7] club.throwable.OrderMessageConsumer      : 處理訂單信息,內(nèi)容:OrderMessage(orderId=ORDER_ID_85, amount=85, userId=85, timestamp=2019-08-21 22:45:59.475)
2019-08-21 22:46:04.516  INFO 33000 --- [onsumerWorker-5] club.throwable.OrderMessageConsumer      : 處理訂單信息,內(nèi)容:OrderMessage(orderId=ORDER_ID_88, amount=88, userId=88, timestamp=2019-08-21 22:45:59.475)
2019-08-21 22:46:04.516  INFO 33000 --- [onsumerWorker-2] club.throwable.OrderMessageConsumer      : 處理訂單信息,內(nèi)容:OrderMessage(orderId=ORDER_ID_83, amount=83, userId=83, timestamp=2019-08-21 22:45:59.475)
2019-08-21 22:46:04.516  INFO 33000 --- [onsumerWorker-1] club.throwable.OrderMessageConsumer      : 處理訂單信息,內(nèi)容:OrderMessage(orderId=ORDER_ID_81, amount=81, userId=81, timestamp=2019-08-21 22:45:59.475)
2019-08-21 22:46:04.516  INFO 33000 --- [onsumerWorker-6] club.throwable.OrderMessageConsumer      : 處理訂單信息,內(nèi)容:OrderMessage(orderId=ORDER_ID_86, amount=86, userId=86, timestamp=2019-08-21 22:45:59.475)
2019-08-21 22:46:04.516  INFO 33000 --- [onsumerWorker-2] club.throwable.OrderMessageConsumer      : 處理訂單信息,內(nèi)容:OrderMessage(orderId=ORDER_ID_82, amount=82, userId=82, timestamp=2019-08-21 22:45:59.475)
2019-08-21 22:46:04.516  INFO 33000 --- [onsumerWorker-7] club.throwable.OrderMessageConsumer      : 處理訂單信息,內(nèi)容:OrderMessage(orderId=ORDER_ID_84, amount=84, userId=84, timestamp=2019-08-21 22:45:59.475)
2019-08-21 22:46:04.516  INFO 33000 --- [onsumerWorker-1] club.throwable.OrderMessageConsumer      : 處理訂單信息,內(nèi)容:OrderMessage(orderId=ORDER_ID_80, amount=80, userId=80, timestamp=2019-08-21 22:45:59.475)
2019-08-21 22:46:04.516  INFO 33000 --- [ryBean_Worker-2] club.throwable.OrderMessageConsumer      : 訂單消息處理定時(shí)任務(wù)執(zhí)行完畢,耗時(shí):1 ms......
......

首次執(zhí)行的時(shí)候涉及到一些組件的初始化,會(huì)比較慢,后面看到由于我們只是簡單打印訂單信息,所以定時(shí)任務(wù)執(zhí)行比較快。如果在不調(diào)整當(dāng)前架構(gòu)的情況下,生產(chǎn)中需要注意:

  • 切換 JobStoreJDBC 模式, Quartz 官方有完整教程,或者看筆者之前翻譯的 Quartz 文檔。
  • 需要監(jiān)控或者收集任務(wù)的執(zhí)行狀態(tài),添加預(yù)警等等。

這里其實(shí)有一個(gè)性能隱患,命令 ZREVRANGEBYSCORE 的時(shí)間復(fù)雜度可以視為為 O(N)N 是集合的元素個(gè)數(shù),由于這里把所有的訂單信息都放進(jìn)了同一個(gè) Sorted Set ( ORDER_QUEUE )中,所以在一直有新增數(shù)據(jù)的時(shí)候, dequeue 腳本的時(shí)間復(fù)雜度一直比較高,后續(xù)訂單量升高之后會(huì)此處一定會(huì)成為性能瓶頸,后面會(huì)給出解決的方案。

小結(jié)

這篇文章主要從一個(gè)實(shí)際生產(chǎn)案例的仿真例子入手,分析了當(dāng)前延時(shí)任務(wù)的一些實(shí)現(xiàn)方案,還基于 RedisQuartz 給出了一個(gè)完整的示例。當(dāng)前的示例只是處于可運(yùn)行的狀態(tài),有些問題尚未解決。下一篇文章會(huì)著眼于解決兩個(gè)方面的問題:

  1. 分片。
  2. 監(jiān)控。

還有一點(diǎn), 架構(gòu)是基于業(yè)務(wù)形態(tài)演進(jìn)出來的,很多東西需要結(jié)合場景進(jìn)行方案設(shè)計(jì)和改進(jìn),思路僅供參考,切勿照搬代碼 。

以上所述是小編給大家介紹的使用Redis實(shí)現(xiàn)延時(shí)任務(wù)的解決方案,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友參考下吧!

相關(guān)文章

  • Spring boot+redis實(shí)現(xiàn)消息發(fā)布與訂閱的代碼

    Spring boot+redis實(shí)現(xiàn)消息發(fā)布與訂閱的代碼

    這篇文章主要介紹了Spring boot+redis實(shí)現(xiàn)消息發(fā)布與訂閱,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值需要的朋友可以參考下
    2020-04-04
  • Redis集群服務(wù)器的實(shí)現(xiàn)(圖文步驟)

    Redis集群服務(wù)器的實(shí)現(xiàn)(圖文步驟)

    本文介紹了Redis集群服務(wù)器的優(yōu)勢,為讀者提供了全面的Redis集群服務(wù)器知識(shí)和使用技巧,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-09-09
  • Redis主從架構(gòu)和高可用性實(shí)現(xiàn)過程

    Redis主從架構(gòu)和高可用性實(shí)現(xiàn)過程

    本文詳細(xì)介紹了使用Redis主從架構(gòu)和Linux虛擬服務(wù)器(LVS)實(shí)現(xiàn)高可用性的方法,并回顧了最近完成的Redis集群遷移部署過程,主從架構(gòu)通過復(fù)制數(shù)據(jù)來提高性能和數(shù)據(jù)冗余,而LVS用于實(shí)現(xiàn)負(fù)載均衡和故障切換,感興趣的朋友跟隨小編一起看看吧
    2024-09-09
  • Redis實(shí)現(xiàn)接口防抖的示例代碼

    Redis實(shí)現(xiàn)接口防抖的示例代碼

    本文介紹了一種通過AOP、自定義注解和Redis實(shí)現(xiàn)的接口防抖技術(shù),這種方法能有效避免因網(wǎng)絡(luò)波動(dòng)等原因短時(shí)間內(nèi)發(fā)送多個(gè)請求導(dǎo)致的數(shù)據(jù)重復(fù)添加問題,感興趣的可以了解一下
    2024-10-10
  • 利用redis實(shí)現(xiàn)聊天記錄轉(zhuǎn)存功能的全過程

    利用redis實(shí)現(xiàn)聊天記錄轉(zhuǎn)存功能的全過程

    社交類軟件聊天功能必不可少,聊天記錄存儲(chǔ)的方式也比較多,比如文本,數(shù)據(jù)庫,云等等,但是最好的選擇還是redis進(jìn)行存儲(chǔ),這篇文章主要給大家介紹了關(guān)于如何利用redis實(shí)現(xiàn)聊天記錄轉(zhuǎn)存功能的相關(guān)資料,需要的朋友可以參考下
    2021-08-08
  • Redis的數(shù)據(jù)復(fù)制過程詳解

    Redis的數(shù)據(jù)復(fù)制過程詳解

    Redis 的復(fù)制功能分為同步(sync)和命令傳播(command propagate)這兩個(gè)操作,這篇文章主要介紹了Redis的數(shù)據(jù)復(fù)制,需要的朋友可以參考下
    2022-12-12
  • Redis解決緩存擊穿問題的兩種方法

    Redis解決緩存擊穿問題的兩種方法

    緩存擊穿問題也叫熱點(diǎn)Key問題,就是?個(gè)被高并發(fā)訪問并且緩存重建業(yè)務(wù)較復(fù)雜的key突然失效了,無數(shù)的請求訪問會(huì)在瞬間給數(shù)據(jù)庫帶來巨大的沖擊,本文給大家介紹了Redis解決緩存擊穿問題的兩種方法,需要的朋友可以參考下
    2025-03-03
  • Redis中5種BitMap應(yīng)用場景及實(shí)現(xiàn)介紹

    Redis中5種BitMap應(yīng)用場景及實(shí)現(xiàn)介紹

    Redis BitMap是一種高效的位操作數(shù)據(jù)結(jié)構(gòu),這種結(jié)構(gòu)在處理海量數(shù)據(jù)的布爾型狀態(tài)時(shí)尤其高效,下面小編就來和大家簡單介紹一下5種它的應(yīng)用場景及實(shí)現(xiàn)方法吧
    2025-04-04
  • Redis自動(dòng)化安裝及集群實(shí)現(xiàn)搭建過程

    Redis自動(dòng)化安裝及集群實(shí)現(xiàn)搭建過程

    這篇文章主要介紹了Redis自動(dòng)化安裝以及集群實(shí)現(xiàn)搭建過程,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-09-09
  • Redis過期鍵與內(nèi)存淘汰策略深入分析講解

    Redis過期鍵與內(nèi)存淘汰策略深入分析講解

    因?yàn)閞edis數(shù)據(jù)是基于內(nèi)存的,然而內(nèi)存是非常寶貴的資源,然后我們就會(huì)對一些不常用或者只用一次的數(shù)據(jù)進(jìn)行存活時(shí)間設(shè)置,這樣才能提高內(nèi)存的使用效率,下面這篇文章主要給大家介紹了關(guān)于Redis中過期鍵與內(nèi)存淘汰策略,需要的朋友可以參考下
    2022-11-11

最新評論

免费看国产av网站| 色噜噜噜噜18禁止观看| 区一区二区三国产中文字幕| av黄色成人在线观看| 成人av中文字幕一区| 国内资源最丰富的网站| 香蕉av影视在线观看| 在线观看成人国产电影| 伊人综合免费在线视频| 成人国产小视频在线观看| 欧美一区二区三区乱码在线播放| 91 亚洲视频在线观看| 国产精品亚洲а∨天堂免| 成人激情文学网人妻| 动漫av网站18禁| 91小伙伴中女熟女高潮| 欧美精品一区二区三区xxxx| 人妻无码中文字幕专区| 这里只有精品双飞在线播放| 狠狠地躁夜夜躁日日躁| 自拍 日韩 欧美激情| 人妻凌辱欧美丰满熟妇| 免费高清自慰一区二区三区网站| 亚洲区欧美区另类最新章节| www日韩a级s片av| 不卡一不卡二不卡三| 亚洲日本一区二区三区| 精品av国产一区二区三区四区| 日本韩国在线观看一区二区| 精品黑人巨大在线一区| av俺也去在线播放| 97国产在线av精品| 真实国产乱子伦一区二区| 日韩影片一区二区三区不卡免费| 精品美女福利在线观看| av大全在线播放免费| 亚洲av日韩精品久久久| 全国亚洲男人的天堂| 97青青青手机在线视频| 精品美女久久久久久| 2021国产一区二区| 蜜桃色婷婷久久久福利在线| 激情伦理欧美日韩中文字幕| 亚洲国产在人线放午夜| 午夜激情高清在线观看| 色婷婷精品大在线观看| gav成人免费播放| 一区二区三区美女毛片| 18禁美女黄网站色大片下载| 99久久99一区二区三区| 久久亚洲天堂中文对白| 久久久久久久久久一区二区三区| 亚洲 欧美 自拍 偷拍 在线| 大肉大捧一进一出好爽在线视频| 亚洲成人情色电影在线观看| 揄拍成人国产精品免费看视频| jiujiure精品视频在线| 很黄很污很色的午夜网站在线观看 | 亚洲综合另类精品小说| 亚洲美女自偷自拍11页| 成人蜜桃美臀九一一区二区三区 | 免费在线观看视频啪啪| 精品人妻一二三区久久| 天天日天天爽天天干| 91av精品视频在线| av在线播放国产不卡| 蜜桃色婷婷久久久福利在线| 3D动漫精品啪啪一区二区下载| 久久久久久久久久性潮| 在线观看av观看av| 天天日天天敢天天干| 91精品国产观看免费| 人妻丰满熟妇综合网| aⅴ五十路av熟女中出| 中文字幕奴隷色的舞台50| 白白操白白色在线免费视频 | 老司机在线精品福利视频| 适合午夜一个人看的视频| 日本乱人一区二区三区| 一区二区三区日韩久久| 国产+亚洲+欧美+另类| 狠狠躁夜夜躁人人爽天天天天97| 91精品国产高清自在线看香蕉网 | 色吉吉影音天天干天天操| 激情啪啪啪啪一区二区三区| 免费一级黄色av网站| 亚洲午夜伦理视频在线| 日本少妇人妻xxxxxhd| 班长撕开乳罩揉我胸好爽| 日韩av免费观看一区| 无码精品一区二区三区人| 中文字幕高清资源站| 真实国模和老外性视频| 中文字幕av一区在线观看| 日韩欧美一级精品在线观看| 午夜毛片不卡免费观看视频| 亚洲激情偷拍一区二区| 亚洲午夜福利中文乱码字幕| 一区二区三区综合视频| 亚洲高清视频在线不卡| 青青草原网站在线观看| 日韩美女精品视频在线观看网站 | 亚洲av人人澡人人爽人人爱| 喷水视频在线观看这里只有精品| 中文字幕一区二区自拍| wwwxxx一级黄色片| 久草电影免费在线观看| 欧美另类一区二区视频| 宅男噜噜噜666免费观看| 国产va在线观看精品| 国产大鸡巴大鸡巴操小骚逼小骚逼| 自拍偷拍vs一区二区三区| 淫秽激情视频免费观看| 中文亚洲欧美日韩无线码| 日辽宁老肥女在线观看视频| 99精品免费观看视频| rct470中文字幕在线| 93精品视频在线观看| 91 亚洲视频在线观看| 蜜桃视频17c在线一区二区| 午夜成午夜成年片在线观看| 天天做天天爽夜夜做少妇| 天天干天天插天天谢| 色婷婷精品大在线观看| 天堂av在线播放免费| 天天插天天狠天天操| 亚洲第一伊人天堂网| 国产精品手机在线看片| 欧美日韩一区二区电影在线观看| 啪啪啪18禁一区二区三区| 久久精品国产亚洲精品166m| 丝袜肉丝一区二区三区四区在线| 亚洲在线观看中文字幕av| 狠狠的往里顶撞h百合| 亚洲福利午夜久久久精品电影网| 18禁免费av网站| 一区二区视频在线观看视频在线| 中文字幕一区二区三区蜜月| 99久久久无码国产精品性出奶水| 亚洲成人av一区久久| 丰满的继坶3中文在线观看| 日本韩国亚洲综合日韩欧美国产| 日曰摸日日碰夜夜爽歪歪| 久久精品国产23696| 天天想要天天操天天干| 国产精品久久久久久久精品视频| 天天干天天操天天扣| 免费福利av在线一区二区三区| 久久久久久久久久久免费女人| 国产V亚洲V天堂无码欠欠| 青青伊人一精品视频| 国产免费高清视频视频| 中文字幕综合一区二区| 亚洲国产欧美国产综合在线| 日韩美av高清在线| 五月精品丁香久久久久福利社| 自拍偷区二区三区麻豆| 日韩国产乱码中文字幕| av中文字幕网址在线| 在线观看黄色成年人网站| 又粗又长 明星操逼小视频| 精品一区二区三区欧美| gav成人免费播放| 淫秽激情视频免费观看| 亚洲欧美国产综合777| 夜色撩人久久7777| 国产精品人妻熟女毛片av久| 亚洲人妻视频在线网| 亚洲最大黄了色网站| 精品国产成人亚洲午夜| 自拍偷拍,中文字幕| 成人伊人精品色xxxx视频| 国产va精品免费观看| 天堂av中文在线最新版| 福利午夜视频在线观看| eeuss鲁片一区二区三区| 亚洲综合另类欧美久久| 韩国三级aaaaa高清视频| 国产一区二区久久久裸臀| 高清成人av一区三区| av天堂加勒比在线| 77久久久久国产精产品| 99精品视频在线观看免费播放| 亚洲少妇人妻无码精品| 免费男阳茎伸入女阳道视频| 国产三级片久久久久久久 | 日日操综合成人av| 天天干狠狠干天天操| 欧美日韩人妻久久精品高清国产| 中国黄片视频一区91| 亚洲国产精品久久久久久6| 大鸡八强奸视频在线观看| 日本熟妇喷水xxx| 在线观看av亚洲情色| 黄色视频在线观看高清无码| 天天色天天操天天舔| 欧美熟妇一区二区三区仙踪林| 青青青青在线视频免费观看| 在线亚洲天堂色播av电影| 国产成人一区二区三区电影网站| 少妇人妻久久久久视频黄片| 天干天天天色天天日天天射| 免费在线看的黄片视频| 一区二区三区日韩久久| 国产妇女自拍区在线观看| 欧美精品免费aaaaaa| 亚洲综合另类欧美久久| 91麻豆精品91久久久久同性| 日本丰满熟妇BBXBBXHD| 精品久久久久久久久久久99| 中文字幕之无码色多多| 免费黄高清无码国产| 精品视频一区二区三区四区五区 | 夜夜嗨av一区二区三区中文字幕| 国产V亚洲V天堂无码欠欠| 男人的天堂av日韩亚洲| 国产一级麻豆精品免费| 自拍偷拍一区二区三区图片| 97精品视频在线观看| 久久农村老妇乱69系列| 亚洲av成人免费网站| 91国内视频在线观看| aⅴ五十路av熟女中出| 国产精品精品精品999| 天天日天天干天天爱| 99久久激情婷婷综合五月天| 中国熟女@视频91| 性色蜜臀av一区二区三区| 三级黄色亚洲成人av| 欧美精品一区二区三区xxxx| 中文字幕av第1页中文字幕| 亚洲精品麻豆免费在线观看| 1000部国产精品成人观看视频| 成年人该看的视频黄免费| 亚洲av自拍天堂网| 98精产国品一二三产区区别| 国产日韩欧美视频在线导航| 久久精品国产23696| 天天艹天天干天天操| 中文字幕第三十八页久久| 超碰在线观看免费在线观看| 国产精品久久久久久久久福交| 中文字幕乱码av资源| 九色porny九色9l自拍视频| 爆乳骚货内射骚货内射在线| 中文字幕高清资源站| 国产av福利网址大全| 国产久久久精品毛片| 亚洲青青操骚货在线视频| 亚洲另类在线免费观看| 日本一道二三区视频久久| 一二三区在线观看视频| 黄色片一级美女黄色片| japanese日本熟妇另类| 久草视频福利在线首页| 免费手机黄页网址大全| 国产 在线 免费 精品| 久久久噜噜噜久久熟女av| 欧美老鸡巴日小嫩逼| 丝袜肉丝一区二区三区四区在线| 大肉大捧一进一出好爽在线视频 | 久青青草视频手机在线免费观看| 91亚洲国产成人精品性色| 日韩美av高清在线| 操的小逼流水的文章| 亚洲第一黄色在线观看| 日本人妻欲求不满中文字幕| 免费啪啪啪在线观看视频| 欧美专区第八页一区在线播放| 精品一区二区三区三区色爱| 色爱av一区二区三区| 青青青青青青青青青青草青青| 亚洲国际青青操综合网站| 亚洲免费国产在线日韩| 青娱乐最新视频在线| 2021年国产精品自拍| 男人在床上插女人视频| 国产欧美日韩在线观看不卡| 97人妻无码AV碰碰视频| 天天射夜夜操综合网| 中国老熟女偷拍第一页| 日韩成人综艺在线播放| 中文字幕欧美日韩射射一| 国产欧美精品一区二区高清| 亚洲一级av大片免费观看| 精品黑人一区二区三区久久国产| 亚洲激情偷拍一区二区| 黄片三级三级三级在线观看| 国产白袜脚足J棉袜在线观看| 99热色原网这里只有精品| 青青草原色片网站在线观看| av乱码一区二区三区| 涩爱综合久久五月蜜臀| 91中文字幕免费在线观看| 2021年国产精品自拍| 国产在线91观看免费观看| 国产a级毛久久久久精品| 一区二区三区激情在线| 亚洲国产精品免费在线观看| 岛国免费大片在线观看| 男人操女人逼逼视频网站| 91亚洲国产成人精品性色| 久久久久久久久久久免费女人| 中文字幕视频一区二区在线观看| 亚洲av无乱一区二区三区性色| 女警官打开双腿沦为性奴| 人人超碰国字幕观看97| 十八禁在线观看地址免费| 好男人视频在线免费观看网站| 精品首页在线观看视频| 大香蕉伊人中文字幕| 午夜精品福利91av| 男人的天堂在线黄色| 夫妻在线观看视频91| 日本美女成人在线视频| 国产精品视频一区在线播放| 日韩熟女av天堂系列| 绝色少妇高潮3在线观看| 国产一区自拍黄视频免费观看| 天天干天天日天天干天天操| 欧美男同性恋69视频| 都市家庭人妻激情自拍视频| 日韩欧美高清免费在线| 天天日天天日天天射天天干| 欧美一级片免费在线成人观看 | 99热99re在线播放| 久久香蕉国产免费天天| 一级黄片久久久久久久久| 欧美日韩情色在线观看| 亚洲2021av天堂| 中文字幕免费福利视频6| 国产成人午夜精品福利| 欧美精品一二三视频| 亚洲欧美日韩视频免费观看| 亚洲在线免费h观看网站| 日本男女操逼视频免费看| 无码国产精品一区二区高潮久久4| 姐姐的朋友2在线观看中文字幕 | 狠狠躁夜夜躁人人爽天天久天啪| 一区二区三区日本伦理| 亚洲成人免费看电影| 美女视频福利免费看| 性色av一区二区三区久久久| 视频一区 二区 三区 综合| 人妻丝袜诱惑我操她视频| 色综合色综合色综合色| 最新国产精品拍在线观看| 在线观看操大逼视频| 亚洲最大黄了色网站| 午夜精品在线视频一区| 激情国产小视频在线| 日韩近亲视频在线观看| 狠狠嗨日韩综合久久| 在线观看免费岛国av| 成年人中文字幕在线观看| 午夜蜜桃一区二区三区| 午夜精品一区二区三区城中村| 40道精品招牌菜特色| 91国产在线免费播放| 婷婷色国产黑丝少妇勾搭AV| 亚洲天堂av最新网址| 97成人免费在线观看网站| 偷拍自拍 中文字幕| av天堂加勒比在线| 亚洲成人免费看电影| 老师啊太大了啊啊啊尻视频| 经典av尤物一区二区| 欧美视频综合第一页| 亚洲图片偷拍自拍区| 成熟丰满熟妇高潮xx×xx| 人妻丝袜精品中文字幕| 国产精品手机在线看片| 国产综合高清在线观看| 亚洲午夜高清在线观看| 天天日天天日天天擦| 超pen在线观看视频公开97 | 国产精品福利小视频a| 不卡一区一区三区在线| 天天摸天天亲天天舔天天操天天爽| 99精品视频之69精品视频 | 人妻丝袜诱惑我操她视频| 国产精品黄大片在线播放| 天美传媒mv视频在线观看| 天天日天天日天天擦| 亚洲成人激情av在线| 狠狠的往里顶撞h百合| 99国内小视频在现欢看| 99热99这里精品6国产| 亚洲国产精品久久久久久6| 亚洲va天堂va国产va久| 韩国男女黄色在线观看| 欧美老妇精品另类不卡片| 青娱乐蜜桃臀av色| 国产一线二线三线的区别在哪| 国产污污污污网站在线| 欧美第一页在线免费观看视频| 亚洲国产免费av一区二区三区 | 亚洲成人免费看电影| 热思思国产99re| 三级av中文字幕在线观看| 黄色中文字幕在线播放| 欧洲精品第一页欧洲精品亚洲 | 小泽玛利亚视频在线观看| 美女日逼视频免费观看| 日本乱人一区二区三区| 区一区二区三国产中文字幕| 久久久久久久久久性潮| 88成人免费av网站| 亚洲国产成人av在线一区| 中文字幕在线欧美精品| 久久农村老妇乱69系列| 国产精品亚洲а∨天堂免| 中文字幕在线永久免费播放| 四虎永久在线精品免费区二区| 99国产精品窥熟女精品| 亚洲青青操骚货在线视频| 91中文字幕免费在线观看| 日韩欧美国产一区不卡| xxx日本hd高清| av天堂加勒比在线| 91国内精品自线在拍白富美| 中文 成人 在线 视频| 国产精品人妻一区二区三区网站| 亚洲另类综合一区小说| 精品成人啪啪18免费蜜臀| 亚洲女人的天堂av| 男人操女人的逼免费视频| 91人妻精品久久久久久久网站| 中国黄片视频一区91| 黄色资源视频网站日韩| 亚洲综合自拍视频一区| 精品日产卡一卡二卡国色天香 | 天堂av中文在线最新版| 操的小逼流水的文章| 中国产一级黄片免费视频播放| 1000部国产精品成人观看视频| 天天想要天天操天天干| 青青青激情在线观看视频| 亚洲天堂av最新网址| 日韩av有码一区二区三区4| av完全免费在线观看av| 懂色av蜜桃a v| 超污视频在线观看污污污 | 啪啪啪啪啪啪啪啪啪啪黄色| 91国内精品久久久久精品一| 色天天天天射天天舔| 亚洲 图片 欧美 图片| 中文字幕,亚洲人妻| 精品一区二区三区在线观看| 熟女人妻在线中出观看完整版| 青草青永久在线视频18| 福利视频网久久91| 天天操夜夜骑日日摸| 青娱乐蜜桃臀av色| 国产亚洲精品欧洲在线观看| 在线视频精品你懂的| 亚洲成av人无码不卡影片一| 天天摸天天干天天操科普| 日韩美女精品视频在线观看网站| 白白操白白色在线免费视频| 国产精品久久久久国产三级试频| 影音先锋女人av噜噜色| 熟女人妻在线中出观看完整版| 97少妇精品在线观看| 亚洲国产成人无码麻豆艾秋| 美女骚逼日出水来了| 青青草原色片网站在线观看| 一级黄色av在线观看| 国产午夜男女爽爽爽爽爽视频| 在线播放 日韩 av| 在线播放 日韩 av| 91亚洲国产成人精品性色| 中文字幕在线永久免费播放| 日韩av有码中文字幕| 中文字幕免费在线免费| 日本一本午夜在线播放| 日本真人性生活视频免费看| 中字幕人妻熟女人妻a62v网| 家庭女教师中文字幕在线播放| av天堂中文字幕最新| 亚洲最大黄 嗯色 操 啊| 爱爱免费在线观看视频| 天天爽夜夜爽人人爽QC| 亚洲乱码中文字幕在线| 精品老妇女久久9g国产| 中文字幕高清免费在线人妻| 免费人成黄页网站在线观看国产| 经典国语激情内射视频| 欧美精品中文字幕久久二区| 日本少妇高清视频xxxxx| 自拍偷拍 国产资源| 姐姐的朋友2在线观看中文字幕| 欧美日韩在线精品一区二区三| 国产视频在线视频播放| 黄色视频成年人免费观看| 亚洲 中文 自拍 无码| 亚洲综合另类精品小说| 亚洲一级 片内射视正片| 大黑人性xxxxbbbb| rct470中文字幕在线| 亚洲午夜高清在线观看| 日韩欧美一级黄片亚洲| 91免费放福利在线观看| 国产在线一区二区三区麻酥酥| 青青伊人一精品视频| 国产夫妻视频在线观看免费| 国产女人叫床高潮大片视频| 日韩欧美国产一区不卡| 男生用鸡操女生视频动漫| 最新日韩av传媒在线| 五十路丰满人妻熟妇| 日本午夜爽爽爽爽爽视频在线观看| 天天日天天干天天搡| 2021天天色天天干| 少妇高潮一区二区三区| 色综合天天综合网国产成人| 中文字幕一区二区人妻电影冢本| 女同互舔一区二区三区| 日本丰满熟妇BBXBBXHD| 超碰公开大香蕉97| 桃色视频在线观看一区二区| 精品区一区二区三区四区人妻 | 一区二区在线视频中文字幕| 北条麻妃肉色丝袜视频| 国产大学生援交正在播放| 日本精品视频不卡一二三| 强行扒开双腿猛烈进入免费版 | 蜜桃精品久久久一区二区| 婷婷色国产黑丝少妇勾搭AV| 综合页自拍视频在线播放| 天天日天天透天天操| 国产亚洲欧美视频网站| 久久综合老鸭窝色综合久久| 9久在线视频只有精品| 色哟哟在线网站入口| 78色精品一区二区三区| 亚洲av男人天堂久久| 欧洲亚洲欧美日韩综合| 人妻凌辱欧美丰满熟妇| 亚洲精品麻豆免费在线观看| 大尺度激情四射网站| 国产密臀av一区二区三| 亚洲激情,偷拍视频| 黄网十四区丁香社区激情五月天 | 欧美成人黄片一区二区三区 | 日本韩国免费一区二区三区视频| 五月婷婷在线观看视频免费| 午夜大尺度无码福利视频| 视频 国产 精品 熟女 | 国产精品黄页网站视频| 午夜精品福利91av| 制丝袜业一区二区三区| 99热色原网这里只有精品| 久久这里只有精品热视频| 精品视频国产在线观看| 97超碰最新免费在线观看| 欧美一区二区三区乱码在线播放| 国产va精品免费观看| 日韩欧美亚洲熟女人妻| 国产揄拍高清国内精品对白| 97资源人妻免费在线视频| 国产综合视频在线看片| 国产一区二区在线欧美| 成年人午夜黄片视频资源| 老司机福利精品免费视频一区二区| 亚洲午夜高清在线观看| 性感美女诱惑福利视频| 亚洲av日韩精品久久久| 天天日天天干天天爱| 人妻熟女中文字幕aⅴ在线| 五月色婷婷综合开心网4438| 中文字幕,亚洲人妻| 新婚人妻聚会被中出| 可以免费看的www视频你懂的 | 777奇米久久精品一区| 欧美久久久久久三级网| 青春草视频在线免费播放| 91快播视频在线观看| 99热碰碰热精品a中文| 天美传媒mv视频在线观看| 97超碰免费在线视频| 亚洲欧美一区二区三区电影| 农村胖女人操逼视频| 青青青激情在线观看视频| 中文字幕在线观看极品视频| 9l人妻人人爽人人爽| 久草视频在线看免费| 香蕉aⅴ一区二区三区| 青娱乐蜜桃臀av色| 女人精品内射国产99| 青青草在观免费国产精品| 黄色大片免费观看网站| 美女视频福利免费看| 91久久精品色伊人6882| 中文字幕网站你懂的| 不卡一区一区三区在线| 色综合久久无码中文字幕波多| 欧美日韩情色在线观看| 80电影天堂网官网| 中文字幕亚洲久久久| 人妻3p真实偷拍一二区| 老师啊太大了啊啊啊尻视频| 日本韩国在线观看一区二区| 久久热这里这里只有精品| 97人人妻人人澡人人爽人人精品| 夜夜嗨av蜜臀av| 在线观看日韩激情视频| 一区二区三区视频,福利一区二区| 国产日韩欧美视频在线导航 | 久久久久久久一区二区三| 日韩一区二区三区三州| 沙月文乃人妻侵犯中文字幕在线| 任你操视频免费在线观看| 人妻另类专区欧美制服| 亚洲熟女久久久36d| 四川乱子伦视频国产vip| 91老师蜜桃臀大屁股| 韩国女主播精品视频网站| 亚洲超碰97人人做人人爱| 人妻少妇亚洲精品中文字幕| 天天操夜夜骑日日摸| 亚洲 欧美 精品 激情 偷拍 | 青青青视频手机在线观看| 丰满的子国产在线观看| 在线视频免费观看网| 日本美女成人在线视频| 最新国产亚洲精品中文在线| 精品黑人一区二区三区久久国产 | 欧美日韩情色在线观看| 亚洲图片偷拍自拍区| 亚洲熟妇x久久av久久| 精品一区二区三区欧美| 黄色视频在线观看高清无码| 婷婷色国产黑丝少妇勾搭AV| rct470中文字幕在线| 午夜免费体验区在线观看 | 青草亚洲视频在线观看| 2022国产综合在线干| 久久热久久视频在线观看| 天天日天天鲁天天操| 亚洲成人激情av在线| caoporn蜜桃视频| 青青青青青青青青青青草青青| 日韩伦理短片在线观看| 非洲黑人一级特黄片| 中国黄片视频一区91| 欧美交性又色又爽又黄麻豆| 成人亚洲国产综合精品| 人人妻人人澡欧美91精品| 99久久99一区二区三区| 亚洲 图片 欧美 图片| 影音先锋女人av噜噜色| rct470中文字幕在线| 亚洲高清国产拍青青草原| rct470中文字幕在线| 中文字幕1卡1区2区3区| 国产女孩喷水在线观看| 91亚洲手机在线视频播放| 欧美色呦呦最新网址| 欧美日韩亚洲国产无线码| 亚洲精品国产久久久久久| 免费在线观看视频啪啪| 国产午夜激情福利小视频在线| av中文字幕电影在线看| 黑人解禁人妻叶爱071| 亚洲国产香蕉视频在线播放| 色婷婷六月亚洲综合香蕉| 人人妻人人爽人人添夜| 国产女孩喷水在线观看| 国产男女视频在线播放| 亚洲人一区二区中文字幕| 女同久久精品秋霞网| 欧美精品亚洲精品日韩在线| 亚洲中文字幕综合小综合| 大鸡巴后入爆操大屁股美女| 无码国产精品一区二区高潮久久4 日韩欧美一级精品在线观看 | 日韩精品中文字幕福利| 男女啪啪啪啪啪的网站| 人妻少妇亚洲精品中文字幕| 国产高清在线观看1区2区| 大白屁股精品视频国产| 国产a级毛久久久久精品| 在线不卡日韩视频播放| 五十路熟女人妻一区二区9933| 欧美va亚洲va天堂va| 青草青永久在线视频18| 91啪国自产中文字幕在线| 老司机在线精品福利视频| 国产无遮挡裸体免费直播视频| 在线国产日韩欧美视频| 精品久久久久久久久久久a√国产| 亚洲人妻av毛片在线| 黄片色呦呦视频免费看| 日韩美女综合中文字幕pp| 日本韩国亚洲综合日韩欧美国产| 日韩一个色综合导航| 男人靠女人的逼视频| 中文字幕日韩精品日本| 精彩视频99免费在线| 一区二区三区综合视频| 超级福利视频在线观看| 日韩精品啪啪视频一道免费| 亚洲第17页国产精品| 91快播视频在线观看| 99热国产精品666| 99热99re在线播放| 日本性感美女三级视频| 婷婷综合亚洲爱久久| 国产精品亚洲а∨天堂免| 超碰公开大香蕉97| av在线播放国产不卡| 老有所依在线观看完整版| 欧美性感尤物人妻在线免费看| 99亚洲美女一区二区三区| 九九视频在线精品播放| 后入美女人妻高清在线| 日比视频老公慢点好舒服啊| 99精品视频之69精品视频| 国产极品美女久久久久久| 中文字幕,亚洲人妻| 都市激情校园春色狠狠| 天天日天天鲁天天操| 欧美区一区二区三视频| 国产一区av澳门在线观看| 国产精品手机在线看片| 好男人视频在线免费观看网站| 中文字幕 亚洲av| 护士特殊服务久久久久久久| 欧美黄片精彩在线免费观看 | 五十路熟女人妻一区二区9933| 98视频精品在线观看| 91久久综合男人天堂| 人妻久久无码中文成人| 欧美精品资源在线观看| 亚洲 欧美 自拍 偷拍 在线| 日韩亚洲高清在线观看| 午夜精品久久久久麻豆影视| 中文字幕一区二区人妻电影冢本| 岛国毛片视频免费在线观看| 久久www免费人成一看片| 丰满少妇翘臀后进式| 亚洲福利天堂久久久久久 | 国产美女精品福利在线| 国产精品黄页网站视频| 日本美女成人在线视频| 国产日韩欧美美利坚蜜臀懂色| 鸡巴操逼一级黄色气| 十八禁在线观看地址免费| 经典国语激情内射视频| 亚洲高清自偷揄拍自拍| av破解版在线观看| 午夜在线观看岛国av,com| 美味人妻2在线播放| 色婷婷综合激情五月免费观看| 自拍 日韩 欧美激情| 中文亚洲欧美日韩无线码| 清纯美女在线观看国产| 亚洲欧美激情人妻偷拍| 水蜜桃国产一区二区三区| 老鸭窝在线观看一区| 精品亚洲国产中文自在线| 摧残蹂躏av一二三区| 天天操天天污天天射| 在线观看亚洲人成免费网址| 久久久久久久久久久免费女人| 日辽宁老肥女在线观看视频| 熟女少妇激情五十路| 国产又粗又黄又硬又爽| 91色网站免费在线观看| 五十路丰满人妻熟妇| 中文字幕高清免费在线人妻 | 亚洲成人三级在线播放| 亚洲天堂av最新网址| 大香蕉玖玖一区2区| 在线免费观看日本片| 真实国产乱子伦一区二区| 久草视频福利在线首页| 欧美黑人性猛交xxxxⅹooo| 天天躁夜夜躁日日躁a麻豆| 天天干天天操天天摸天天射| 亚洲高清自偷揄拍自拍| 91麻豆精品秘密入口在线观看| 国产精品久久久黄网站| 中文字幕—97超碰网| 久久三久久三久久三久久| 91精品国产黑色丝袜| 亚洲免费成人a v| 特黄老太婆aa毛毛片| 人妻另类专区欧美制服| 亚洲av极品精品在线观看| 不卡一区一区三区在线| 999九九久久久精品| 都市激情校园春色狠狠| 自拍偷拍 国产资源| 视频久久久久久久人妻| 青青青青青手机视频| 在线新三级黄伊人网| 久久久91蜜桃精品ad| 亚洲国产精品黑丝美女| 高潮喷水在线视频观看| 91国偷自产一区二区三区精品| 成人H精品动漫在线无码播放| 成人精品在线观看视频| av线天堂在线观看| 美女av色播在线播放| 亚洲精品高清自拍av| 天天色天天操天天透| 国产在线免费观看成人| 亚洲国产中文字幕啊啊啊不行了| 久草视频 久草视频2| 一级黄色片夫妻性生活| 超碰公开大香蕉97| 人妻激情图片视频小说| 国产一级麻豆精品免费| 亚洲欧美日韩视频免费观看| 91快播视频在线观看| 中文乱理伦片在线观看| 毛片av在线免费看| 玩弄人妻熟妇性色av少妇| 成人高清在线观看视频| 六月婷婷激情一区二区三区| 日韩一区二区三区三州| 国产精品人妻66p| 欧美成人黄片一区二区三区 | 91欧美在线免费观看| 黄色录像鸡巴插进去| 伊人情人综合成人久久网小说| 亚洲国际青青操综合网站| 在线观看免费视频色97| 国产日韩欧美视频在线导航| 97精品综合久久在线| 黄色成年网站午夜在线观看 | 日韩av免费观看一区| 传媒在线播放国产精品一区| 国产一区av澳门在线观看| 大香蕉大香蕉大香蕉大香蕉大香蕉| 最近的中文字幕在线mv视频| 男生用鸡操女生视频动漫| 国产日韩一区二区在线看| 黑人巨大精品欧美视频| 男人的天堂av日韩亚洲| 粉嫩av蜜乳av蜜臀| gav成人免费播放| 美女少妇亚洲精选av| 91福利视频免费在线观看| 91国偷自产一区二区三区精品| 女人精品内射国产99| 日本在线一区二区不卡视频| 黄色大片男人操女人逼| 免费观看成年人视频在线观看| 男人的网址你懂的亚洲欧洲av| 福利一二三在线视频观看| tube69日本少妇| 老司机欧美视频在线看| 免费在线观看污污视频网站| 一级黄色片夫妻性生活| 人人妻人人人操人人人爽| 日韩a级精品一区二区| 97少妇精品在线观看| 综合国产成人在线观看| 午夜成午夜成年片在线观看| 欧美国品一二三产区区别| 91麻豆精品传媒国产黄色片| 亚洲卡1卡2卡三卡四老狼| 社区自拍揄拍尻屁你懂的| 午夜毛片不卡免费观看视频| 日韩特级黄片高清在线看| 国产一区成人在线观看视频 | 欧美亚洲中文字幕一区二区三区 | 亚洲日本一区二区三区| 韩国一级特黄大片做受| 亚洲激情,偷拍视频| 欧美精品资源在线观看| 晚上一个人看操B片| 亚洲特黄aaaa片| 亚洲精品 欧美日韩| 馒头大胆亚洲一区二区| 中文字幕在线观看极品视频| 欧美亚洲免费视频观看| 欧美日本aⅴ免费视频| 青青在线视频性感少妇和隔壁黑丝| 亚洲国产欧美一区二区三区久久| 男人和女人激情视频| 国产乱子伦精品视频潮优女| 亚洲一区二区三区久久午夜| 又粗又长 明星操逼小视频| 91av中文视频在线| 亚洲在线一区二区欧美| 精品国产在线手机在线| av网址在线播放大全| 大尺度激情四射网站| 国产精品日韩欧美一区二区| 自拍偷区二区三区麻豆| 国产三级片久久久久久久| 夜女神免费福利视频| 中文字幕无码日韩专区免费| 欧美中文字幕一区最新网址| 2020中文字幕在线播放| 不戴胸罩引我诱的隔壁的人妻| 蜜桃视频在线欧美一区| 扒开让我视频在线观看| 三级等保密码要求条款| 日本在线不卡免费视频| 丝袜美腿欧美另类 中文字幕| 中文字幕视频一区二区在线观看| 中文字幕在线欧美精品| 99热99re在线播放| 欧美久久一区二区伊人| 成年午夜免费无码区| 午夜激情久久不卡一区二区 | 免费无码人妻日韩精品一区二区| 精品日产卡一卡二卡国色天香| 国产va在线观看精品| 老司机福利精品视频在线| 亚洲 图片 欧美 图片| 在线国产中文字幕视频| 福利午夜视频在线合集| 1024久久国产精品| 99的爱精品免费视频| 青青青国产免费视频| 国产av一区2区3区| 91超碰青青中文字幕| 男生舔女生逼逼的视频| 日本女人一级免费片| 一区二区三区 自拍偷拍| 91香蕉成人app下载| 少妇高潮一区二区三区| 1769国产精品视频免费观看| 国产精品视频资源在线播放| 天天日天天干天天爱| 少妇高潮一区二区三区| 国产亚洲天堂天天一区| 91精品激情五月婷婷在线| 亚洲在线一区二区欧美| 家庭女教师中文字幕在线播放| 亚洲国产欧美一区二区丝袜黑人| av新中文天堂在线网址| 精内国产乱码久久久久久| 欧美日韩情色在线观看| 日韩三级黄色片网站| 欧美视频不卡一区四区| 男人操女人的逼免费视频| 国产极品精品免费视频| 亚洲美女高潮喷浆视频| av网站色偷偷婷婷网男人的天堂| 强行扒开双腿猛烈进入免费版| 亚洲av琪琪男人的天堂| 啪啪啪啪啪啪啪免费视频| 888亚洲欧美国产va在线播放| 一区二区视频在线观看免费观看 | 男人的网址你懂的亚洲欧洲av| 噜噜色噜噜噜久色超碰| 欧美亚洲少妇福利视频| 亚洲精品麻豆免费在线观看| 黑人巨大的吊bdsm| 91亚洲国产成人精品性色| 国产精品视频一区在线播放| 亚洲欧美久久久久久久久| 扒开让我视频在线观看| 91免费黄片可看视频| 十八禁在线观看地址免费| 日本www中文字幕| 亚洲老熟妇日本老妇| 国产亚洲欧美视频网站| 特级无码毛片免费视频播放| 噜噜色噜噜噜久色超碰| av线天堂在线观看| 亚洲一级美女啪啪啪| 国产精品视频欧美一区二区| av老司机亚洲一区二区| 日本av熟女在线视频| 天天夜天天日天天日| wwwxxx一级黄色片| 非洲黑人一级特黄片| 日日操夜夜撸天天干| 国产福利小视频二区| 久久综合老鸭窝色综合久久| 国产又粗又黄又硬又爽| 精品91高清在线观看| 亚洲区美熟妇久久久久| 青青青青青青青青青国产精品视频| 成年女人免费播放视频| 青青青艹视频在线观看| 涩涩的视频在线观看视频| 老司机免费福利视频网| 国产福利小视频免费观看| 激情小视频国产在线| 91久久精品色伊人6882| 不戴胸罩引我诱的隔壁的人妻| 一级黄色av在线观看| 亚洲国产精品久久久久蜜桃| aⅴ精产国品一二三产品| 国产大鸡巴大鸡巴操小骚逼小骚逼| 天天躁日日躁狠狠躁躁欧美av| 又色又爽又黄又刺激av网站| 免费看美女脱光衣服的视频| 少妇高潮一区二区三区| 欧美成人综合色在线噜噜| 日本精品一区二区三区在线视频。 | 最新激情中文字幕视频| av一本二本在线观看| 中文字幕一区二区三区人妻大片| 欧美亚洲中文字幕一区二区三区| 2020国产在线不卡视频 | 无码日韩人妻精品久久| 中文字幕高清免费在线人妻| 99人妻视频免费在线| 午夜免费观看精品视频| 日韩欧美制服诱惑一区在线| 黄色片一级美女黄色片| 国产精品探花熟女在线观看| 夜女神免费福利视频| 福利午夜视频在线观看| 人妻少妇精品久久久久久 | 瑟瑟视频在线观看免费视频| 亚洲人妻30pwc| 欧美日韩v中文在线| 深田咏美亚洲一区二区| 中文字幕在线视频一区二区三区 | 欧美日韩精品永久免费网址| 国产高潮无码喷水AV片在线观看| 91九色国产porny蝌蚪| 青青青青操在线观看免费| 一区二区免费高清黄色视频| 国产精品久久综合久久| 超碰97免费人妻麻豆| 国产在线观看免费人成短视频| 国产精品人久久久久久| 瑟瑟视频在线观看免费视频| 亚洲国产在人线放午夜| 亚欧在线视频你懂的| 亚洲成人av在线一区二区| 天天插天天色天天日| 国产麻豆剧传媒精品国产av蜜桃| 五十路人妻熟女av一区二区| 亚洲中文字字幕乱码| 熟女在线视频一区二区三区| 国产精品自拍视频大全| 91试看福利一分钟| 国产va在线观看精品| 天天日天天日天天射天天干| 国产午夜男女爽爽爽爽爽视频| 国产97视频在线精品| 美女张开腿让男生操在线看| 国产福利小视频免费观看| 91精品资源免费观看| 最近中文字幕国产在线| 日本特级片中文字幕| 日视频免费在线观看| 日本在线一区二区不卡视频| 国产日韩精品一二三区久久久| 国产成人一区二区三区电影网站| 日本欧美视频在线观看三区| av乱码一区二区三区| 在线视频这里只有精品自拍| 日本精品美女在线观看| 亚洲国产成人av在线一区| 国产高清女主播在线| 大鸡巴插入美女黑黑的阴毛| 欧美在线偷拍视频免费看| 免费观看国产综合视频| 国产一区二区视频观看| 成年女人免费播放视频| 精品视频一区二区三区四区五区| 91人妻精品久久久久久久网站 | 啪啪啪操人视频在线播放| 又粗又硬又猛又黄免费30| 国产亚洲四十路五十路| 亚洲精品国产在线电影| 国产妇女自拍区在线观看| 国产亚洲欧美另类在线观看| 国产精品一区二区三区蜜臀av| 日韩激情文学在线视频| 午夜精品一区二区三区城中村| 蝴蝶伊人久久中文娱乐网| 超碰在线观看免费在线观看| 欧美久久一区二区伊人| 亚洲午夜伦理视频在线| 日日操夜夜撸天天干| 国产品国产三级国产普通话三级| 丰满的继坶3中文在线观看| japanese五十路熟女熟妇| 色综合天天综合网国产成人| 精品美女福利在线观看| 亚洲人妻av毛片在线| 国产精品黄页网站视频| 沙月文乃人妻侵犯中文字幕在线| 91九色porny国产蝌蚪视频| 快点插进来操我逼啊视频| 国产chinesehd精品麻豆| 婷婷午夜国产精品久久久| 激情人妻校园春色亚洲欧美| 一区二区三区四区中文| ka0ri在线视频| 丰满少妇人妻xxxxx| 国产97视频在线精品| 91福利视频免费在线观看| 黄色成人在线中文字幕| 1区2区3区4区视频在线观看| 中文字幕高清在线免费播放| 一区二区三区麻豆福利视频| 亚洲狠狠婷婷综合久久app| 国产伦精品一区二区三区竹菊| 人妻少妇精品久久久久久| 日韩av有码一区二区三区4| 中文字幕AV在线免费看 | 日韩人妻xxxxx| 大尺度激情四射网站| 天天干天天插天天谢| 亚洲人一区二区中文字幕| 视频 一区二区在线观看| 在线观看免费av网址大全| 亚洲1区2区3区精华液| 日本成人一区二区不卡免费在线| 大香蕉伊人国产在线| 男女啪啪啪啪啪的网站| 国产白嫩美女一区二区| 啪啪啪操人视频在线播放| 国产av欧美精品高潮网站| 在线免费观看亚洲精品电影 | 国产精品视频资源在线播放| 久久久久久久亚洲午夜综合福利 | 熟女少妇激情五十路| 青青青视频手机在线观看| 成人av久久精品一区二区| 国产午夜亚洲精品不卡在线观看| 国产精品成久久久久三级蜜臀av| 99久久中文字幕一本人| 亚洲男人让女人爽的视频| av在线免费观看亚洲天堂| 亚洲另类图片蜜臀av| 色狠狠av线不卡香蕉一区二区| 黄色视频成年人免费观看| 很黄很污很色的午夜网站在线观看| 岛国青草视频在线观看| 2020中文字幕在线播放| 精品久久久久久高潮| 日韩欧美中文国产在线| 亚洲天天干 夜夜操| 欧美精品一二三视频| 久久久精品精品视频视频| 亚洲高清免费在线观看视频| 亚洲人人妻一区二区三区| 黑人大几巴狂插日本少妇| 不卡日韩av在线观看| 精品黑人巨大在线一区| 亚洲中文精品人人免费| 美洲精品一二三产区区别| 好了av中文字幕在线| 男人天堂av天天操| 午夜久久久久久久99| 色呦呦视频在线观看视频| 日韩美av高清在线| 99久久中文字幕一本人| 亚洲欧美一卡二卡三卡| 黄片大全在线观看观看| 狠狠躁狠狠爱网站视频| 久草极品美女视频在线观看| 国产精品视频资源在线播放 | 国产日本欧美亚洲精品视| 粉嫩欧美美人妻小视频| 国产又色又刺激在线视频| 国产性生活中老年人视频网站| 欧美黑人巨大性xxxxx猛交| 亚洲图片偷拍自拍区| 中文字幕免费在线免费| 亚洲国产成人在线一区| 成人久久精品一区二区三区| 美女被肏内射视频网站| 国产精品久久9999| 在线可以看的视频你懂的| 经典亚洲伊人第一页| 亚洲精品三级av在线免费观看| 精品视频国产在线观看| 伊人精品福利综合导航| 亚洲欧美在线视频第一页| 青娱乐最新视频在线| 亚洲国产在线精品国偷产拍| 亚洲一级 片内射视正片| 绝顶痉挛大潮喷高潮无码| 国产91精品拍在线观看| 少妇ww搡性bbb91| 国产精品久久久久久美女校花| 午夜美女少妇福利视频| 免费av岛国天堂网站| 揄拍成人国产精品免费看视频| 在线观看一区二区三级| 久久精品久久精品亚洲人| 亚洲精品中文字幕下载| 国产变态另类在线观看| 国产精品久久综合久久| 国产日本精品久久久久久久| 亚洲福利天堂久久久久久| 搡老熟女一区二区在线观看| 国产九色91在线观看精品| 亚洲成人激情av在线| 亚洲男人在线天堂网| 国产美女午夜福利久久| 亚洲国产最大av综合| 福利视频一区二区三区筱慧 | 最新91九色国产在线观看| 2018最新中文字幕在线观看| 91精品高清一区二区三区| 欧美日韩国产一区二区三区三州| 日本精品视频不卡一二三| 无码日韩人妻精品久久| 亚洲中文字字幕乱码| 亚洲专区激情在线观看视频| 免费在线观看污污视频网站| 2018最新中文字幕在线观看| 中文字幕之无码色多多| 干逼又爽又黄又免费的视频| 香蕉91一区二区三区| 欧美第一页在线免费观看视频| 91亚洲手机在线视频播放| 淫秽激情视频免费观看| 韩国一级特黄大片做受| 黄色三级网站免费下载| 亚洲一区二区久久久人妻| 超污视频在线观看污污污| 欧美一区二区三区激情啪啪啪| 青娱乐最新视频在线| 18禁无翼鸟成人在线| 日韩一个色综合导航| 久久精品国产999| www日韩a级s片av| 欧美精品资源在线观看| 色综合久久久久久久久中文| 婷婷久久久久深爱网| 亚洲欧美综合另类13p| 岛国青草视频在线观看| 伊人网中文字幕在线视频| 久草极品美女视频在线观看| 高清成人av一区三区| 欧美xxx成人在线| 香港一级特黄大片在线播放| 亚洲国产中文字幕啊啊啊不行了| 40道精品招牌菜特色| 久久99久久99精品影院| 成年人黄视频在线观看| 国产精品熟女久久久久浪潮| 激情内射在线免费观看| 中国产一级黄片免费视频播放| 国产麻豆91在线视频| 欧亚日韩一区二区三区观看视频| 国产黄色片在线收看| 2022国产精品视频| 美女吃鸡巴操逼高潮视频| 亚洲天天干 夜夜操| 精品人妻伦一二三区久| 亚洲高清自偷揄拍自拍| 国产第一美女一区二区三区四区| 国语对白xxxx乱大交| 在线观看黄色成年人网站| 天天插天天狠天天操| 欧洲亚洲欧美日韩综合| 91麻豆精品91久久久久同性 | 国产成人精品一区在线观看| 在线观看日韩激情视频| 粉嫩欧美美人妻小视频| 久久久91蜜桃精品ad| 人妻少妇av在线观看| 黄色三级网站免费下载| 日本少妇在线视频大香蕉在线观看| 中文字幕+中文字幕| 美女福利视频导航网站| 丝袜长腿第一页在线| 日韩av免费观看一区| 玩弄人妻熟妇性色av少妇| 日本一区精品视频在线观看| 亚洲一区二区三区偷拍女厕91| 日韩av有码中文字幕| av中文字幕网址在线| www日韩毛片av| 国产无遮挡裸体免费直播视频| 亚洲中文字幕乱码区| 亚洲国产成人av在线一区| 亚洲乱码中文字幕在线| 欧美一区二区中文字幕电影| 播放日本一区二区三区电影 | 538精品在线观看视频| 天天插天天狠天天操| 黑人巨大的吊bdsm| 少妇高潮无套内谢麻豆| 亚洲第一黄色在线观看| 中文字幕+中文字幕| 55夜色66夜色国产精品站| 欧美天堂av无线av欧美| 91色老99久久九九爱精品| 91大神福利视频网| 亚洲一区自拍高清免费视频| 久久www免费人成一看片| 亚洲图库另类图片区| 欧美日韩高清午夜蜜桃大香蕉| 国产高清在线在线视频| 黄色大片免费观看网站| 欧美亚洲自偷自拍 在线| 中文字幕一区二区三区人妻大片| 亚洲天堂精品福利成人av| 都市激情校园春色狠狠| 综合色区亚洲熟妇shxstz| 国产乱子伦精品视频潮优女| 97青青青手机在线视频| 久久久噜噜噜久久熟女av| 夜色17s精品人妻熟女| 日韩影片一区二区三区不卡免费| mm131美女午夜爽爽爽| 亚洲成人线上免费视频观看| 五十路丰满人妻熟妇| 亚洲成av人无码不卡影片一| 视频一区 二区 三区 综合| 欧美黑人与人妻精品| 大鸡吧插入女阴道黄色片| 天天干狠狠干天天操| 国产高清女主播在线| 国产片免费观看在线观看| 日本少妇的秘密免费视频| 日韩av有码中文字幕| 在线观看的a站 最新| 欧美viboss性丰满| 丁香花免费在线观看中文字幕| 亚洲国产第一页在线观看| 天天操天天弄天天射| 三级av中文字幕在线观看| av网站色偷偷婷婷网男人的天堂| 国产欧美精品一区二区高清| 2021最新热播中文字幕| 久久三久久三久久三久久| 日噜噜噜夜夜噜噜噜天天噜噜噜| 婷婷久久一区二区字幕网址你懂得 | 亚洲人人妻一区二区三区| 日韩a级黄色小视频| 成年人的在线免费视频| 最近的中文字幕在线mv视频| 中文字幕av一区在线观看| 岛国黄色大片在线观看| 91极品大一女神正在播放| 美女av色播在线播放| 91p0rny九色露脸熟女| 中文字幕无码一区二区免费| 老司机午夜精品视频资源| 天天日夜夜干天天操| 99精品一区二区三区的区| 这里只有精品双飞在线播放| 午夜精品福利91av| 午夜激情高清在线观看| 日本三极片视频网站观看| 日韩三级电影华丽的外出| 哥哥姐姐综合激情小说| 中文字幕在线欧美精品| 一区二区三区四区中文| 97黄网站在线观看| 早川濑里奈av黑人番号| 亚洲一区二区三区av网站| 日韩av免费观看一区| 亚洲自拍偷拍综合色| 男生舔女生逼逼视频| 日本免费午夜视频网站| 中文字幕在线第一页成人| 国际av大片在线免费观看| 老司机免费视频网站在线看| 在线国产精品一区二区三区| 在线免费观看欧美小视频| 伊人综合aⅴ在线网| 亚洲精品国产久久久久久| 久久艹在线观看视频| 欧美香蕉人妻精品一区二区| 色97视频在线播放| 一区二区三区av高清免费| 国产综合视频在线看片| av线天堂在线观看| 久草视频在线免播放| 99亚洲美女一区二区三区| 成人av电影免费版| 日日夜夜大香蕉伊人| 欧美久久一区二区伊人| 免费在线黄色观看网站| 精品美女在线观看视频在线观看| 播放日本一区二区三区电影| 亚洲av日韩精品久久久久久hd| 亚洲高清国产自产av| 欧美成人一二三在线网| 欧美精品一区二区三区xxxx| 91九色porny国产在线| 天天干天天啪天天舔| 93人妻人人揉人人澡人人| 亚洲欧美一区二区三区电影| 97超碰最新免费在线观看| 91老师蜜桃臀大屁股| 国产刺激激情美女网站| 国产一级麻豆精品免费| 天天日天天干天天舔天天射| 小穴多水久久精品免费看| 国产高潮无码喷水AV片在线观看| 精品av国产一区二区三区四区| 综合色区亚洲熟妇shxstz| 77久久久久国产精产品| 免费成人av中文字幕| 久久久久久久精品成人热| 一二三区在线观看视频| 大骚逼91抽插出水视频| 在线免费观看视频一二区| free性日本少妇| 国内自拍第一页在线观看| 伊人情人综合成人久久网小说| 极品丝袜一区二区三区| 成人性爱在线看四区| 好男人视频在线免费观看网站| 国产精品手机在线看片| 中文字幕+中文字幕| 黄页网视频在线免费观看| 亚洲在线一区二区欧美| 婷婷综合蜜桃av在线| 老司机免费视频网站在线看| 天天摸天天日天天操| jiuse91九色视频| 丁香花免费在线观看中文字幕| 欧洲欧美日韩国产在线| 又大又湿又爽又紧A视频| 精品91高清在线观看 | 又色又爽又黄又刺激av网站| 成人亚洲国产综合精品| 视频一区二区综合精品| 日韩无码国产精品强奸乱伦| 9色在线视频免费观看| 亚洲免费视频欧洲免费视频| 偷拍自拍国产在线视频| 日本在线不卡免费视频| av日韩在线观看大全| 色哟哟在线网站入口| 都市激情校园春色狠狠| 欧美日韩v中文在线| 久久久精品精品视频视频| 久久一区二区三区人妻欧美| 极品丝袜一区二区三区| 亚洲高清国产拍青青草原| 国产日韩精品电影7777| 国产精品伦理片一区二区| 二区中出在线观看老师| 亚洲1卡2卡三卡4卡在线观看| 青青草亚洲国产精品视频| 9色精品视频在线观看| 人妻无码中文字幕专区| 四川乱子伦视频国产vip| 日韩写真福利视频在线观看| 中文字幕亚洲中文字幕| 在线国产日韩欧美视频| 国产日韩精品一二三区久久久| 日本美女性生活一级片| 白白操白白色在线免费视频| 天天通天天透天天插| 11久久久久久久久久久| 天天日天天干天天要| 成人免费毛片aaaa| 欧美成人黄片一区二区三区| 亚洲青青操骚货在线视频| 97瑟瑟超碰在线香蕉| 日韩成人性色生活片| 熟女在线视频一区二区三区| 女同性ⅹxx女同h偷拍| 午夜国产免费福利av| 亚洲成人午夜电影在线观看| 天天插天天色天天日| 2021国产一区二区| 亚洲综合在线视频可播放| 成人乱码一区二区三区av| 性色av一区二区三区久久久| 美女操逼免费短视频下载链接| 99久久99久国产黄毛片| 五月天中文字幕内射| 国产91久久精品一区二区字幕| 亚洲一级av大片免费观看| 久久这里只有精彩视频免费| 91免费放福利在线观看| 黄色无码鸡吧操逼视频| 国产福利小视频二区| 中国产一级黄片免费视频播放| 黄色资源视频网站日韩| 国产成人小视频在线观看无遮挡| 精品一区二区三区三区色爱| 中文字幕日本人妻中出| 制服丝袜在线人妻中文字幕| 国产精品一区二区三区蜜臀av| 在线观看视频 你懂的| 色综合久久五月色婷婷综合| www天堂在线久久| 久久热这里这里只有精品| 98视频精品在线观看| 五十路熟女人妻一区二区9933| 成人区人妻精品一区二视频| 91高清成人在线视频| 亚洲图片欧美校园春色| 久久久久国产成人精品亚洲午夜| 四虎永久在线精品免费区二区| 欧美特色aaa大片| 偷拍自拍视频图片免费| 沙月文乃人妻侵犯中文字幕在线 | 欧美男人大鸡吧插女人视频| 国产精品大陆在线2019不卡| 欧美韩国日本国产亚洲| 夏目彩春在线中文字幕| 中文字幕乱码人妻电影| 日本av熟女在线视频| 3344免费偷拍视频| 亚洲专区激情在线观看视频| 美女少妇亚洲精选av| 丝袜国产专区在线观看| 美女 午夜 在线视频| 任你操任你干精品在线视频| 天天日天天干天天要| 人妻少妇一区二区三区蜜桃| 国产日韩精品免费在线| 免费人成黄页网站在线观看国产 | 51国产成人精品视频| 亚洲一级特黄特黄黄色录像片| 欧美日韩激情啪啪啪| 老司机福利精品视频在线| 偷偷玩弄新婚人妻h视频| 国产亚州色婷婷久久99精品| 天码人妻一区二区三区在线看| 精品亚洲中文字幕av| 久久久久久国产精品| 91大屁股国产一区二区| 久久亚洲天堂中文对白| 青草久久视频在线观看| 国产av一区2区3区| 欧美亚洲少妇福利视频| 天堂av狠狠操蜜桃| 啊用力插好舒服视频| 中国黄片视频一区91| 激情色图一区二区三区| 97年大学生大白天操逼| 日日爽天天干夜夜操| 狠狠躁夜夜躁人人爽天天久天啪| 97黄网站在线观看| 中文字幕第一页国产在线| 亚洲国产成人在线一区| 日韩欧美中文国产在线| 大香蕉玖玖一区2区| 91久久综合男人天堂| 欧美80老妇人性视频| 亚洲一区二区三区五区 | 日本免费午夜视频网站| 欧美日韩熟女一区二区三区| 国产精品视频欧美一区二区| 欧美成人精品在线观看| 玖玖一区二区在线观看| 亚洲成人国产av在线| 干逼又爽又黄又免费的视频| 99re国产在线精品| 一区二区在线视频中文字幕| 亚洲1卡2卡三卡4卡在线观看 | 亚洲欧美一区二区三区电影| 亚洲成人熟妇一区二区三区| 久久精品国产亚洲精品166m| 大香蕉大香蕉大香蕉大香蕉大香蕉 | 伊人开心婷婷国产av| 换爱交换乱高清大片| 青青青青青手机视频| 中文字幕奴隷色的舞台50| 亚洲国产最大av综合| 成年人中文字幕在线观看| 日本韩国在线观看一区二区| 青青草亚洲国产精品视频| 国产熟妇乱妇熟色T区| 中国熟女一区二区性xx| 午夜精品一区二区三区城中村| 91人妻精品一区二区久久| 四川乱子伦视频国产vip| 欧美精品激情在线最新观看视频| 国产麻豆剧传媒精品国产av蜜桃| 自拍偷拍一区二区三区图片| 97国产在线av精品| 久久久久五月天丁香社区| 亚洲av可乐操首页| av乱码一区二区三区| 一区二区熟女人妻视频| 黄色av网站免费在线| 国产在线91观看免费观看| 男生用鸡操女生视频动漫| 青青青青青免费视频| sspd152中文字幕在线| 免费在线看的黄片视频| 亚洲精品一区二区三区老狼| 午夜久久香蕉电影网| 日本午夜爽爽爽爽爽视频在线观看| 亚洲综合在线观看免费| 一区二区三区四区视频在线播放| 在线免费观看黄页视频| 青青青青操在线观看免费| 美女操逼免费短视频下载链接 | 色综合久久五月色婷婷综合| 动色av一区二区三区| 国产亚洲欧美另类在线观看| 在线播放 日韩 av| 蜜桃视频17c在线一区二区| 夜夜骑夜夜操夜夜奸| 91桃色成人网络在线观看| 在线免费91激情四射 | 亚洲精品亚洲人成在线导航| 国产精品视频欧美一区二区| 顶级尤物粉嫩小尤物网站| 日韩一区二区三区三州| 国产极品精品免费视频| 国产91久久精品一区二区字幕| 青青伊人一精品视频| 人人妻人人爽人人澡人人精品| 午夜青青草原网在线观看| 国产 在线 免费 精品| 91中文字幕免费在线观看| 成人av天堂丝袜在线观看| 最新的中文字幕 亚洲| 国产亚洲成人免费在线观看 | 亚洲精品欧美日韩在线播放 | 超pen在线观看视频公开97| 一区二区三区日韩久久| 偷拍自拍亚洲美腿丝袜| 日本欧美视频在线观看三区| 欧美一区二区三区乱码在线播放 | 成人乱码一区二区三区av| 不卡一区一区三区在线| 日韩无码国产精品强奸乱伦| 亚洲av男人的天堂你懂的| 中文字幕在线第一页成人| 欧美偷拍亚洲一区二区| 国产一区成人在线观看视频| 国产精品亚洲а∨天堂免| 国产精品中文av在线播放| 成年人的在线免费视频| 99人妻视频免费在线| 福利国产视频在线观看| 天天干天天操天天插天天日| 老司机午夜精品视频资源| 99热这里只有精品中文| 熟女人妻三十路四十路人妻斩| 超碰公开大香蕉97| 亚洲精品 欧美日韩| 不戴胸罩引我诱的隔壁的人妻| 日本少妇人妻xxxxxhd| 日韩少妇人妻精品无码专区| 超级av免费观看一区二区三区| 涩爱综合久久五月蜜臀| 人妻另类专区欧美制服| 亚洲乱码中文字幕在线| 亚洲福利精品福利精品福利| 久久久精品精品视频视频| 中国无遮挡白丝袜二区精品| 最新激情中文字幕视频| 欧美精品中文字幕久久二区| 天天操夜夜骑日日摸| 黄色成年网站午夜在线观看| 密臀av一区在线观看| 只有精品亚洲视频在线观看| 亚洲欧洲一区二区在线观看| 一区二区久久成人网| 18禁美女黄网站色大片下载| 午夜精品在线视频一区| AV天堂一区二区免费试看| 99精品视频之69精品视频| 亚洲中文字幕乱码区| 午夜的视频在线观看| 天天干夜夜操天天舔| 日比视频老公慢点好舒服啊| 久草视频中文字幕在线观看| 99精品国自产在线人| 91综合久久亚洲综合| av在线播放国产不卡| 亚洲av午夜免费观看| 极品粉嫩小泬白浆20p主播| 一区二区视频视频视频| 欧美黑人与人妻精品| 三级黄色亚洲成人av| 黄色黄色黄片78在线| 午夜精品一区二区三区城中村| 日视频免费在线观看| 欧美成人小视频在线免费看| 欧美特色aaa大片| 国产精品人妻一区二区三区网站| 传媒在线播放国产精品一区| 青青青爽视频在线播放| 沈阳熟妇28厘米大战黑人| 社区自拍揄拍尻屁你懂的| 喷水视频在线观看这里只有精品| 啪啪啪啪啪啪啪啪啪啪黄色| 福利在线视频网址导航| 99精品国产自在现线观看| 亚洲欧美激情人妻偷拍| 丁香花免费在线观看中文字幕| 91亚洲手机在线视频播放| 自拍偷拍日韩欧美一区二区| av在线免费资源站| 自拍偷区二区三区麻豆| 极品性荡少妇一区二区色欲| 亚洲精品无码色午夜福利理论片| 欧美亚洲中文字幕一区二区三区| 中文字日产幕乱六区蜜桃| 日本熟妇一区二区x x| 中文字幕成人日韩欧美| 北条麻妃肉色丝袜视频| 传媒在线播放国产精品一区| 扒开腿挺进肉嫩小18禁视频| 99久久超碰人妻国产| 午夜频道成人在线91| 日视频免费在线观看| 日本欧美视频在线观看三区| 成年人啪啪视频在线观看| 国产午夜激情福利小视频在线| 亚洲欧美精品综合图片小说| 日韩三级黄色片网站| 中文字幕欧美日韩射射一| 亚洲图库另类图片区| 91老熟女连续高潮对白| 亚洲综合自拍视频一区| 性感美女诱惑福利视频| 亚洲精品 日韩电影| 99精品视频在线观看免费播放| 国产精品国产三级麻豆| 福利片区一区二体验区| 欧美成人黄片一区二区三区| 国产三级片久久久久久久| 不卡日韩av在线观看| 日韩人妻丝袜中文字幕| 国产亚洲成人免费在线观看| 亚洲丝袜老师诱惑在线观看| 操操网操操伊剧情片中文字幕网| 中文字幕网站你懂的| 中文字幕在线视频一区二区三区| 91精品免费久久久久久| 大香蕉伊人中文字幕| 综合精品久久久久97| 开心 色 六月 婷婷| 色呦呦视频在线观看视频| 日本性感美女三级视频| 天天干天天操天天扣| 黄色录像鸡巴插进去| 天美传媒mv视频在线观看| 红桃av成人在线观看| 一级黄色片夫妻性生活| 亚洲av在线观看尤物| 天堂中文字幕翔田av| 一区二区三区国产精选在线播放| 精品亚洲国产中文自在线| 免费黄页网站4188| 国产黄色片蝌蚪九色91| 青娱乐极品视频青青草| 人妻少妇一区二区三区蜜桃| 漂亮 人妻被中出中文| 一区二区三区美女毛片| 亚洲 人妻 激情 中文| 韩国男女黄色在线观看| 丝袜长腿第一页在线| 成人免费做爰高潮视频| 国产精品系列在线观看一区二区| 爱爱免费在线观看视频| 人妻在线精品录音叫床| 在线视频免费观看网| 天天操天天弄天天射| 2019av在线视频| 天天日天天敢天天干| 少妇高潮一区二区三区| 欧美第一页在线免费观看视频| 最后99天全集在线观看| 好太好爽好想要免费| 老鸭窝日韩精品视频观看| 亚洲成人熟妇一区二区三区| 成人sm视频在线观看| 青青热久免费精品视频在线观看 | 国产精品黄片免费在线观看| 国产熟妇人妻ⅹxxxx麻豆| 99热国产精品666| 青青青青爽手机在线| 中文字幕一区二区自拍| 超鹏97历史在线观看| 人人人妻人人澡人人| 久久久精品国产亚洲AV一| 97国产精品97久久| 天天做天天干天天舔| 午夜免费体验区在线观看| 在线免费91激情四射| 亚洲老熟妇日本老妇| 日韩特级黄片高清在线看| 亚洲日产av一区二区在线| 第一福利视频在线观看| 18禁美女无遮挡免费| 亚洲欧美自拍另类图片| 午夜免费观看精品视频| 天天干天天操天天插天天日| 久草视频在线免播放| 亚洲粉嫩av一区二区三区| 在线播放一区二区三区Av无码| 天天操天天干天天艹| 五月天久久激情视频| 国产白袜脚足J棉袜在线观看| 精产国品久久一二三产区区别| 国产成人精品午夜福利训2021| 熟女91pooyn熟女| 亚洲国产成人最新资源| 午夜美女福利小视频| 精品一区二区三四区| 国产第一美女一区二区三区四区| jiuse91九色视频| 91 亚洲视频在线观看| 免费看国产av网站| 三级等保密码要求条款| 六月婷婷激情一区二区三区| 欧美精品 日韩国产| 青青擦在线视频国产在线| 国产激情av网站在线观看| 桃色视频在线观看一区二区| 一区二区三区视频,福利一区二区| 欧美亚洲少妇福利视频| 成年人该看的视频黄免费| 午夜dv内射一区区| 狠狠躁夜夜躁人人爽天天久天啪| 新婚人妻聚会被中出| 日本韩国免费福利精品| 午夜精品福利一区二区三区p| 99久久成人日韩欧美精品| 老司机午夜精品视频资源| av久久精品北条麻妃av观看| 亚洲精品亚洲人成在线导航| 亚洲中文精品人人免费| 人妻丝袜精品中文字幕| 久久精品国产23696| 精品suv一区二区69| www日韩a级s片av| 大陆胖女人与丈夫操b国语高清| 成人国产激情自拍三区| 久久久精品欧洲亚洲av| 欧美日韩亚洲国产无线码| 福利在线视频网址导航 | 岛国av高清在线成人在线| 看一级特黄a大片日本片黑人| 日本韩国免费一区二区三区视频| 日韩人妻xxxxx| 人妻少妇精品久久久久久| 欧美在线精品一区二区三区视频| 天天干天天啪天天舔| 成人伊人精品色xxxx视频| 91极品新人『兔兔』精品新作| 久草视频在线一区二区三区资源站| 亚洲激情av一区二区| 日本丰满熟妇BBXBBXHD| 一区二区三区国产精选在线播放| 日韩无码国产精品强奸乱伦| 边摸边做超爽毛片18禁色戒| 国产大鸡巴大鸡巴操小骚逼小骚逼| 日本特级片中文字幕| 9色在线视频免费观看| 国产刺激激情美女网站| 99精品国产aⅴ在线观看| 男人的天堂av日韩亚洲| 97精品成人一区二区三区| 欧美日本国产自视大全| 久久久极品久久蜜桃| 五十路老熟女码av| 国产三级精品三级在线不卡| 唐人色亚洲av嫩草| 日本免费视频午夜福利视频| 2021久久免费视频| 视频 国产 精品 熟女 | 日韩伦理短片在线观看| 中文字幕在线乱码一区二区| 日辽宁老肥女在线观看视频| 久久精品国产999| 日韩成人性色生活片| 91欧美在线免费观看| 青草青永久在线视频18| 久久精品在线观看一区二区| 在线观看操大逼视频| 99热这里只有精品中文| 亚洲高清国产拍青青草原| 久久永久免费精品人妻专区| 国产成人精品一区在线观看| 五十路熟女人妻一区二| 欧美精产国品一二三产品价格| 亚洲中文字幕国产日韩| 免费啪啪啪在线观看视频| 国产成人精品久久二区91| 亚洲国产第一页在线观看| 欧美中国日韩久久精品| 国产女人叫床高潮大片视频| 漂亮 人妻被中出中文| 午夜久久久久久久精品熟女| 69精品视频一区二区在线观看| 久草视频在线看免费| 婷婷午夜国产精品久久久| 精品人妻伦一二三区久| 一区二区三区的久久的蜜桃的视频 | 国产普通话插插视频| 亚洲另类在线免费观看| 在线免费视频 自拍| 午夜久久久久久久99| 偷拍自拍福利视频在线观看| 天天操天天干天天日狠狠插 | 成人综合亚洲欧美一区| 岛国毛片视频免费在线观看| 无码日韩人妻精品久久| 欧美老妇精品另类不卡片| 97超碰最新免费在线观看| 精品人人人妻人人玩日产欧| 91破解版永久免费| 日本高清成人一区二区三区| 日韩精品一区二区三区在线播放| 亚洲av无硬久久精品蜜桃| 中文字幕在线永久免费播放| yy6080国产在线视频| 大胆亚洲av日韩av| 丰满的子国产在线观看| 精品久久久久久久久久久久人妻| 国产自拍在线观看成人| 日本熟女精品一区二区三区| 久草视频首页在线观看| 中文字幕之无码色多多| 夜夜嗨av一区二区三区中文字幕| 中文字幕日韩无敌亚洲精品| 97精品综合久久在线| 人妻久久久精品69系列| 国产成人精品一区在线观看 | 青青草原色片网站在线观看| 黄色成年网站午夜在线观看| 在线观看av观看av| 欧美男人大鸡吧插女人视频| 鸡巴操逼一级黄色气| 开心 色 六月 婷婷| huangse网站在线观看| 成年人黄色片免费网站| 蜜桃视频在线欧美一区| 欧美国品一二三产区区别| 社区自拍揄拍尻屁你懂的| 成人影片高清在线观看| 婷婷五月亚洲综合在线| 深夜男人福利在线观看| 日韩熟女系列一区二区三区| 国产+亚洲+欧美+另类| 老师让我插进去69AV| 视频 一区二区在线观看| 岛国毛片视频免费在线观看| 免费无码人妻日韩精品一区二区| 19一区二区三区在线播放| 色97视频在线播放| 亚洲在线一区二区欧美| 青青青国产免费视频| 在线观看av2025| 亚洲精品 欧美日韩| 91麻豆精品秘密入口在线观看| 绝色少妇高潮3在线观看| 老司机福利精品免费视频一区二区| 91在线免费观看成人| 激情啪啪啪啪一区二区三区 | 日本后入视频在线观看 | 馒头大胆亚洲一区二区| 日视频免费在线观看| 丰满的继坶3中文在线观看| 亚洲色偷偷综合亚洲AV伊人| 国产午夜亚洲精品不卡在线观看 | 亚洲福利精品视频在线免费观看| 中文字幕日韩精品日本| 欧美乱妇无乱码一区二区| 亚洲av极品精品在线观看| 97国产在线av精品| 午夜在线一区二区免费| 亚洲一区二区三区久久午夜| 99久久成人日韩欧美精品| 美女小视频网站在线| 亚洲中文字字幕乱码| 日本又色又爽又黄又粗| 亚洲中文字字幕乱码| 国产亚洲欧美45p| 国产高清在线在线视频| 天天日天天干天天爱| 亚洲精品色在线观看视频| 日韩欧美一级精品在线观看| 青青青青青青草国产| av完全免费在线观看av| okirakuhuhu在线观看| 精品一区二区三区欧美| 毛片av在线免费看| 人妻少妇中文有码精品| av中文字幕电影在线看| 国产揄拍高清国内精品对白| 换爱交换乱高清大片| 九一传媒制片厂视频在线免费观看 | 成人国产影院在线观看| 国产乱子伦一二三区| 2020国产在线不卡视频| 91国偷自产一区二区三区精品| 日本熟妇色熟妇在线观看| 亚洲国产欧美一区二区三区…| rct470中文字幕在线| 婷婷激情四射在线观看视频| 国产揄拍高清国内精品对白| 香蕉片在线观看av| 五月天色婷婷在线观看视频免费| 老司机在线精品福利视频| 任我爽精品视频在线播放| 中文 成人 在线 视频| www天堂在线久久| 国产亚州色婷婷久久99精品| 毛片一级完整版免费| 国产熟妇乱妇熟色T区| 狠狠的往里顶撞h百合| 特黄老太婆aa毛毛片| 亚洲欧美激情中文字幕| 91精品国产高清自在线看香蕉网 | 99热碰碰热精品a中文| 中文字幕成人日韩欧美| 97精品视频在线观看| 日本av熟女在线视频| 亚洲人妻av毛片在线| 扒开让我视频在线观看| 欧美viboss性丰满| 国产麻豆国语对白露脸剧情| 92福利视频午夜1000看| 久久h视频在线观看| 国产亚洲天堂天天一区| 久草电影免费在线观看| 91国产资源在线视频| 欲满人妻中文字幕在线| 欧美一区二区三区四区性视频| 国产一区二区在线欧美| 538精品在线观看视频| 在线免费观看欧美小视频| 国产亚洲成人免费在线观看| 日本黄色三级高清视频| 99精品一区二区三区的区| 日本一道二三区视频久久| 国产精品成久久久久三级蜜臀av| 日本一本午夜在线播放| 天天干狠狠干天天操| 亚洲一区久久免费视频| 999久久久久999| 一个人免费在线观看ww视频| 蜜桃视频入口久久久| 国产aⅴ一线在线观看| 日本午夜久久女同精女女| 国产妇女自拍区在线观看| 成人H精品动漫在线无码播放| 久久久久久97三级| 天天日天天干天天插舔舔| 日本一道二三区视频久久| 五月天中文字幕内射| 一本一本久久a久久精品综合不卡| 午夜精品福利一区二区三区p | sw137 中文字幕 在线| av在线免费资源站| 亚洲成人国产综合一区| 精内国产乱码久久久久久| 亚洲成人情色电影在线观看| 91精品国产黑色丝袜| 经典av尤物一区二区| 中国产一级黄片免费视频播放| 2021国产一区二区| 福利片区一区二体验区| 女同久久精品秋霞网| 欧美80老妇人性视频| 97超碰免费在线视频| 97资源人妻免费在线视频| 午夜精品九一唐人麻豆嫩草成人| 国产成人精品亚洲男人的天堂| 亚洲欧美激情国产综合久久久| 久久丁香花五月天色婷婷| 人妻凌辱欧美丰满熟妇| 97青青青手机在线视频| japanese五十路熟女熟妇| 硬鸡巴动态操女人逼视频| 国产精品黄大片在线播放| 38av一区二区三区| 最新国产精品网址在线观看| 又黄又刺激的午夜小视频| av中文在线天堂精品| 大学生A级毛片免费视频| 中文字幕在线乱码一区二区| 欧美视频一区免费在线| 亚洲免费av在线视频| 久草极品美女视频在线观看| 日本性感美女三级视频| 中文字幕—97超碰网| 欧美精品久久久久久影院| 亚洲成人午夜电影在线观看| 和邻居少妇愉情中文字幕| 1769国产精品视频免费观看| 99精品视频之69精品视频 | 日本精品视频不卡一二三| 99热这里只有国产精品6| 亚洲欧美一区二区三区爱爱动图| 日本五十路熟新垣里子| 2020久久躁狠狠躁夜夜躁| 国产一区成人在线观看视频| 国产在线自在拍91国语自产精品| 97少妇精品在线观看| 中文字幕人妻熟女在线电影| 狠狠鲁狠狠操天天晚上干干| 亚洲成人情色电影在线观看| 亚洲一级美女啪啪啪| 999热精品视频在线| 不卡精品视频在线观看| 一区二区在线视频中文字幕| 国产不卡av在线免费| 美女福利视频网址导航| 中文亚洲欧美日韩无线码| 春色激情网欧美成人| 午夜精品一区二区三区4| 老师啊太大了啊啊啊尻视频| 国产一区二区在线欧美| 任我爽精品视频在线播放| 在线新三级黄伊人网| 中文字幕一区二区自拍| 亚洲国产成人最新资源| 午夜久久久久久久99| 黄色在线观看免费观看在线| 午夜美女少妇福利视频| 亚洲另类综合一区小说| 18禁美女黄网站色大片下载| 天天日天天干天天干天天日| 亚洲av日韩av网站| 91快播视频在线观看| 久久久精品999精品日本| 欧美黄片精彩在线免费观看| 99久久成人日韩欧美精品| 一区二区三区蜜臀在线| 美女av色播在线播放| 五十路人妻熟女av一区二区| 91片黄在线观看喷潮| 亚洲天堂成人在线观看视频网站| 啊用力插好舒服视频| 91久久人澡人人添人人爽乱| 特大黑人巨大xxxx| 中文字幕无码日韩专区免费| 国产麻豆乱子伦午夜视频观看| 老鸭窝日韩精品视频观看| 大学生A级毛片免费视频| 亚洲一级特黄特黄黄色录像片| 亚洲国际青青操综合网站| 亚洲欧美自拍另类图片| 九色porny九色9l自拍视频| 91中文字幕最新合集| 5528327男人天堂| 夜夜嗨av一区二区三区中文字幕| 伊人网中文字幕在线视频| 日韩午夜福利精品试看| 成人蜜桃美臀九一一区二区三区 | 中文字幕日韩无敌亚洲精品| 欧美中国日韩久久精品| 又大又湿又爽又紧A视频| 亚洲av第国产精品| av男人天堂狠狠干| 日韩成人综艺在线播放| 亚洲伊人av天堂有码在线| 中文字幕欧美日韩射射一| 91色秘乱一区二区三区| 国产三级精品三级在线不卡| 99精品国产aⅴ在线观看| 久久国产精品精品美女| yy96视频在线观看| 欧美成人一二三在线网| v888av在线观看视频| 国产亚洲视频在线观看| 黄色成年网站午夜在线观看| 初美沙希中文字幕在线 | 中国熟女@视频91| 黄色录像鸡巴插进去| 免费一级黄色av网站| 欧美久久一区二区伊人| 日本高清成人一区二区三区| 国产精品手机在线看片| 日韩av大胆在线观看| 一区二区三区四区视频在线播放| 清纯美女在线观看国产| 91综合久久亚洲综合| 又粗又长 明星操逼小视频 | 亚洲另类图片蜜臀av| 视频久久久久久久人妻| 天天日天天日天天射天天干| 亚洲av日韩av第一区二区三区| 五十路熟女av天堂| 国产使劲操在线播放| 91色老99久久九九爱精品| 国产成人精品av网站| 亚洲 欧美 精品 激情 偷拍 | 超黄超污网站在线观看| 伊人日日日草夜夜草| 亚洲第一黄色在线观看| 最新91九色国产在线观看| 久久久久久久久久久免费女人| 搡老熟女一区二区在线观看| 91免费福利网91麻豆国产精品| 国产女人叫床高潮大片视频| 亚洲中文精品字幕在线观看| 少妇ww搡性bbb91| 中国熟女@视频91| 免费在线黄色观看网站| 最近中文2019年在线看| 成熟熟女国产精品一区| 黄色在线观看免费观看在线| 青青青视频自偷自拍38碰| 啊用力插好舒服视频| 天天日天天透天天操| 久久久久91精品推荐99| 亚洲视频在线观看高清| 国产福利小视频大全| 国产自拍在线观看成人| 最新的中文字幕 亚洲| 中文字幕人妻被公上司喝醉在线| av成人在线观看一区| 深田咏美亚洲一区二区| 精品区一区二区三区四区人妻| 精品日产卡一卡二卡国色天香| 国产精品三级三级三级| 97人妻总资源视频| 黄色在线观看免费观看在线| 亚洲另类在线免费观看| 在线视频免费观看网| 中文字幕一区二区人妻电影冢本| 久精品人妻一区二区三区| 成人区人妻精品一区二视频| 久草福利电影在线观看| 98视频精品在线观看| 在线免费观看国产精品黄色| 欧美精品欧美极品欧美视频| 亚洲av极品精品在线观看| 午夜精品亚洲精品五月色| 100%美女蜜桃视频| 亚洲欧美一区二区三区爱爱动图 | 在线可以看的视频你懂的| 日本人妻少妇18—xx| yy6080国产在线视频| 欧美xxx成人在线| 93精品视频在线观看| 中文字幕人妻一区二区视频| 天天日天天天天天天天天天天| 亚洲精品一区二区三区老狼| 天天射夜夜操狠狠干| av手机免费在线观看高潮| 欧美女同性恋免费a| 日韩国产乱码中文字幕| 在线免费观看亚洲精品电影| 亚洲熟女综合色一区二区三区四区| 免费费一级特黄真人片| 青青青青草手机在线视频免费看| 人人妻人人人操人人人爽| 老司机免费福利视频网| 人妻爱爱 中文字幕| 福利在线视频网址导航| rct470中文字幕在线| 亚洲精品国偷自产在线观看蜜桃| 亚洲图片偷拍自拍区| 亚洲一级特黄特黄黄色录像片| 亚洲欧美国产综合777| xxx日本hd高清| 国产av福利网址大全| 亚洲成人av在线一区二区| 性欧美激情久久久久久久| 黄色在线观看免费观看在线| 国产欧美精品不卡在线| 1024久久国产精品| 久久久久久9999久久久久| 中文字幕一区二区人妻电影冢本| 红桃av成人在线观看| 成人午夜电影在线观看 久久| 亚洲青青操骚货在线视频| 成人色综合中文字幕| 久久久91蜜桃精品ad| 免费69视频在线看| 岳太深了紧紧的中文字幕| 亚洲成人av一区在线| 男生舔女生逼逼视频| 精品av国产一区二区三区四区| 99re久久这里都是精品视频| 制服丝袜在线人妻中文字幕| 偷拍自拍视频图片免费| 色在线观看视频免费的| 欧美特色aaa大片| 香蕉片在线观看av| 成人影片高清在线观看| 欧美美女人体视频一区| av俺也去在线播放| 天天通天天透天天插| 精品首页在线观看视频| 在线播放一区二区三区Av无码| 大鸡巴插入美女黑黑的阴毛| 亚洲公开视频在线观看| 欧美成人综合视频一区二区| 久久久久久久一区二区三| 国产av国片精品一区二区| 毛片一级完整版免费| 亚洲1区2区3区精华液| 沈阳熟妇28厘米大战黑人| av大全在线播放免费| 黄色中文字幕在线播放| 黑人变态深video特大巨大| 55夜色66夜色国产精品站| 天天操,天天干,天天射| 一区二区麻豆传媒黄片| 天美传媒mv视频在线观看| 日本精品视频不卡一二三| 国产午夜福利av导航| 日视频免费在线观看| 国产av欧美精品高潮网站| 精品国产污污免费网站入口自| 99久久超碰人妻国产| 日韩少妇人妻精品无码专区| 男人的天堂av日韩亚洲| 操操网操操伊剧情片中文字幕网| 视频一区 二区 三区 综合| 偷拍美女一区二区三区| 亚洲第17页国产精品| 亚洲一区二区三区uij| 97超碰最新免费在线观看| 在线视频自拍第三页| 免费观看理论片完整版| 亚洲人人妻一区二区三区| 日韩av有码中文字幕| 天天日天天干天天插舔舔| 亚洲熟色妇av日韩熟色妇在线| 综合一区二区三区蜜臀| 亚洲国产最大av综合| 欧美第一页在线免费观看视频| 人妻最新视频在线免费观看| 一区二区熟女人妻视频| 午夜国产福利在线观看| 国产成人小视频在线观看无遮挡| 色秀欧美视频第一页| av大全在线播放免费| 色哟哟在线网站入口| 日日操综合成人av| 色婷婷精品大在线观看| 久久这里有免费精品| 国产又粗又硬又猛的毛片视频| 天天射夜夜操狠狠干| 日韩欧美国产精品91| 国产成人无码精品久久久电影| 亚洲福利精品视频在线免费观看| 亚洲av第国产精品| 在线观看av2025| 大肉大捧一进一出好爽在线视频| 美女被肏内射视频网站| chinese国产盗摄一区二区 | 天天日天天干天天搡| av欧美网站在线观看| 51国产成人精品视频| 青青青激情在线观看视频| 欧美色婷婷综合在线| 香蕉91一区二区三区| 91免费观看在线网站| 涩爱综合久久五月蜜臀| 成人蜜桃美臀九一一区二区三区| 午夜久久久久久久99| 懂色av之国产精品| 亚洲精品成人网久久久久久小说| 亚洲国际青青操综合网站| 日本av在线一区二区三区| 亚洲欧美人精品高清| 高清一区二区欧美系列| 日本人竟这样玩学生妹| 无码国产精品一区二区高潮久久4| 免费观看丰满少妇做受| 国产普通话插插视频| 欧美爆乳肉感大码在线观看 | 亚洲精品在线资源站| 亚洲免费va在线播放| av网址国产在线观看| 强行扒开双腿猛烈进入免费版| 在线不卡成人黄色精品| 伊拉克及约旦宣布关闭领空| 午夜精品一区二区三区更新| 亚洲成人黄色一区二区三区| av手机在线免费观看日韩av| 成人免费做爰高潮视频| 亚洲一区二区三区精品视频在线| ka0ri在线视频| 大尺度激情四射网站| 亚洲国产成人在线一区| 视频 国产 精品 熟女 | 天堂av在线官网中文| 欧美综合婷婷欧美综合| 国产卡一卡二卡三乱码手机| 国产精品大陆在线2019不卡| 青青青青青青青青青青草青青| 大鸡巴后入爆操大屁股美女| 伊人综合免费在线视频| 高清成人av一区三区| 亚洲一区二区激情在线| 人妻少妇中文有码精品| 很黄很污很色的午夜网站在线观看| 五十路熟女av天堂| 亚洲 欧美 自拍 偷拍 在线| 青青青青爽手机在线| 亚洲一区二区三区精品视频在线| 久久久久久99国产精品| 很黄很污很色的午夜网站在线观看 | 国产亚洲成人免费在线观看 | 91国内精品久久久久精品一| 三上悠亚和黑人665番号| 2019av在线视频| 日本午夜爽爽爽爽爽视频在线观看| 在线观看亚洲人成免费网址| 人妻最新视频在线免费观看| 人人妻人人人操人人人爽| 扒开让我视频在线观看| 红桃av成人在线观看| 蜜桃专区一区二区在线观看| 福利视频网久久91| 亚洲精品久久视频婷婷| 日韩人妻丝袜中文字幕| 人人妻人人爱人人草| 超碰97人人澡人人| 2022精品久久久久久中文字幕| 国产老熟女伦老熟妇ⅹ| 黄色大片男人操女人逼| 欧美精品资源在线观看| 亚洲人妻国产精品综合| 精品久久久久久久久久久a√国产 日本女大学生的黄色小视频 | 日本av在线一区二区三区| 欧亚乱色一区二区三区| 2022天天干天天操| 亚洲精品国品乱码久久久久| 国产黑丝高跟鞋视频在线播放| 精品久久婷婷免费视频| 青娱乐在线免费视频盛宴| av网址在线播放大全| 亚洲综合色在线免费观看| 宅男噜噜噜666国产| 国产一级精品综合av| 久久亚洲天堂中文对白| 夏目彩春在线中文字幕| av在线免费资源站| 老司机福利精品视频在线| 欧美一区二区三区四区性视频|