加了Redis分布锁却依然重复执行定时任务

  • 定时生成告警的方法在多实例运行的时候,出现加了redis分布式锁依然重复执行的问题,最终导致重复生成数据。
  • 这是因为方法的执行速度过快,导致A实例执行完并删除锁后,实例B才开始加锁的情况。
  • 原本的代码逻辑
String key = "ScheduleTask_refreshAlert";
try {
    if (!redisUtils.exists(key)) {
        if (redisUtils.setnx(key, "1", 10, TimeUnit.MINUTES)){
            //要执行的告警数据生成代码
        }
    }
} catch (Exception e) {
    e.printStackTrace();
} finally {
    //移除分布锁
    redisUtils.del(key);
}
  • 修正后的代码
String key = "ScheduleTask_refreshAlert";
try {
    if (!redisUtils.exists(key)) {
        if (redisUtils.setnx(key, "1", 10, TimeUnit.MINUTES)){
            //要执行的告警数据生成代码
        }
    }
} catch (Exception e) {
    e.printStackTrace();
} finally {
    //延迟五秒删除,避免误删除锁导致在其它实例再次执行告警任务。
    Thread.sleep(5 * 1000);
    redisUtils.del(key);
}

结论使用redis实现分布式锁的时候,不要在任务执行后立刻删除key。否则当方法执行速度是微秒级别的时候,其它实例很可能成功再次执行方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值