redis分布式锁解决定时任务重复执行的问题

SPL06气压温度传感器SPI驱动与补偿算法详解 气压传感器与温度传感器是嵌入式环境感知系统的核心组件,其测量精度高度依赖于MEMS芯片的校准参数与非线性补偿机制。SPL06作为集成式高精度数字传感器,采用24位Σ-Δ ADC与片内补偿引擎,需结合唯一出厂校准系数(即‘芯片指纹’)进行多阶数学修正,才能将原始ADC值转化为符合计量要求的帕斯卡(Pa)与摄氏度(℃)物理量。该过程涵盖SPI通信协议解析、寄存器时序控制、大端数据拼接、二进制补码处理及浮点/定点混合运算等典型嵌入式工程实践。广泛应用于无人机高度计、智能穿戴海拔监测与IoT气象终端中。 阅读详情

问题:项目部署到两台服务器上定时任务重复执行造成数据问题

解决办法:使用redis锁的形式进行解决,每次只允许一台服务器执行

reids锁+AOP切面,将加锁部分抽象出来,然后利用自定义注解的形式方便以后对其他地方进行加锁处理。

上代码:

切面类:

import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.lang.reflect.Method;

/**
 * redis 分布式锁
 */
@Aspect
@Slf4j
@Component
public class CacheLockAspect{

    @Resource
    private RedisUtil<String> redisUtil;
    /**
     * 分布式锁的key
     */
    private static final String KEY_PREFIX_LOCK = "CACHE_LOCK_ASPECT:";

    @Around("@annotation(com.xxx.xxxx.xxxx.CacheLock)")
    public void  cacheLockPoint(ProceedingJoinPoint pjp) {
        MethodSignature signature = (MethodSignature) pjp.getSignature();
        Method cacheMethod = signature.getMethod();
        if(null == cacheMethod){
            log.info("未获取到使用方法 pjp: {}",pjp);
            return;
        }
        String lockKey = cacheMethod.getAnnotation(CacheLock.class).lockedKey();
        Integer timeOut = cacheMethod.getAnnotation(CacheLock.class).expireTime();
        boolean release = cacheMethod.getAnnotation(CacheLock.class).release();
        if(StringUtils.isBlank(lockKey)){
            log.error("method:{}, 锁名称为空!",cacheMethod);
            return;
        }
        try {
            //这里使用jedis的setnx方法,不存在则添加,成功返回1,不成功返回0
            if (redisUtil.setnx(KEY_PREFIX_LOCK+lockKey, lockKey, timeOut).equals(1L)){
                //对这个key加上有效期
                redisUtil.expire(KEY_PREFIX_LOCK+lockKey, timeOut);
                log.info("method:{} 获得锁:{},开始运行!",Thread.currentThread(),KEY_PREFIX_LOCK+lockKey);
                pjp.proceed();
                return;
            }
            log.info("method:{} 未获取锁:{},运行失败!",Thread.currentThread(),KEY_PREFIX_LOCK+lockKey);
            //不需要释放锁
            release = false;
        } catch (Throwable e) {
            log.error("method:{},运行错误!",cacheMethod,e);
        }finally {
            if(release){
                log.info("method:{} 执行完成释放锁:{}",cacheMethod,KEY_PREFIX_LOCK+lockKey);
                redisUtil.delete(KEY_PREFIX_LOCK+lockKey);
            }
        }
    }
}

自定义注解:

import java.lang.annotation.*;

/**自定义注解
 */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface CacheLock {
    String lockedKey() default "";   //redis锁key
    int expireTime() default 100;    //key在redis里存在的时间 单位:秒
    boolean release() default false; //是否在方法执行完成之后释放锁
}

测试:在需要加锁的方法上加上自定义注解即可

//测试服务类
@Slf4j
@Component
public class TestServiceImpl {
	
    @CacheLock(lockedKey = "testLock", expireTime = 50)
    @Scheduled(cron = "0 0/1 * * * ? ")
    public void test1() {
        log.info("方法1开始执行!!!!");
    }
    @CacheLock(lockedKey = "testLock", expireTime = 50)
    @Scheduled(cron = "0 0/1 * * * ? ")
    public void test2() {
        log.info("方法2执行了====");
    }
}

补充: 

redis工具类,实现setnx方法

public class RedisUtil{

    @Autowired
    public RedisTemplate redisTemplate;


    public boolean setnx(String key, String val, Long expireTime){
        return (Boolean) redisTemplate.execute((RedisCallback) connection -> {
            Boolean aBoolean = connection.setNX(key.getBytes(), val.getBytes());
            if (aBoolean){
                // 设置过期时间
                this.expire(key, expireTime);
                return true;
            }
            Long expireTime1 = this.getExpireTime(key);
            if (expireTime1 == -1L) {
                // 过期时间为-1, 删除该key
                this.deleteObject(key);
            }
            return false;
        });
    }
}

参考文章:利用Redis分布式锁解决集群服务器定时任务重复执行问题__陈同学_的博客-优快云博客_redis分布式锁定时任务

基于 YOLOv26 的校园安全监控系统:多场景应用 本文提出了一种基于YOLOv26的校园安全监控系统,采用多场景应用架构实现对校园安全的智能监测。系统核心技术包括YOLOv26目标检测、DeepSORT目标跟踪、区域安全定义和行为分析等模块,通过边缘计算平台实现实时处理。研究构建了包含多种校园场景的专业数据集,并采用数据增强技术提升模型性能。系统可检测人员、车辆和物品等目标,分析其行为轨迹,评估安全风险并触发告警。实验结果表明,该系统能有效识别校园安全隐患,为安全管理提供智能化解决方案。 阅读详情

相关推荐

MemSeg:一种差异和共性来检测图像表面缺陷的半监督方法

本文认为人为创建类内差异和保持类内共性可以帮助模型实现更好的缺陷检测能力,从而更好地区分非正常图像。如图一所示。差异(differences):MemSeg引入人工模拟的异常图像在训练阶段使模型能够区分正常和异常的图像,减轻了半监督学习只能用正常样本进行训练的不足,然后在推理阶段可以直接输入图像无需做任何后处理。共性(commonalities):MemSeg引入了一个记忆池来记录正常样本的通用模式,在训练和推理阶段,比较输入图像和记忆池中的样本之间的差异,为异常区域的定位提供有用的信息。

斯人若彩虹,遇上方知有! 4841

定时任务部署在多台服务器时如何避免重复执行

任务以源码方式维护在调度中心,支持通过Web IDE在线更新,实时编译和生效,原理:每个 “GLUE模式(Java)” 任务的代码,实际上是“一个继承自“IJobHandler”的实现类的类代码”,“执行器”接收到“调度中心”的调度请求时,会通过Groovy类加载器加载此代码,实例化成Java对象,同时注入此代码中声明的Spring服务(请确保Glue代码中的服务和类引用在“执行器”项目中存在),然后调用该对象的execute方法,执行任务逻辑。接收“调度中心”的执行请求、终止请求和日志请求等。

m0_60769905的博客 9550

WSL2+Ubuntu-22.04搭建PX4仿真环境:从零避坑到一键起飞

本文详细指导在Windows系统上通过WSL2和Ubuntu-22.04搭建PX4仿真开发环境的完整流程,涵盖环境配置、源码下载、依赖安装、Gazebo仿真及常见错误解决方案,帮助开发者从零避坑实现无人机一键起飞仿真。

k8s6orchestrator的博客 670

多服务环境下定时任务重复执行问题解决方案

当一个服务部署在多台服务器上时,定时任务可能出现多次执行的情况,就是每个服务上执行一次。有以下两种思路,一是固定死只有某服务器执行定时任务,二是随机暂停几秒,某一服务执行了,其他就不再执行。

拥抱白菜的猪博客 5270

linux驱动由浅入深系列:基于高通平台分析触摸屏(TP)、虚拟按键驱动

触摸屏的触摸板(touch panel简称TP)驱动的基本架构和普通按键驱动基本一致,可以参考文章:linux驱动由浅入深系列:输入子系统之二(编写一个gpio_key驱动)。只是其功能稍稍复杂些,配置也多些,下面一起来看一下。 TP包括 触摸屏、虚拟按键、虚拟按键背光灯 TP驱动芯片厂商主要有:Goodix(汇顶),FocalTech(敦泰科技),cypress(赛普拉斯),synapt

Radia的专栏 4768

YOLO26训练教程,训练自己的数据集教学,从源码下载,配置虚拟环境,准备数据集、训练、验证、推理测试 。实现0到1的完整教学过程。快速入门必看

本文详细介绍了YOLO26目标检测模型的配置与使用流程:1)下载YOLOv11源码并创建Python3.10虚拟环境;2)安装PyTorch2.5.1及相关依赖库;3)准备数据集并修改配置文件;4)编写训练脚本设置参数(640x640分辨率、500轮次);5)验证模型效果;6)使用训练好的模型进行推理测试;7)生成可视化热力图。整个过程涵盖了从环境搭建到模型应用的全流程,并提供了清华镜像源加速下载。

Ai缝合怪、助力小伙伴高效发论文 5284

解决XXLJOB重复执行问题--Redis加锁+注解+AOP

基于Redis+注解+AOP解决XXLJOB重复执行问题

脚踏实地,仰望星空 3401

2022年全国职业院校技能大赛 高职组大数据技术与应用卷⑦——解析答案

大数据时代,电商经营模式发生很大改变。在传统运营模式中,缺乏数据积累,人们在做出一些决策行为过程中,更多是凭借个人经验和直觉,发展路径比较自我封闭。而大数据时代,为人们提供一种全新的思路,通过大量的数据分析得出的结果将更加现实和准确。商家可以对客户的消费行为信息数据进行收集和整理,比如消费者购买产品的花费、选择产品的渠道、偏好产品的类型、产品回购周期、购买产品的目的、消费者家庭背景、工作和生活环境、个人消费观和价值观等。通过数据追踪,知道顾客从哪儿来,是看了某网站投放的广告还是通过朋友推荐链接,是新访客还是

我是网络安全兼技能大赛工程师,专注网络安全技术学习与技能大赛实战!持续分享最新的技术文章,帮你少走弯路,一起在技术赛道上进步~ 471

利用Redis分布式锁解决集群服务器定时任务重复执行问题

问题描述 将带有定时任务的项目部署在单台机器上,完全没问题。 但实际生产是两台集群服务器,项目部署上去发现定时任务的模块同时在两台机器上各执行了一遍,这将会导致数据问题。 方案选择 首先我想到了利用数据库的行锁来解决这个问题,发现需要改动原本的代码,且如果每增加一个任务在开发的时候都要注意行锁问题,是很繁琐的。因此PASS掉,然后还有一种方式是,只让任务在其中一台机器上执行,但是这种方式,过于依赖机器,如果当前执行任务的机器宕机了,就会有问题。 最后考虑使用redis的分布式锁来解决这个问题,同时我希望在

Dan的博客 4398

JavaSwing_1.1: FlowLayout(流式布局)

FlowLayout,流式布局管理器。按水平方向依次排列放置组件,排满一行,换下一行继续排列。

谢TS的博客 7万+

SAP_MM模块非限制库存转冻结库存

项目非限制 → 冻结事务码移动类型343影响库存不可用,不参与MRP常见用途质量问题封存、盘点冻结、待退货品通过本文,我们了解了 SAP 的[SAP_MM模块非限制库存转冻结库存]的基本概念和应用方法。希望这些信息能帮助您在实际工作中更好地使用 SAP 系统,提高工作效率和管理水平。更多SAP文章请点击更多SAP文章更新,大家一起学习进步!!!文章中如有错误。敬请指正!搜索公众号:SAP资料文库微信号:SPRO_PP时间:2025-10-14。

我小时候很黑的博客 586

使用Redisson RLock锁防止定时任务短周期重复执行

RLock是Redisson提供的分布式可重入锁(Reentrant Lock)的实现。与Python中的RLock类似,Redisson的RLock也具有可重入特性,允许同一个线程多次获取同一把锁而不会产生死锁。可重入性:RLock允许同一个线程多次获取锁,而不会导致死锁。每次获取锁时,计数器会递增,直到释放锁的次数与获取锁的次数相等,才会完全释放锁。高可用性:RLock通过Redis作为分布式锁的后端存储,因此具有良好的可扩展性和高可用性。

修己xj的博客 1307

适航规章、标准,书籍资料下载汇总(更新中)

以下是一些收集到的适航相关的资料,分享给大家。(如果没有你想要的资料,请留言,等找到会及时更新!

qq_41854911的博客 2553

集群部署中解决定时任务重复执行的问题-redis分布式锁应用

背景描述 有小伙伴私信我,关于存在定时任务的项目在集群环境下部署如何解决重复执行的问题,PS:定时任务没有单独拆分。 概述:之前的项目都是单机器部署,所以定时任务不会重复消费,只会执行一次。而在集群环境部署下,比如两台机器部署了当前的项目,如果不做任何处理的话势必会执行两次,通常重复执行会影响现有数据。所以要解决的就是在某个时间点,只能让一个项目执行这个定时任务。 考察知识点:锁。 正文部分 这个问题最简单的操作方式是啥? 答:那就是一个打包带定时任务,一个打包不带定时任务… 咳咳,开个玩笑。显然这样不行啊

niceyoo的博客 2561

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

redis分布式锁解决集群服务器定时任务重复执行问题

问题描述 将带有定时任务的项目部署在单台测试环境上,完全没问题。生产上是两台集群服务器,项目部署上去发现定时任务的模块同时在两台机器上各执行了一遍,这将会导致其他意外的发生。 解决方案----redis分布式锁 使用redis分布式锁,为定时任务唯一指定的key加锁,并设置锁超时时间。当触发定时任务时,一台服务的任务进入切面,通过setN...

weixin_33910385的博客 2177

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Redis分布式锁解决分布式环境下定时任务重复执行问题

用Redis分布式锁 解决分布式环境下定时任务重复执行问题

Wzp20020903的博客 753

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

redis分布式锁解决集群部署中定时任务重复执行问题

redis分布式锁解决集群部署中定时任务重复执行问题

法毅的博客 1043

后端——》 使用redis分布式锁解决集群环境下定时任务重复执行的问题

集群环境下,非幂等操作的定时任务通常只能执行一次。但程序在分布在各个服务器上运行,这个时候就可以使用redis分布式锁来保证定时任务只能被执行一次。以下为demo: 我在本地启动了两个程序,每个程序包含一个内容完全相同的定时任务 ,用来模拟在分布式环境。 可以看见,以一分钟执行一轮的频率,可以看到 每轮定时任务只有一个程序 在执行。 那具体的逻辑就是在定时任务中加入 判断是否执行业务逻辑的操作。这个判断的标准就是 通过redis+key来实现: 在业务逻辑被执行之前通过setIfAbsent方.

叙传 1075

集群环境下使用Redis分布式锁防止定时任务重复执行

内容包括实现示例及不同服务器存在时间差时的处理方式。 当服务器进行水平扩展,部署多个节点之后,分散在多个节点的定时任务将被重复执行。 对于执行非幂等操作的定时任务,可以基于Redis的分布式锁来避免重复执行。

一车面包人的博客 1827

Quartz定时任务集群,怎么解决任务重复执行问题

1 数据量评估 定时任务一般的使用场景是定时查询出一批数据,对这一批数据进行业务操作。 根据数据量的大小决定是否使用分布式任务,如果数据量不大或者实时性要求不高,单机任务就够了,也可以减少相应复杂度。 如果数据量大就需要部署分布式任务。分布式集群中的节点对数据进行分片处理,即每个节点拿一部分数据进行业务处理。 2 仅解决并发问题方案 (1) Quartz + 分布式锁 假设定时任务部署了3台机器,在任务启动时3台机器竞争分布式锁,谁竞争到谁就执行,剩下2台不执行。分布式锁可以使用Redis或者Zoo

baidu_20876831的博客 6366

SpringBoot利用redis分布式锁解决集群下定时任务重复执行

一个应用里有利用定时任务统计数据并插入数据库的需求,在单机情况下,不用考虑任何重复执行问题 但在集群下部署多个应用,定时任务就会出现重复执行的问题,为了避免资源浪费和脏数据的问题出现,借助redis分布式锁解决 redis分布式锁原理如下: 基于Redis实现的分布式锁其实很简单,底层就是使用redis的setnx指令来实现的加锁,我们来看看官方对setnx的定义: SETNX key valu...

波板糖的博客 2287

基于分布式锁解决定时任务重复问题

我们一起Coding吧! 根据上述原理,编写Redis分布式锁 定时任务集群部署,任务重复执行? 利用分布式锁解决重复执行的问题 定时任务部署集群 RedisLock package com.example.distributelock.lock; import lombok.extern.slf4j.Slf4j; import org.springframework.data.redis.connection.RedisStringCommands; import org.springframew

罗彬桦的博客 472

springboot中 quartz 的定时器如何保证在集群环境下不重复执行 SpringBoot利用redis分布式锁解决集群下定时任务重复执行

最近在给服务器搭建集群nginx的时候遇到了一个问题,mysql主从也搭建好了。其中有一个定时任务的问题,由于是主从两台机器,程序需要用nginx做反向代理,两台服务器都需要部署相同的程序,这样的话,每台服务器都有可能执行定时任务,导致定时任务重复执行,出现错乱的脏数据。研究了好久终于找到 了解决方案。 这个问题对于新手来说确实是一个挑战。不废话直接入正题。 解决方案是利用redis 的分布式锁来加锁。具体的方案入下: 1. springboot的 yml文件需要配置redis 相关信息: ..

飞熊的博客 1913

springboot redis 分布式锁 quartz定时任务

1、现在服务器基本上是集群、负债均衡、微服务。如果用到quartz定时任务,定时任务会在各个服务器上重复执行,轻则浪费服务器资源,重则造成数据紊乱。 quartz定时任务提供了集群方式,但还需为其创建数据库表。比较麻烦和复杂。所有本人用到redis分布式锁来处理该问题。 edis分布式锁是通过setnx命令实现的。该命令的作用是,当往redis中存入一个值时,会先判断该值对应的key是否存在,如...

追风筝的人博客 1879
上一篇: 使用EasyExcel在同一单元格内添加图片和文字,并作格式排版
下一篇: 使用AOP解决属性值为空,对为空属性赋值问题
阿任_
博客等级 码龄7年 19粉丝 17原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值