定时器

定时器应⽤

  • ⼼跳检测
  • 技能冷却
  • 武器冷却
  • 倒计时
  • 其它需要使⽤超时机制的功能

定时器概述

对于服务端来说,驱动服务端逻辑的事件主要有两个,⼀个是⽹络事件,另⼀个是时间事件;

在不同框架中,这两种事件有不同的实现⽅式;

第⼀种,⽹络事件和时间事件在⼀个线程当中配合使⽤;例如nginx、 redis;

第⼆种,⽹络事件和时间事件在不同线程当中处理;例如skynet;

定时器设计

接⼝设计

// 初始化定时器
void init_timer();
// 添加定时器
Node* add_timer(int expire, callback cb);
// 删除定时器
bool del_timer(Node* node);
// 找到最近要发⽣的定时任务
Node* find_nearest_timer();
// 更新检测定时器
void update_timer();
// 清除定时器
// void clear_timer();

要点:

  1. 有序的结构,且增加删除操作不影响该结构有序;
  2. 能快速查找最⼩节点;
  3. 时间轮增加操作只从单个定时任务触发,忽略定时任务之间的⼤⼩关系;⽽红⿊树、最⼩
    堆、跳表的有序性依赖定时任务之间的⼤⼩关系;

数据结构选择

  • 红⿊树

    对于增删查,时间复杂度为 ;对于红⿊树最⼩节点为最左侧节点,时间复杂度为O(log2n)

  • 最⼩堆

    对于增查,时间复杂度为O(log2n);对于删时间复杂度为O(n),但是可以通过辅助数据结构(map或者hashtable来快速索引节点)来加快删除操作;对于最⼩节点为根节点,时间复杂度为O(1);

  • 时间轮

    对于增删查,时间复杂度为O(1);查找最⼩节点也为O(1);

posted @   DarkH  阅读(78)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗
点击右上角即可分享
微信分享提示