定时任务之时间轮算法
初识时间轮
我们先来考虑一个简单的情况,目前有三个任务A、B、C,分别需要在3点钟,4点钟和9点钟执行,可以把时间想象成一个钟表。

如上图中所示,我只需要把任务放到它需要被执行的时刻,然后等着时针转到这个时刻时,取出该时刻放置的任务,执行就可以了。 这就是时间轮算法最核心的思想了。 时针怎么转呢? while-true-sleep ,也可以使用空的阻塞队列加上超时时间进行睡眠。
在大多数情况中同一时刻可能需要执行多个任务,比如每天上午九点除了生成报表之外,还需要执行发送邮件的任务,需要执行创建文件的任务等等。
时间轮的数据结构。首先,时间轮的刻度可以用数组或者链表表示,每个刻度就是一个槽,槽用来存放该刻度需要执行的任务,如果有多个任务需要执行呢?每个槽里面放一个链表就可以了,就像下面图中这样:

同一时刻存在多个任务时,只要把该刻度对应的链表全部遍历一遍,执行(扔到线程池中异步执行)其中的任务即可。
简单时间轮的实现
由一个 hash table和链表实现,HashTable 的 key 值为时间单位,value 为链表的 root 节点。
时间刻度不够用怎么办?
上述时间轮表示一天的时间,但如果任务不只限定在一天之内呢?比如我有个任务,需要每周一上午1点执行,我还有另一个任务,需要每月的第十二天的上午四点执行。一种很容易想到的解决办法是:
1.增大时间轮的刻度
一天24个小时,一周168个小时,一月720个小时,为了解决上面的问题,我可以把时间轮的刻度(槽)从12个增加到168个,所以每周一上午1点就是时间轮的第1个刻度,每周五上午4点就是时间轮的第100个刻度,示意图如下:

仔细思考一下,会发现这种方式存在几个缺陷:
1.时间刻度太多会导致时间轮走到的多数刻度没有任务执行,比如一个月就2个任务,按照一个月30天算,需要移动720次,其中718次是无用的。
2.时间刻度太多会导致存储空间变大,利用率变低。
这种方式直接导致空间复杂度变大。
2.增加圈数
为每个任务增加一个圈数round标识,每次遍历到这个任务时,圈数减1,当圈数为0时,执行该任务,示意图如下:

但这种,每次时间轮转动,都需要对整个任务链表进行计算,增加了时间复杂度。最完美的实现就是转到对应刻度时,执行该刻度下所有的任务。
分层时间轮
分层时间轮是这样一种思想:每个时间粒度对应一个时间轮,多个时间轮之间进行级联协作。基于这个思想,我们可以设置三个时间轮:月轮、周轮、天轮。
比如有一个任务三每个月12号上午九点。
月轮的刻度为30天,周轮的刻度为7天,天轮为24小时。
这个任务需要月轮的时间刻度转动到12号这一天,然后才需要关注其更细一级的时间单位:上午9点。

初始添加任务时,任务一每周二上午九点,任务二每周四上午九点,任务三每个月12号上午九点。为任务一添加到天轮上,任务二添加到周轮上,任务三添加到月轮上。三个时间轮以各自的时间刻度不停流转。
当周轮移动到刻度2(星期四)时,取出这个刻度下的任务,丢到天轮上,天轮接管该任务,到9点执行。
同理,当月轮移动到刻度12(12号)时,取出这个刻度下的任务,丢到天轮上,天轮接管该任务,到9点执行。
这样就可以做到既不浪费空间,有不浪费时间。
整体的示意图如下所示:
定时器一览
1.无序定时器列表
2.有序定时器列表
3. 定时器树
4. 简单的计时轮
5. 带有有序定时器列表的哈希轮
6. 带有无序定时器列表的哈希轮
7.分层时间轮
时间轮的应用
时间轮的思想应用范围非常广泛,各种操作系统的定时任务调度,Redisson、Crontab、Netty、Kafka、Caffeine等组件的时间任务调度均采用时间轮的思想。
在不同的场景下,选择合适的定时器。
参考资料
hashed-and-hierarchical-timeing-wheels论文:Hashed and Hierarchical Timing Wheels: Data Structures for the Efficient Implementation of a Timer Facility | the morning paper
时间轮简介:时间轮timewheel算法_天涯泪小武的博客-CSDN博客
netty时间轮分析:Netty时间轮 - 腾讯云开发者社区-腾讯云
相关文章:
定时任务之时间轮算法
初识时间轮 我们先来考虑一个简单的情况,目前有三个任务A、B、C,分别需要在3点钟,4点钟和9点钟执行,可以把时间想象成一个钟表。 如上图中所示,我只需要把任务放到它需要被执行的时刻,然后等着时针转到这个…...
实验4 Matplotlib数据可视化
1. 实验目的 ①掌握Matplotlib绘图基础; ②运用Matplotlib,实现数据集的可视化; ③运用Pandas访问csv数据集。 2. 实验内容 ①绘制散点图、直方图和折线图,对数据进行可视化; ②下载波士顿数房价据集,并…...
【软件工程】为什么要选择软件工程专业?
个人主页:【😊个人主页】 文章目录 前言软件工程💻💻💻就业岗位👨💻👨💻👨💻就业前景🛩️🛩️🛩️工作环…...
5类“计算机”专业很吃香,人才缺口巨大,就业前景良好
说到目前最热门的专业,计算机绝对占有一席之地,是公认的发展前景好、人才缺口大的专业。有人称该专业人数如此众多,势必会导致人才饱和,但是从当前社会互联网发展的趋势来看,计算机专业在很长一段时间都是发展很好的专…...
数仓选型对比
1、数仓选型对比如下(先列举表格,后续逐个介绍) 数仓应用目标产品特点适用于 适用数据类型数据处理速度性能拓展 实施难度运维难度性能优化成本传统数仓(SQLServer、Oracle等关系型数据库)面向主题设计的,为 分析数据而设计基于Oracle、 SQLServer、MyS…...
二叉树的遍历(前序、中序、后序)Java详解与代码实现
递归遍历 前序,中序,后序 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val val; }* TreeNode(int val, Tree…...
如何找出消耗CPU最多的线程?
如何找出消耗CPU最多的线程? 1.使用 top -c 找出所有当前进程的运行列表 top -c 2.按P(Shiftp)对所有进程按CPU使用率进行排序,找出消耗最高的线程PID 显示Java进程 PID 为 136 的java进程消耗最 3.使用 top -Hp PID,查出里面消…...
【论文笔记】Attention Augmented Convolutional Networks(ICCV 2019 入选文章)
目录 一、摘要 二、介绍 三、相关工作 卷积网络Convolutional networks: 网络中注意力机制Attention mechanisms in networks: 四、方法 1. 图像的自注意力Self-attention over images: 二维位置嵌入Two-dimensional Positional Enco…...
虚幻图文笔记:Character Creator 4角色通过AutoSetup For Unreal Engine插件导入UE5.1的过程笔记
在UE5端安装AutoSetup For Unreal Engine插件 AutoSetup For Unreal Engine是Reallusion官方提供的免费插件,官方下载地址,下载到的是一个可执行文件,点击安装,记住安装的位置⬇ 看装完毕后会打开一个文件夹,这里就是对…...
JAVAWeb04-DOM
1. DOM 1.1 概述 1.1.1 官方文档 地址: https://www.w3school.com.cn/js/js_htmldom.asp 1.1.2 DOM 介绍 DOM 全称是 Document Object Model 文档对象模型就是把文档中的标签,属性,文本,转换成为对象来管理 1.2 HTML DOM(文档…...
C++内存管理基础知识
C 内存管理 C内存管理是一个重要的主题,因为它涉及到程序运行时资源的分配和释放。它可以分为三种类型:静态内存、栈内存和堆内存。 静态内存 静态内存(Static Memory):静态内存用于存储全局变量、静态变量和常量。这…...
命令执行漏洞概述
命令执行漏洞概述 命令执行定义命令执行条件命令执行成因命令执行漏洞带来的危害远程命令执行漏洞相关函数assert()preg_replace()call_user_func() a ( a( a(b)可变函数远程命令执行漏洞的利用系统命令执行漏洞相关函数system()exec()shell_exec()passthru(&#x…...
【初试复试第一】脱产在家二战上岸——上交819考研经验
笔者来自通信考研小马哥23上交819全程班学员 先介绍一下自己,我今年初试426并列第一,加上复试之后总分600,电子系第一。 我本科上交,本科期间虽然没有挂科但是成绩排名处于中下游水平。参加过全国电子设计大赛,虽然拿…...
PTA:C课程设计(7)
山东大学(威海)2022级大一下C习题集(7) 函数题7-6-1 递增的整数序列链表的插入7-6-2 查找学生链表7-6-3 统计专业人数7-6-4 建立学生信息链表 编程题7-7-1 查找书籍7-7-2 找出总分最高的学生 函数题 7-6-1 递增的整数序列链表的插…...
POSTGRESQL LINUX 与 PG有关的内存参释义
开头还是介绍一下群,如果感兴趣polardb ,mongodb ,mysql ,postgresql ,redis 等有问题,有需求都可以加群群内有各大数据库行业大咖,CTO,可以解决你的问题。加群请联系 liuaustin3 ,在新加的朋友会分到2群(共…...
Docker的常见命令
前言:使用Docker得学会的几个常见命令 常见命令前置学习: docker --help这个命令必须得会因为,很多命令是记不住的,得使用他们的官方help下面是一些实例 docker load --help常见命令集合: 一: docker images #查看全部镜像 docker rmi #删除某个镜像(例如:docker rmi redis…...
详细介绍性能测试的方法(含文档)
性能测试是软件测试中的一个重要环节,其目的是评估系统在不同负荷下的性能表现,包括响应时间、吞吐量、并发数等指标。通常可以通过以下几种方法进行性能测试: 1、负载测试 负载测试是模拟多用户同时访问系统,测试系统在高并发、…...
深入剖析 Qt QHash :原理、应用与技巧
目录标题 引言QHash 基础用法基础用法示例基础用法综合示例 QHash 的高级用法迭代器:遍历 QHash 中的元素(Iterators: Traversing Elements in QHash )QHash和其他容器的对比QHash 和 std::unordered\_map QHash的底层原理和内存管理QHash 的…...
技术分享 | MySQL级联复制下进行大表的字段扩容
作者:雷文霆 爱可生华东交付服务部 DBA 成员,主要负责Mysql故障处理及相关技术支持。爱好看书,电影。座右铭,每一个不曾起舞的日子,都是对生命的辜负。 本文来源:原创投稿 *爱可生开源社区出品,…...
工业互联网业务知识
文章目录 背景第四次工业革命带动制造业产业升级主要工业大国不同路径 架构ISA95体系架构变革趋势基础通用架构数据采集平台 工业互联网应用软件工业互联网全要素连接产品视角:产销服务企业的业务流程企业数字化改造:车间级全要素连接 工业互联网的产品体…...
Amazon Corretto 17全链路优化指南:从底层原理到企业级实践
Amazon Corretto 17全链路优化指南:从底层原理到企业级实践 【免费下载链接】corretto-17 Amazon Corretto 17 is a no-cost, multi-platform, production-ready distribution of OpenJDK 17 项目地址: https://gitcode.com/gh_mirrors/co/corretto-17 Amazo…...
门户网站被入侵了怎么办?从紧急止损到重建免疫的完整作战手册
当监控警报响起,发现服务器存在异常进程、网站首页或核心栏目内容被恶意篡改、或数据库出现不明查询时,一个可怕的现实摆在眼前:您的门户网站已经被入侵了。门户网站作为企业或机构的官方形象窗口,一旦被入侵,不仅直接…...
STM32L0待机模式唤醒后程序跑飞?用LL库/HAL库正确处理系统复位与初始化
STM32L0待机模式唤醒后的系统复位陷阱与实战解决方案 引言:被忽视的唤醒后世界 当你按下STM32L0的唤醒按键,看到电流表指针从微安级跳回毫安级,内心是否涌起一阵成就感?但紧接着,OLED屏幕不再刷新,蓝牙模块…...
ChatGPT归档数据恢复机制深度解析:原理与实战指南
ChatGPT归档数据恢复机制深度解析:原理与实战指南 在AI应用开发中,数据管理是一个绕不开的话题。随着项目迭代和用户量增长,对话记录、训练数据、配置信息等会迅速累积。为了平衡存储成本与数据可用性,归档(Archive&a…...
【ArUco GridBoard实战】从精度瓶颈到优化检测的完整指南
1. ArUco GridBoard的精度瓶颈与优化思路 在实际的计算机视觉项目中,我们经常会遇到标定板尺寸受限的情况。比如我之前做的一个工业检测项目,标定板尺寸被限制在3cm2cm以内。最初使用的是Charuco标定板,但很快就发现了一个严重问题࿱…...
数据科学好帮手:OpenClaw+GLM-4.7-Flash自动化分析工作流
数据科学好帮手:OpenClawGLM-4.7-Flash自动化分析工作流 1. 为什么需要自动化数据科学工作流 作为一个经常处理数据的人,我发现自己80%的时间都花在了重复性劳动上:清洗数据、生成基础可视化、写分析报告。每次开始一个新项目,都…...
5分钟搞定COCO数据集下载与配置:从官网到百度云全攻略(附多线程加速技巧)
COCO数据集极速获取指南:从官方源到镜像站的全链路方案 刚接触计算机视觉的新手们,往往在第一步获取数据集时就遭遇"劝退"——动辄几十GB的COCO数据集,官网下载速度堪比蜗牛爬行,百度云限速让人抓狂。本文将分享一套经过…...
用1/100成本,Tacore要让企业告别“软件定制”时代
商业化未满20天,签约20家企业,ARR预估120万。一位零基础企业主通过Tacore在7天内独立完成了百人规模公司的CRM系统,成本仅为传统的1/100,效率提升1000倍。 这是Tacore的故事——一个为AI彻底重构底层的OPC超级个体创业团队&#x…...
毕设代码二手房数据实战:从爬取到可视化的一站式工程实现
最近在帮学弟学妹看计算机专业的毕业设计,发现“二手房数据分析”真是个热门选题。想法都挺好,但一到动手实现,很多人就卡在了数据上:要么网站反爬太严数据抓不下来,要么抓下来的数据乱七八糟没法用,好不容…...
Python内存占用直降63%!20年CTO首次公开智能体内存策略的3级缓存配置模板
第一章:Python智能体内存管理策略配置步骤详解 Python智能体(如基于LangChain、LlamaIndex构建的Agent)在长时间运行或高并发场景下易遭遇内存泄漏、对象堆积与GC延迟问题。合理配置内存管理策略,是保障其稳定性和响应效率的关键环…...
