Ruby 请教一个关于时间段判定的设计

wikimo · 2014年11月07日 · 最后由 wikimo 回复于 2014年11月23日 · 2685 次阅读

## 需求描述:

根据某个任务设定的时间段判断当前时间是否能合法执行某个任务,即当前时间在不在任务设定的时间段范围内,比如任务 A,可设置执行时间段,06:00-6:20, 7:40-8:00 等,假如以 20 分为间隔,将 24 小时拆分,需要判断执行任务 A 前判断设定时间段与当前时间是否匹配。

补充:当前时间段内执行一次即可;


## 方案 1:

很烂的方法,将时间段数组存储字符字段,每次取出拆分进行匹配,

  • 优点:扩展性还行,比如以 1 小时拆分,任意时间拆分都可以;
  • 缺点:存储的字段可能字符比较大,匹配的时候判断比较繁琐;

## 方案 2:

参考了http://hui.lu/shi-jian-duan-ji-lu-xiao-ji-qiao/ 将 24 小时以 20 分钟拆分一个数组,用数组索引标识每个时间段,然后按参考链接的方案,类似做二进制权限那样存储一个数值,通过数值计算是否当前执行条件符合时间段规则。

  • 优点:字段存储空间小,实现可能相对比较优雅;
  • 缺点:扩展性可能不太好,比如想以 30 分钟为间隔拆分;

## 方案 3:

将时间段看成是 tag,将任务设定的执行时间看成打标签,以给任务打标签的方式去维护时间段,同时结合 redis 数据结构做缓存。从时间段(tag)的角度去看问题;

  • 优点:对于时间段的管理类似于 tag,时间段与任务直接的关系方便做数据查询,扩展性会更好些;
  • 缺点:对应关系相对更复杂些;

## 其它方案 //todo...

谢谢!

6:00 - 6:20 这样的,是说这个任务在这个时间段内执行一次就好,还是说在这个时间段内不停的运行,能运行多少次就运行多少次

一次就好 @Yujing_Z

#2 楼 @wikimo 那你应该用 delayed jobs 里面的 scheduled 的 jobs, 然后 recurring 就好了

行也行,也算是一种方案,主要我还想将执行的时间段信息推送给第三方 app @Yujing_Z

#4 楼 @wikimo 这应该也不难吧,推送的 payload 里面能放简单信息的,设置成变量推就好了

来一个定时任务呗。

谢谢大家回复,基本有思路了。

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册