首页 > 其他分享 >时间轮

时间轮

时间:2023-07-28 18:12:43浏览次数:26  
标签:currentTime E5% E6% 时间 TimerTaskList 定时

https://www.modb.pro/db/131799

https://cloud.tencent.com/developer/article/2185938

https://learn.lianglianglee.com/%E4%B8%93%E6%A0%8F/Netty%20%E6%A0%B8%E5%BF%83%E5%8E%9F%E7%90%86%E5%89%96%E6%9E%90%E4%B8%8E%20RPC%20%E5%AE%9E%E8%B7%B5-%E5%AE%8C/21%20%20%E6%8A%80%E5%B7%A7%E7%AF%87%EF%BC%9A%E5%BB%B6%E8%BF%9F%E4%BB%BB%E5%8A%A1%E5%A4%84%E7%90%86%E7%A5%9E%E5%99%A8%E4%B9%8B%E6%97%B6%E9%97%B4%E8%BD%AE%20HashedWheelTimer.md

 

要点:

Kafka的层级时间轮

应用场景:kafka、netty、

 

基本知识:

时间轮(TimingWheel)是一个 存储定时任务的环形队列,底层采用数组实现,数组中的每个元素可以存放一个定时任务列表(TimerTaskList)。TimerTaskList 是一个环形的双向链表,链表中的每一项表示的都是定时任务项(TimerTaskEntry),其中封装了真正的定时任务 TimerTask。

基本模型构成

  • tickMs(基本时间跨度):时间轮由多个时间格组成,每个时间格代表当前时间轮的基本时间跨度(tickMs)。
  • wheelSize(时间单位个数):时间轮的时间格个数是固定的,可用(wheelSize)来表示,那么整个时间轮的总体时间跨度(interval)可以通过公式 tickMs × wheelSize计算得出。
  • currentTime(当前所处时间):时间轮还有一个表盘指针(currentTime),用来表示时间轮当前所处的时间,currentTime 是 tickMs 的整数倍。currentTime 可以将整个时间轮划分为到期部分和未到期部分,currentTime 当前指向的时间格也属于到期部分,表示刚好到期,需要处理此时间格所对应的 TimerTaskList 的所有任务。

处理流程分析

  1. 若时间轮的 tickMs=1ms,wheelSize=20,那么可以计算得出 interval 为 20ms;
  2. 初始情况下表盘指针 currentTime 指向时间格 0,此时有一个定时为 2ms 的任务插入进来会存放到时间格为 2 的 TimerTaskList 中;
  3. 随着时间的不断推移,指针 currentTime 不断向前推进,过了 2ms 之后,当到达时间格 2 时,就需要将时间格 2 所对应的 TimeTaskList 中的任务做相应的到期操作;
  4. 此时若又有一个定时为 8ms 的任务插入进来,则会存放到时间格 10 中,currentTime 再过 8ms 后会指向时间格 10。

当到达时间格 2 时,如果同时有一个定时为 19ms 的任务插入进来怎么办

  1. 新来的 TimerTaskEntry 会复用原来的 TimerTaskList,所以它会插入到原本已经到期的时间格 1 中(一个显而易见的环形结构)。

总之,整个时间轮的总体跨度是不变的,随着指针 currentTime 的不断推进,当前时间轮所能处理的时间段也在不断后移,总体时间范围在 currentTime 和 currentTime + interval 之间


     

标签:currentTime,E5%,E6%,时间,TimerTaskList,定时
From: https://www.cnblogs.com/clarino/p/17588582.html

相关文章

  • 日期时间操作-moment.js
    文档地址:http://momentjs.cn/引用:在package.json的dependencies中添加"moment-mini": "^2.24.0"引入:import moment from 'moment-mini'常用到的方法:moment().toDate() 同 new Date()moment#valueOf 简单地输出自 Unix 纪元以来的毫秒数,就像 Date#valueOf 一样。当前时......
  • Hive查看所有表/分区更新时间
    业务需求:开始环境可能不太稳定,需要每天手动检查Hive里面的数据是否同步##步骤1.查看分区showpartitionstable_name;2.查看分区更新时间-获取hdfs路径descformattedtable_name;3.通过dfs-ls<hdfspath>命令查看数据文件最新更新时间dfs-lshdfs://hdfs......
  • Linux同步时间
    检查时区设置:确保虚拟机的时区设置正确。您可以使用命令date来查看当前的日期和时间,以及所使用的时区设置。date如果时区不正确,可以使用命令timedatectlset-timezone<时区>来更正时区设置,例如timedatectlset-timezoneAsia/Shanghaitimedatectlset-timezoneAsia/......
  • Java 时间戳转化成时间差
    Java时间戳转化成时间差时间戳(Timestamp)是指从某个特定的起点开始所经过的毫秒数、秒数或纳秒数。在Java中,我们经常需要将时间戳转化成易读的时间差,以便更好地理解时间间隔。本文将为您介绍如何使用Java代码将时间戳转化成时间差。使用Java内置类库Java内置了一些类库来处理日......
  • Java 时间比较
    Java时间比较在Java编程中,经常需要对时间进行比较。无论是比较两个时间的先后顺序,还是比较时间的差异,Java提供了丰富的工具和方法来处理时间比较的需求。1.比较日期在Java中,我们可以使用java.time.LocalDate类来表示日期。该类提供了丰富的方法用于比较日期。首先,我们需要导......
  • 743. 网络延迟时间
    743.网络延迟时间有n个网络节点,标记为 1 到n。给你一个列表 times,表示信号经过有向边的传递时间。 times[i]=(ui,vi,wi),其中 ui 是源节点,vi 是目标节点,wi 是一个信号从源节点传递到目标节点的时间。现在,从某个节点 K 发出一个信号。需要多久才能使所......
  • 使用@JsonFormat引起的时间比正常时间慢8小时解决方法
    转:使用@JsonFormat引起的时间比正常时间慢8小时解决方法 @JsonFormat,默认情况下timeZone为GMT(即标准时区),所以会造成输出少8小时。改为北京时间,方式如下:@JsonFormat(pattern="yyyy-MM-ddHH:mm:ss",timezone="GMT+8")      ......
  • java 获取时间字符传
    Java获取时间字符串在Java中,我们经常需要获取并处理时间相关的信息。获取当前时间的字符串表示是一种常见的需求,可以用于日志记录、文件命名、时间戳等场景。本文将介绍如何使用Java获取时间的字符串表示,以及一些常见的时间格式化方式。获取当前时间的字符串表示在Java中,可以使......
  • java 获取零时区的时间戳
    Java获取零时区的时间戳在Java中,我们经常需要获取当前时间的时间戳。时间戳是一个表示时间的数字,它通常表示从1970年1月1日00:00:00UTC(协调世界时)开始到指定时间的秒数。然而,有时我们需要获取零时区的时间戳,这是因为某些应用程序要求使用零时区的时间进行计算和比较。那么,如何在......
  • java 时间转换注解 HH:mm
    Java时间转换注解HH:mm在Java开发中,经常需要对时间进行转换和格式化操作。例如,将时间从一种格式转换为另一种格式,或者将时间字符串解析为Java的日期对象。然而,这些操作可能会变得繁琐和冗长。为了简化这些操作,我们可以使用Java时间转换注解。什么是时间转换注解?时间转换注解是......