请教一个 Redis 过期时间的问题
<p>程序的逻辑是这样的: 有一个定时任务在执行前会判断 redis 中是否存在数据,如果存在则不执行,如果不存在继续执行,然后在 Redis 中新增数据并且把定时任务间隔时间作为数据的过期时间。</p>
<p>正常情况下,下一次任务执行前 Redis 中一定是没有数据的,但是实际上任务第二次执行的时候 Redis 中的数据总是不为空,后续似乎一切都正常。</p>
<p>Redis 扫描过期数据的间隔是 50ms ,也尝试过 timeout = timeout-50 ,但第二次任务执行时 redis 还是不为空!!!</p>
<p><strong>想问下有没有遇到过类似情况的大佬,麻烦指点下!!!</strong></p>
<p>start 是任务开始时的时间戳,timeout 是计算出来的任务间隔时间,也是 redis 的过期时间</p>
<hr>
<h2>start: 1662520720050 timeout: 4950 foo task execute -- 正常执行</h2>
<h2>start: 1662520725006 timeout: 4994 redis not empty -- 这里第二次总是不为空</h2>
<h2>start: 1662520730013 timeout: 4987 foo task execute</h2>
<h2>start: 1662520735004 timeout: 4996 foo task execute</h2>
<h2>start: 1662520740001 timeout: 4999 foo task execute</h2>
<h2>start: 1662520745010 timeout: 4989 foo task execute</h2>
<h2>start: 1662520750005 timeout: 4995 foo task execute</h2>
<h2>start: 1662520755004 timeout: 4996 foo task execute</h2>
<p>start: 1662520760015 timeout: 4985 foo task execute</p>
收藏(0)
分享
相关标签:
注意:本文归作者所有,未经作者允许,不得转载
-
2022年9月7日 05:28
抱歉,我错了,请忽略我
0
0
-
2022年9月7日 05:28
Redis 设置了过期时间, 肯定就是那个时间点过期. 楼上说的有问题
过期了 != 删除.
redis 判断一个 key 不存在有两种, 一种是 key 不存在, 另一种是存在, 但是过期了没来得及删除
楼主这个不就是最简单的单任务锁吗, 如果服务器延迟大的话
尝试使用 EXPIREAT 设置过期时间, 而不是 EXPIRE
0
0
-
2022年9月7日 09:28
你这个到 ms 级,本来就不准
你定时任务触发的时间戳,我们假设你是 xxl-job 或者 quartz 这种,xxl-job 触发的时间戳是 0,50ms,100ms
但是你定时任务触发时到你服务器的网络延迟,或者哪怕你是单机定时任务的线程切换延迟,再到你执行到 redis set 的延迟,再到 redis 请求的网络延迟,都可能会导致问题。
比如你任务触发是时钟 0ms ,设置 redis 实际是 1ms 了,那你 redis 过期时间到 51ms ,显然就有问题了
0
0