HashedWheelTimer-高效处理大量定时任务

背景

业务需要,要对app用户做个30s离线的功能,即:用户自登录开始,30s内无操作及下线。

常规思路1(单定时器轮询)

  • 用户登录时用关联数组记录用户的uid & 用户最后操作时间,用户的任何操作也要更新对应的操作时间。
  • 开一个定时任务,每秒触发一次,遍历该数组,(操作时间与30s求和)与当前时间比对判断是否该离线

优点
实现简单
缺点
效率较低,用户量一大玩脱,轮询的通病

常规思路2(多定时器)

  • 和思路1一样,需要一个数组记录用户uid和最后操作时间
  • 收到用户操作的请求后开一个定时器,30s后触发,任务内容是,检查该uid最后操作时间是否超过30s,是否该离线处理
    优点
    多定时器,效率高
    缺点
    用户的每次操作都开一个定时器,很耗资源,用户量大也是问题

HashedWheelTimer的实现思路

相信很多同学和我一样第一次看到这个名词,这个结构通俗的讲就是一个环形队列,专门设计用来处理大量定时任务的结构。
先看一张结构图

原理介绍
为了理解,我们假设业务:用户无操作时,8s即离线处理
如图,该环形队列有8个槽位,每个槽位有index值,定时任务设置为每1s顺时针走1格,聪明的你肯定想到了,我们可以把大量的定时任务通过一套算法落地到每一个槽位,这样当定时任务走到对应槽位时只需要获取该槽位所有的任务去处理即可

实现

  • 8s超时,就创建一个index从1到8的环形队列(本质是个数组)
  • 环上每一个槽位是一个数组(存储uid)
  • 定义一个数组,记录uid落在环形队列的哪个槽位里
  • 启动一个定时器,每隔1s,在上述环形队列中移动一格
  • 定义一个index指针来标识刚检测过的槽的位置

用户请求到达时

  • 从数组中,查找出这个uid存储在哪一个槽里
  • 从这个槽的集合中,删除这个uid
  • 将uid重新加入到新的槽集合中(具体是哪一个槽呢 ,Index指针所指向的上一个槽位,因为这个槽位,会被定时器在10s之后扫描到)
  • 更新数组,记录这个uid对应槽的值
  • 离线操作,定时器每秒种移动一个槽位,这个槽对应的集合中所有uid都应该被集体超时

优点
只需要1个定时器
定时器每1s只需要一次触发,消耗CPU很低
批量超时,当前扫到的槽位集合中所有元素都应该被离线

请关注我的订阅号

优化-处理大量定时任务的思路相关推荐

  1. c语言五子棋人工智能算法,五子棋人工智能算法实现研究,优化五子棋智能算法的思路...

    五子棋是一种两人对弈的纯策略型棋类游戏,是起源于中国古代的传统黑白棋种之一.现代五子棋日文称之为"连珠",英译为"Renju",英文称之为"Goban ...

  2. WCF优化的几个常规思路

    前几天用WCF做项目时发现了一个效率问题,由于系统对效率要求较高,困扰了很长时间终于将问题解决了,写下来为以后的兄弟们参考,第一次写博客有不准确的地方还望同行们多喷多指点,先行谢过啦... 问题场景是 ...

  3. C/C++编程笔记:输入输出的优化,你还为思路正确却TLE而烦恼吗?

    你还在为思路正确却TLE而烦恼吗? 我也没办法,谁让你是一枚蒟蒻呢 今天,本人给被TLE折磨的死去活来的各位介绍一个专治TLE的法宝: 此乃江湖一直流传着的 输入输出优化!!! 输入优化函数: 输出优 ...

  4. 今日头条广告如何优化?这四个思路至关重要

    今日头条广告如何优化?随着互联网的高速发展,在网络平台上投放广告已然成为潮流,而今日头条作为受到大众喜爱的平台之一,有许多广告主想要在今日头条平台内投放广告,但如何优化今日头条广告仍是许多广告主烦恼的 ...

  5. 提高网络服务器性能,优化网络的七条思路 帮您更快提高网络速度

    如何最大限度地提升网络的速度与性能,一直是企业网络管理者们所关注的问题.本文将围绕如何进一步提升网络的速度与性能这一问题,给出业内资深人士和网络专家的七条建议. 使用巨型数据包 使用巨型数据包技术可使 ...

  6. mysql按工作日查询统计优化_工作日计算问题思路和实现

    项目中目前已有一周表存储了一年中所有的假日,给定查询起始日期和结束日期,推导出查询时间段内工作日是多少.为了简化这个问题,需要下面几个假设. 1. 不考虑周六周日,将其视作普通工作日 2. 假日没有交 ...

  7. 12 | 套路篇:CPU 性能优化的几个思路

    上一节我们一起回顾了常见的 CPU 性能指标,梳理了核心的 CPU 性能观测工具,最后还总结了快速分 析 CPU 性能问题的思路.虽然 CPU 的性能指标很多,相应的性能分析工具也很多,但理解了各种指 ...

  8. 43 | 套路篇:网络性能优化的几个思路(上)

    上一节,我们了解了 NAT(网络地址转换)的原理,学会了如何排查 NAT 带来的性能问题,最后还总结了 NAT 性能优化的基本思路.我先带你简单回顾一下. NAT 基于 Linux 内核的连接跟踪机制 ...

  9. php任务分配思路_PHP执行定时任务的几种方法思路

    PHP本身是没有定时功能的,PHP也不能多线程.PHP的定时任务功能必须通过和其他工具结合才能实现,例如WordPress内置了wp-cron的功能,很厉害.本文,我们就来深入的解析几种常见的php定 ...

最新文章

  1. jmeter的两种参数化方法
  2. nimbus java_Java程序设置界面为Nimbus风格x
  3. leetcode 795. Number of Subarrays with Bounded Maximum | 795. 区间子数组个数(Java)
  4. 计算机组成与维修考试试题,期末考试试题计算机组成与维修.doc
  5. python列表中随机两个_随机化两个列表并在python中维护顺序
  6. matlab中inf函数,matlab中voronoin()函数的用法,求高手指点
  7. 详解一个自己原创的正则匹配IP的表达式
  8. 微异构Embree照片级光线追踪解决方案
  9. python的matplotlib库怎么安装_为Python安装matplotlib库
  10. unity3d中如何把对象存进数组
  11. JPBC库实现基于身份的签名体制
  12. ICCV, ECCV, CVPR,IEEE的关系
  13. Python标准库time
  14. 北京市医疗保障的不用定点的可以医保的医院查询步骤
  15. 计算机历史和未来课程,计算机课程作业,计算机与汽车结合的历史与未来ppt概要.ppt...
  16. 面经 | bigo/联影/58同城20校招计算机视觉算法岗
  17. JetBrains开发人员工具
  18. ArcMap 数据的标注和注记
  19. C语言编写一个简单的选择题答题系统
  20. 全国计算机高新技术bim应用等级,BIM有等级考试吗?BIM等级考试有几种形式?

热门文章

  1. .NET Framework各个版本(3.0 - 3.5)
  2. 点滴生活感悟(更新至29)
  3. python与php8,后端php和python学哪个
  4. 语音信号的时域处理(二)
  5. 数栈产品分享:干货解读数据中台产品「模块化」设计思路
  6. 交换机、路由器、服务器组网
  7. 自动化测试工程师的发展前景怎么样?好不好?
  8. 本地计算机 feifei pc,局域网中其它计算机对共享打印机的访问方法
  9. Scrapy翻页爬取示例——列表页、详情页
  10. 【极客时间-网络编程实战】