Spring提供了定时任务的功能,但是在多个实例的集群中,会出现定时任务重复执行多次的情况。

使用Qutaz框架自带的分布式定时任务可以很好的解决这个问题,但是讲道理功能有些过于强大,对于需求不高,乃至可以一定程度上允许失误的简单任务中,性价比比较低。

使用task任务时,可以通过在redis等缓存、数据库中创建锁来实现避免重复执行任务的功能。

基本思路如下:

  • 在redis中设置一个key作为锁,值为时间戳
  • 尝试用setnx方法直接设置锁,若成功则直接执行任务。
  • 若设置失败,使用getset方法获取当前锁并更新时间戳
  • 若获取的时间戳在有效期内,则不执行任务,否则执行任务

当然这种实现方法是很粗糙的。对于高并发的频繁定时任务处理很不完美。若执行失败也会导致任务丢失。

本方案实现的处理场景是间隔比较长的数据处理定时任务。服务器集群也只有三个节点,上线运行效果良好。

简要实现代码如下:

private boolean getLock(String key){String syncKey = "sync_lock_"+key;long curr = System.currentTimeMillis();String time = curr+"";long has = redisTemplate.setnx(syncKey,time);if(has == 1){return true;}else{String lock = redisTemplate.getSet(syncKey,time);if(lock == null){return true;}else{long l = NumberUtils.toLong(lock);//三十秒以内都算有效锁return Math.abs(curr-l)<30000;}}}
复制代码

转载于:https://juejin.im/post/5a31e9f8f265da43333e6a1b

基于Redis实现分布式锁,避免重复执行定时任务相关推荐

  1. nx set 怎么实现的原子性_基于Redis的分布式锁实现

    前言 本篇文章主要介绍基于Redis的分布式锁实现到底是怎么一回事,其中参考了许多大佬写的文章,算是对分布式锁做一个总结 分布式锁概览 在多线程的环境下,为了保证一个代码块在同一时间只能由一个线程访问 ...

  2. 基于Redis的分布式锁和Redlock算法

    来自:后端技术指南针 1 前言 今天开始来和大家一起学习一下Redis实际应用篇,会写几个Redis的常见应用. 在我看来Redis最为典型的应用就是作为分布式缓存系统,其他的一些应用本质上并不是杀手 ...

  3. 基于 Redis 的分布式锁到底安全吗?

    [完整版] 网上有关Redis分布式锁的文章可谓多如牛毛了,不信的话你可以拿关键词"Redis 分布式锁"随便到哪个搜索引擎上去搜索一下就知道了.这些文章的思路大体相近,给出的实现 ...

  4. 基于Redis的分布式锁到底安全吗(上)?

    网上有关Redis分布式锁的文章可谓多如牛毛了,不信的话你可以拿关键词"Redis 分布式锁"随便到哪个搜索引擎上去搜索一下就知道了.这些文章的思路大体相近,给出的实现算法也看似合 ...

  5. 基于Redis的分布式锁实现

    本文转自 一.分布式锁概览 在多线程的环境下,为了保证一个代码块在同一时间只能由一个线程访问,Java中我们一般可以使用synchronized语法和ReetrantLock去保证,这实际上是本地锁的 ...

  6. 基于Redis的分布式锁真的安全吗?

    说明: 我前段时间写了一篇用consul实现分布式锁,感觉理解的也不是很好,直到我看到了这2篇写分布式锁的讨论,真的是很佩服作者严谨的态度, 把这种分布式锁研究的这么透彻,作者这种技术态度真的值得我好 ...

  7. 基于Redis的分布式锁到底安全吗?

    网上有关Redis分布式锁的文章可谓多如牛毛了,不信的话你可以拿关键词"Redis 分布式锁"随便到哪个搜索引擎上去搜索一下就知道了.这些文章的思路大体相近,给出的实现算法也看似合 ...

  8. 基于Redis实现分布式锁之前,这些坑你一定得知道

    开头 基于Redis的分布式锁对大家来说并不陌生,可是你的分布式锁有失败的时候吗?在失败的时候可曾怀疑过你在用的分布式锁真的靠谱吗?以下是结合自己的踩坑经验总结的一些经验之谈. 你真的需要分布式锁吗? ...

  9. 基于 Redis 实现分布式锁思考

    以下文章来源方志朋的博客,回复"666"获面试宝典 来源:blog.csdn.net/xuan_lu/article/details/111600302 分布式锁 基于redis实 ...

  10. redis系列:基于redis的分布式锁

    一.介绍 这篇博文讲介绍如何一步步构建一个基于Redis的分布式锁.会从最原始的版本开始,然后根据问题进行调整,最后完成一个较为合理的分布式锁. 本篇文章会将分布式锁的实现分为两部分,一个是单机环境, ...

最新文章

  1. 如何用asp.net向其他服务器post一条信息
  2. “23岁本科生发14篇SCI”,文章被学校官网悄悄删了,你怎么看?
  3. 最新消息!腾讯紧急宣布再度延期复工时间到24号!附各大企业最新复工时间表...
  4. 转载 SharedPreference.Editor的apply和commit方法异同
  5. 你知道为啥程序员下班后只关显示器从不关电脑?
  6. .NET跨平台之旅:博问站点迁移至ASP.NET Core on Linux并发布上线
  7. [原创] 在XP/2K 下实现 Win+Ctrl+Del 等键的屏蔽的方法,附源码与演示程序下载。...
  8. Linux绝对战胜不了Windows系统
  9. Gstreamer1.18.4编译(二十六)
  10. 计算机学院李成伟,【迎新专题二】校长李成伟带队视察迎新工作
  11. 个人Web自动化测试学习点总结
  12. PNG图像文件格式解析
  13. java后端返回二进制图片 前端进行展示 详解
  14. 数字IC设计随笔之一(Verdi自动添加波形脚本应用)
  15. 美本计算机专业,2018美国本科计算机cs专业排名|美国本科cs专业排名
  16. 【SLAM学习】ORB-SLAM2-大体框架(OpenVSLAM)
  17. java.lang.IllegalArgumentException: Invalid character found in method name. HTTP method names must b
  18. windows系统日志查看
  19. 混凝土破碎设备在城市建设中功不可没
  20. 高恪新路由三硬盘_新路由3刷高恪教程

热门文章

  1. 第二阶段团队冲刺(七)
  2. linux 安装软件的几种方法
  3. ES6 (总结篇二)
  4. console 程序随系统启动及隐藏当前程序窗口
  5. 对lua协程的一点理解
  6. 十天学会ASP.Net——(8)
  7. C语身教程第三章: C说话挨次筹算匹面(1)
  8. Mini 容器学习笔记6——组件的获取(应用)
  9. VMware开启NAT模式/仅主机模式后主机ping不通虚拟机的问题
  10. Linux编程MQTT实现主题发布订阅