当前位置: 首页 > news >正文

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

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;
            }
        }
    }
复制代码

相关文章:

  • 一篇文章告诉你React里为什么不能用index作为key
  • 阿武老师百搭傲娇句式
  • LaTeX模板(二)
  • java可重入锁(ReentrantLock)的实现原理
  • React Native声明属性和属性确认
  • JavaScript深入之词法作用域和动态作用域
  • 竞赛回忆录
  • 简单团队-爬取豆瓣电影TOP250-需求分析
  • JS实现简单的MVC模式开发小游戏
  • 虚拟就Ubuntu 14.0.4 安装配置jenkins
  • 大数据学习(2)HDFS文件管理
  • Mac 10.12安装截图工具Jietu
  • Centos 搭建Mysql-Proxy 读写分离
  • 【小白学云计算】10分钟搭建一台web服务器!(就是快!)
  • [docker]docker网络-直接路由模式
  • Android系统模拟器绘制实现概述
  • avalon2.2的VM生成过程
  • classpath对获取配置文件的影响
  • JavaScript/HTML5图表开发工具JavaScript Charts v3.19.6发布【附下载】
  • Javascript弹出层-初探
  • js
  • PHP 的 SAPI 是个什么东西
  • php面试题 汇集2
  • Spring Cloud中负载均衡器概览
  • Vue 动态创建 component
  • 对话 CTO〡听神策数据 CTO 曹犟描绘数据分析行业的无限可能
  • 前端自动化解决方案
  • 如何正确配置 Ubuntu 14.04 服务器?
  • 探索 JS 中的模块化
  • 我感觉这是史上最牛的防sql注入方法类
  • 一道闭包题引发的思考
  • 用 vue 组件自定义 v-model, 实现一个 Tab 组件。
  • 仓管云——企业云erp功能有哪些?
  • 完善智慧办公建设,小熊U租获京东数千万元A+轮融资 ...
  • # Swust 12th acm 邀请赛# [ E ] 01 String [题解]
  • (LeetCode 49)Anagrams
  • (二)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (附源码)计算机毕业设计ssm基于Internet快递柜管理系统
  • (附源码)计算机毕业设计SSM疫情下的学生出入管理系统
  • (附源码)计算机毕业设计大学生兼职系统
  • (论文阅读26/100)Weakly-supervised learning with convolutional neural networks
  • (三)Honghu Cloud云架构一定时调度平台
  • (转)eclipse内存溢出设置 -Xms212m -Xmx804m -XX:PermSize=250M -XX:MaxPermSize=356m
  • .gitignore文件_Git:.gitignore
  • .NET 读取 JSON格式的数据
  • .NET/C# 使用反射注册事件
  • .net6+aspose.words导出word并转pdf
  • .netcore 如何获取系统中所有session_ASP.NET Core如何解决分布式Session一致性问题
  • @requestBody写与不写的情况
  • [ HTML + CSS + Javascript ] 复盘尝试制作 2048 小游戏时遇到的问题
  • [20171106]配置客户端连接注意.txt
  • [AHOI2009]中国象棋 DP,递推,组合数
  • [AutoSar]BSW_Memory_Stack_003 NVM与APP的显式和隐式同步
  • [C++]类和对象【下】
  • [C++]四种方式求解最大子序列求和问题