通过 ZSet 实现定时任务的思路是,将定时任务姿洞逗存放到 ZSet 集合中迹卖,并且将过期时间存储到 ZSet 的 Score 字段中,然后通过一个无线循环来判断当前时间内是否有需要执行的定时任务,如果有则进行执行,具体实现代码如下:
import redis.clients.jedis.Jedis
import utils.JedisUtils
import java.time.Instant
import java.util.Set
public class DelayQueueExample {
private static final String _KEY = "DelayQueueExample"
public static void main(String[] args) throws InterruptedException {
Jedis jedis = JedisUtils.getJedis()
// 30s 后执行
long delayTime = Instant.now().plusSeconds(30).getEpochSecond()
jedis.zadd(_KEY, delayTime, "order_1")
// 继续添加测试数据
jedis.zadd(_KEY, Instant.now().plusSeconds(2).getEpochSecond(), "order_2")
jedis.zadd(_KEY, Instant.now().plusSeconds(2).getEpochSecond(), "order_3")
jedis.zadd(_KEY, Instant.now().plusSeconds(7).getEpochSecond(), "order_4")
jedis.zadd(_KEY, Instant.now().plusSeconds(10).getEpochSecond(), "order_5")
// 开启定时任务队列颤亏
doDelayQueue(jedis)
}
/**
* 定时任务队列消费
* @param jedis Redis 客户端
*/
public static void doDelayQueue(Jedis jedis) throws InterruptedException {
while (true) {
// 当前时间
Instant nowInstant = Instant.now()
long lastSecond = nowInstant.plusSeconds(-1).getEpochSecond()
// 上一秒时间
long nowSecond = nowInstant.getEpochSecond()
// 查询当前时间的所有任务
Set data = jedis.zrangeByScore(_KEY, lastSecond, nowSecond)
for (String item : data) {
// 消费任务
System.out.println("消费:" + item)
}
// 删除已经执行的任务
jedis.zremrangeByScore(_KEY, lastSecond, nowSecond)
Thread.sleep(1000)// 每秒查询一次
}
}
}
登录后复制
2、键空间通知
我们可以通过 Redis 的键空间通知来实现定时任务,它的实现思路是给所有的定时任务设置一个过期时间,等到了过期之后,我们通过订阅过期消息就能感知到定时任务需要被执行了,此时我们执行定时任务即可。
默认情况下 Redis 是不开启键空间通知的,需要我们通过 config set notify-keyspace-events Ex 的命令手动开启,开启之后定时任务的代码如下
首先需要一个闭羡改数据创建日期update table1
set 状态 = ‘已过期’
where 数据创建日期 <dateadd(m,-1,getdate())
这轿判条语句写在作业中,作派槐业就是用于定时执行sql脚本的一个功能,MSSQL自带
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)