You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Bull中为Redis队列的每个任务设置自动过期TTL?

Bull队列任务自动设置TTL(生存时间)实现方案

Bull没有直接对应Redissetex的单参数全局TTL配置,但可以通过以下方式实现任务创建24小时后自动删除的需求:

方案1:配置任务自动删除参数(针对已处理完成/失败的任务)

在调用add方法添加任务时,在第二个配置参数中加入removeOnComplete和removeOnFail字段,取值为保留时长的毫秒数,修改后的代码如下:

const webApiProducer = (data) => {
  webApiQueue.add(data, { 
    lifo: true,
    // 任务执行成功后保留24小时自动删除
    removeOnComplete: 86400000,
    // 任务执行失败后保留24小时自动删除
    removeOnFail: 86400000
  })
}

方案2:搭配clean方法清理未消费的过期任务

如果需要把还没被消费者拉取处理的等待状态任务也在创建24小时后自动清理,可以搭配队列的clean方法定期批量清理过期任务:

// 队列初始化后添加定时清理逻辑,每小时执行一次
setInterval(async () => {
  const expireTime = 86400000; // 24小时对应的毫秒数
  // 清理等待队列中超时的任务
  await webApiQueue.clean(expireTime, 'wait');
  // 清理延迟队列中超时的任务
  await webApiQueue.clean(expireTime, 'delayed');
  // 清理完成队列中超时的任务
  await webApiQueue.clean(expireTime, 'completed');
  // 清理失败队列中超时的任务
  await webApiQueue.clean(expireTime, 'failed');
}, 3600000) // 每小时执行一次

补充适配:执行前判断任务有效性

如果要求过期任务即使被消费者拉取到也不执行,可以在消费逻辑开头增加创建时间判断:

webApiQueue.process(async (job) => {
  // 任务创建超过24小时直接跳过执行
  if (Date.now() - job.timestamp > 86400000) {
    return '任务已过期,无需执行';
  }
  // 原有业务执行逻辑
})

内容的提问来源于stack exchange,提问作者Ben in CA

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 06:54:04