延迟任务(Redis实现)

1. 什么是延迟任务?

延迟任务是当我们提交一件事情后,在未来的某个时间点自动执行另外一件事情。

例如:12306购票系统,当我选择购买一张火车票后,点击下单,在没有付款的情况下,30分钟后会自动取消订单。

2. 延迟任务的实现方式

  1. 使用JVM的DelayQueue
  2. 使用MQ(RabbitMQ的TTL+死信交换机)
  3. 使用Redis

3. 方式3实现思路

  1. 创建一个专门存储延迟任务的表
    表结构如下:future_task(future_id,execute_time,parameters,priority,type)

    为什么这样设计?
    考虑到通用性(即延迟任务服务化)

  2. 提交一个任务后,首先存储到数据库MySQL的future_task表中,做一个持久化操作

  3. 根据这件任务的 执行时间 <= 当前时间

    • 如果成立,就代表这个任务的已经可以开始执行,将其放入 Redis 中的 消费任务队列 队列 List
    • 否则,就代表这个任务还没到执行时间,就以执行时间为 score 以这个任务为对象,存入 Redis 中的 延迟任务队列 ZSet
    • 但是为了考虑 性能 ,ZSet中不能存储大量的数据,因此在存入ZSet之前,设置一个阈值,即任务的执行时间在未来5分钟之内
    • 如果执行时间超过5分钟,就先将任务存放到数据库MySQL
    • 那超过5分钟的数据被存储到MySQL中后,该怎么同步到 ZSet呢,需要一个定时任务作为同步器,定期扫描MySQL中任务的执行时间是否在未来5分钟之内,如果是,就将其同步到ZSet中
  4. 后面设置一个定时任务 去 ZSet 延迟任务队列 去根据 执行时间 是否小于当前时间,如果是,就将其从ZSet 中移除,放入 消费任务队列List中,等待消费

  5. 消费任务,从 消费任务队列 List进行消费

相关推荐

  1. 延迟任务Redis实现

    2024-03-30 21:42:05       41 阅读
  2. redis实现延迟任务(四)

    2024-03-30 21:42:05       59 阅读
  3. Redis实现延迟任务队列(一)

    2024-03-30 21:42:05       48 阅读
  4. Redis延迟队列原理及实例

    2024-03-30 21:42:05       42 阅读
  5. Redisson延迟任务

    2024-03-30 21:42:05       57 阅读
  6. 在springboot中利用Redis实现延迟队列

    2024-03-30 21:42:05       40 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-30 21:42:05       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-30 21:42:05       101 阅读
  3. 在Django里面运行非项目文件

    2024-03-30 21:42:05       82 阅读
  4. Python语言-面向对象

    2024-03-30 21:42:05       91 阅读

热门阅读

  1. LeetCode-热题100:155. 最小栈

    2024-03-30 21:42:05       41 阅读
  2. 【无标题】

    2024-03-30 21:42:05       36 阅读
  3. 专升本-现代通信技术5G

    2024-03-30 21:42:05       45 阅读
  4. 【C语言】作用域规则

    2024-03-30 21:42:05       45 阅读
  5. MySQL日志——redo log和bin log的刷盘时机详解

    2024-03-30 21:42:05       37 阅读
  6. 乐观锁的简单感悟

    2024-03-30 21:42:05       42 阅读
  7. 【python】一些常用的小脚本

    2024-03-30 21:42:05       41 阅读
  8. 大三实习小菜蛋之document元素节点

    2024-03-30 21:42:05       35 阅读