定时器的实现原理

文章目录

  • 1.定时器的作用?
  • 2.数据结构要求
  • 3.时间轮
  • 4.分级时间轮
  • 5.业界实现方案
  • 参考文献

1.定时器的作用?

定时器的主要用途是执行定时任务。

定时任务在很多场景都需要用到,比如游戏的 Buff 实现,Redis 中的过期任务,Linux 中的定时任务,电商未支付订单的关闭等等。

2.数据结构要求

定时器需要支持如下几个操作:

  • 创建定时器
  • 添加定时任务
  • 取消定时任务
  • 执行到期任务(查找)

以下为常见实现定时器数据结构的时间复杂度:

  • 有序链表:插入O(n),删除 O(1),过期 expire 执行 O(1)
  • 最小堆:插入O(logn),删除 O(logn),过期 expire 执行 O(1)
  • 红黑树:插入O(logn),删除 O(logn),过期 expire 执行 O(logn)
  • 哈希表+链表(时间轮):插入 O(1),删除 O(1),过期 expire 平均执行 O(1)(最坏为O(n))

不同开源框架定时器实现方式不一,如 libuv 采用最小堆,nginx 采用红黑树,linux 内核和 skynet 采用时间轮算法等等。

3.时间轮

一个时间轮是一个环形结构,可以想象成时钟,分为很多格子,一个格子代表一段时间(越短 Timer 精度越高),并用一个 List 保存在该格子上到期要执行的所有任务。同时一个指针随着时间流逝一格一格移动,并执行对应 List 中所有到期的任务。任务通过取模决定应该放入哪个格子。
在这里插入图片描述

以上图为例,假设一个格子是1秒,则整个 wheel 能表示的时间段为 8s。

假如当前指针指向 0。

此时需要调度一个 3s 后执行的任务,显然应该加入到(0+3=3)的方格中,指针再走3次就可以执行了。

如果任务要在10s后执行,应该等指针走完一个 round 零 2 格再执行,因此应放入2并将 round 标记为 2 表示第二轮时执行。

4.分级时间轮

如果任务的时间跨度很大,数量也多,传统的时间轮会造成任务的 round 很大,单个格子的任务 List 很长,并会维持很长一段时间。

这时可将 Wheel 按时间粒度分级:

在这里插入图片描述

这种方式的优点在于能够保证任务链表的长度一直在比较短的状态,但缺点是需要更多的空间。

5.业界实现方案

业界对于定时器/延迟队列的工程实践,则通常使用以下几种方案。

  • 基于 Redis ZSet 实现。
  • 采用某些自带延迟选项的队列实现,如 RabbitMQ、Beanstalkd、腾讯 TDMQ 等。
  • 基于 Timing-Wheel 时间轮算法实现。

参考文献

如何快速实现一个定时器?- InfoQ

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/31940.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【总结】yarn ResourceManager 宕机重启总是失败解决排查

目录 Yarn ResourceManager 莫名奇妙宕机重启Yarn ResourceManager 报错1重启Yarn ResourceManager 报错2成功解决 Yarn ResourceManager 莫名奇妙宕机 接到同事反馈,说yarn RM 端口总是访问超时。但是查看日志,又没有发现任务蛛丝马迹,且RM…

Redis的复制

配置 在Redis中使用复制功能非常容易 在从Redis服务器的redis.conf中写入slaveof masterip masterport即可,主Redis服务器不需要做任何配置在启动Redis服务器的时候,指定主服务器,redis-server --slaveof masterip masterport在客户端指定主…

如何评估大型语言模型(LLM)?

编者按:近期几乎每隔一段时间,就有新的大语言模型发布,但是当下仍然没有一个通用的标准来评估这些大型语言模型的质量,我们急需一个可靠的、综合的LLM评估框架。 本文说明了为什么我们需要一个全面的大模型评估框架,并…

C#TryCatch用法

前几天一个学员在学习C#与TryCatch用法时,也不知道TryCatch用法装可以用来做什么 。下面我们就详细讲讲C# 和封TryCatch用法相关知识。 C# 是一种通用、类型安全且面向对象的编程语言,由微软开发并在 .NET 平台上运行。TryCatch 是 C# 语言中的一个结构&#xff0c…

CSS的自定义属性var和JS的classList.toggle()方法,使用详细(css中var变量怎么应用)

简介:CSS中的var(变量)是CSS3中的新特性,用于定义可重用的值,类似于编程语言中的变量;它允许您在整个CSS文件中定义一个值,并在需要时使用该值。这样可以使CSS更加灵活和易于维护;cl…

环境搭建【1】VM和ubuntun 环境搭建

1.安装VMware 1.1 下载安装包 (1)官网下载:https://customerconnect.vmware.com/en/downloads/info/slug/desktop_end_user_computing/vmware_workstation_pro/16_0 (2)百度网盘:https://pan.baidu.com/s/…

软考高级系统架构设计师(三) 基础知识之操作系统2(分页/分段/段页存储)

目录 存储管理 页式存储 段式存储 段页式存储 存储管理 存储管理的主要目的:解决多个用户共同使用主存的问题(怎么分配内存??) 主要包括分区存储管理、分页存储管理、分段存储器管理、段页式存储管理以及虚拟存储…

windows10企业版安装西门子博途V15---01准备环境

网上看到了很多博途安装的文章或视频,一大部分都是你抄抄,我抄抄,滥鱼充饥,一是文章思路不清晰,二是具体安装环境不一致,三是视频讲解混乱,视频不清楚,操作有错误,其中不…

2022(一等奖)D678基于改进结构函数法的大气气溶胶遥感反演

作品介绍 1 应用背景 大气气溶胶是大气中重要的成分之一,是悬浮于大气中的固体和液体微粒与它们的气体载体共同组成的多相体系,其尺度大约在10-3到102 μm之间。大气气溶胶的特性对空气质量具有良好的指示作用,气溶胶的研究对空气质量的监测…

使用大白菜PE给苹果电脑安装win7ghost

如何安装大白菜苹果电脑?ghost (苹果电脑能用大白菜安装系统吗) 喜欢用苹果Mac电脑,开始后发现不习惯苹果的操作系统,还是习惯用Windows我们可以给苹果系统Mac电脑上安装Windows系统,享受苹果的外观,操作windows系统…

机器学习之基于LDA的人脸识别

目录 LDA降维 思想 matlab代码 fisherface 思想 matlab代码 人脸识别 思想 matlab代码 LDA降维 思想 首先,代码通过使用dir函数获取指定路径下所有以".bmp"结尾的文件,并存储在变量pictures中。 然后,定义了一些参数&a…

机器学习之线性回归算法

目录 线性回归算法 求导法推导 梯度下降法推导 线性回归实现人脸识别 导入数据 构建标签矩阵 经典线性回归求导法实现 经典线性回归梯度下降法实现 岭回归实现 套索回归实现 局部加权线性回归实现 可视化 人脸识别 线性回归算法 求导法推导 梯度下降法推导 线性回…

TypeScript ~ TS 掌握编译文件配置项 ⑤

作者 : SYFStrive 博客首页 : HomePage 📜: TypeScript ~ TS 📌:个人社区(欢迎大佬们加入) 👉:社区链接🔗 📌:觉得文章不错可以点点关注 &…

计算机网络——网络层

序言 计算机网络中的网络层在当今的社会起到了什么作用? 现在的互联网通信,远程办公和远程教育,电子商务和在线服务,信息共享和社交媒体,物联网和智能家居都是通过网络层才能使用的。它连接了人们、设备和信息&#xf…

chatgpt赋能python:Python编译成SO文件和反编译的介绍

Python编译成SO文件和反编译的介绍 什么是SO文件? SO文件,也称为共享对象文件,是一种二进制文件格式,用于在多个应用程序之间共享代码和数据。在Unix和类Unix系统中,它们通常是共享库文件的形式。因此,SO…

Vue-scoped(局部)样式

scoped(局部)样式 scoped是在脚手架有一个编写样式的小技巧 作用:让样式在局部生效,防止冲突 1 编写案例 现在有两个组件,一个student,一个school,现在想给组件写点样式 这里只给个背景色 没问题,样式生效 2 样式冲…

自然语言处理从入门到应用——动态词向量预训练:ELMo词向量

分类目录:《自然语言处理从入门到应用》总目录 在双向语言模型预训练完成后,模型的编码部分(包括输入表示层以及多层堆叠LSTM)便可以用来计算任意文本的动态词向量表示。最自然的做法是使用两个LSTM的最后一层隐含层输出作为词的动…

GPT学习笔记-Enterprise Knowledge Retrieval(企业知识检索)--私有知识库的集成

openai-cookbook/apps/enterprise-knowledge-retrieval at main openai/openai-cookbook GitHub 终于看到对于我解决现有问题的例子代码,对于企业私有知识库的集成。 我对"Retrieval"重新理解了一下,源自动词"retrieve"&#xf…

idea乱码的相关问题

idea控制台乱码(即:tomacat等启动时的乱码) 第一步: 控制台tomcat启动信息乱码解决(红色字体) 1 在本地 tomcat 的配置文件中找到 logging.properties 文件设置日志输出的编码为 UTF-8 追加的配置信息为…

插入排序-C语言实现

🥰前言 🍔在学数据结构的第一节课就知道了数据结构课程是要管理并且学会操作数据,当然操作数据首先想到的就是数据的排序,排过顺序的数据的使用价值才够大。前面我们学习了顺序表也学习了链表等等,这些就是储存数据的方…