场景:
某些资源在达到某一时间点后需要将其状态置为超时
方案:
- 资源数据入库后,将其过期时间及主键id设置到redis,
使用数据类型sortSet,主键id为value,过期时间为score - 起定时任务,拿sortSet的第一个元素,判断其是否过期,
如果过期,则对其主键id做过期处理,并删除在sortSet中的改元素
再次取sortSet第一个元素,判断其是否过期。。。
如果没有过期,则本次定时任务执行结束 - 轮询定时任务,定时任务的执行频率,则为过期时间的精度
优点:
- 不用遍历数据库
- 只需要判断一个元素就能确定,本次是否有需要过期的ID
缺点:
- 依赖redis的稳定性
- 数据过多,会导致这个set数据量很大
- 数据过期时间分布不均,会导致过期任务不平滑
- 定时任务执行过程中,程序执行耗时无法计算,可能会影响精度。
网友评论