背景介绍
如果《忍者必须死3》玩儿的比较多的话,你会经常需要每隔4H给自己的坐骑喂食一次,通过喂食来升级。一次喂食后,坐骑需要花4个小时吃完。现在有个新需求,可以使用道具卡来丰富玩法。道具卡有两种,一种是加速卡,一种是自动喂食卡。加速卡会使吃食的时间缩短两个小时,自动喂食卡可以在坐骑吃完当前喂食食物后系统帮助其自动喂食一次【自动延时操作】。
基于Zset的实现方式
Redis实现延时任务,是通过其数据结构ZSET来实现的。ZSET会储存一个score和一个value,可以将value按照score进行排序。延时任务的实现分为以下几步来实现:
- 将任务的执行时间作为score【时间戳,当前时间+4h的时间点设置为时间戳】,要执行的任务数据作为value,存放在zset中
- 用一个进程定时查询zset的score大于当前时间的任务。
- 如果找到这样的任务,就将该任务取出来执行,否则休眠一段时间后再进行轮询
redis的ZSET是通过跳跃表来实现的,复杂度为O(logN),N是存放在ZSET中元素的个数。用redis来实现可以依赖于redis自身的持久化来实现持久化,redis的集群来支持高并发和高可用。因此开发成本很小,可以做到很实时
背景拓展
当然还见于我们的订单超时未支付的场景,如果我们下了单超过30分钟未支付则订单会被关闭