关于定时依次执行业务并循环处理的设计方案
原创2022/8/3大约 1 分钟
关于定时依次执行业务并循环处理的设计方案
1、业务背景
现有一个定时任务,于每天 00:00 执行,有一组数如下:

需求:
实现定时任务每次执行时,在上面的这组数中,依次读取最小值和最大值,并在最小值和最大值间随机出一个数,以作他用。
例如:
任务今天执行的时候,读第1组数据,明天执行的时候,读第2组数据……依次类推,直至读完第6组数据后,再继续从第1组开始循环。
2、解决方案
2.1、想法1
在 MySQL 中新建一张表,用于存储上面的周期组数据,可以利用分页查询,每次只查1条,当检测到最后一页了再从第一页开始,同时把当前页码记录到一个地方,如 Redis 缓存等。
2.2、想法2
单纯的把周期组数据保存在内存中,利用 Java 的循环链表数据结构实现。
2.3、想法3(妙啊)
既然提到了循环链表,顺势想到了 Redis 的 list 结构中有一个 pop 的功能,假如 每次从头部读取(lpop),处理完之后放到末尾(rpush),岂不是完美形成了一个“环形”的结构,也就实现了如上的需求!
接着研究发现,Redis 提供了一个类似的功能——RPOPLPUSH

妙啊,直接利用这个命令实现即可,代码如下:



