java基于redis实现分布式锁

文章目录

  • 前言
  • 一、redis
  • 二、Redisson
    • 1.引入库
    • 2. 分布式锁
    • 3. 锁自动续期
  • 总结


前言

上篇文章介绍了Java中锁的应用,在SpringBoot单体应用中完全够用,但是SpringCloud微服务集群中就力所不及了。
我的使用场景是某些微服务应用中使用spring注解的形式来完成定时任务的功能,服务集群之后每台服务器都会调起定时任务,这和预想的不一样,需要添加分布式锁来控制任务的执行,推荐大家使用quartz和xxl-job来完成定时任务的调度。


一、redis

redis的使用我就不过多介绍了,前面文章写了好几篇了,可以自行爬楼翻看。

@Service
public class StudentService {private static final Logger log = LoggerFactory.getLogger(StudentService.class);@AutowiredStringRedisTemplate stringRedisTemplate;@Value("${server.port}")private String port;@Scheduled(cron = "0 0/1 6-23 * * ?")public void execute(){ValueOperations<String, String> operations = stringRedisTemplate.opsForValue();String key="student-"+ DateUtils.format(new Date(),"yyyyMMdd");String value = RandomUtil.randomNumbers(6);long timeout=24 * 60 * 60;Boolean absent = operations.setIfAbsent(key, value, timeout, TimeUnit.SECONDS);log.debug(port+"获取锁:"+absent);try {//todo 业务处理if(absent){Thread.sleep(1000);}} catch (InterruptedException e) {e.printStackTrace();}finally {if(value.equals(operations.get(key))){stringRedisTemplate.delete(key);log.debug(port+"执行完成,解除锁");}}}
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
定时任务集群要保证服务器时间一致,否则每次执行都可能跑到时间较为靠前的那台服务器上

二、Redisson

1.引入库

<dependency><groupId>org.redisson</groupId><artifactId>redisson-spring-boot-starter</artifactId><version>3.23.0</version>
</dependency>

2. 分布式锁

@Service
public class StudentService {private static final Logger log = LoggerFactory.getLogger(StudentService.class);@Value("${server.port}")private String port;@Autowiredprivate RedissonClient redissonClient;@Scheduled(cron = "0 0/1 6-23 * * ?")public void redisson(){String key="student-"+ DateUtils.format(new Date(),"yyyyMMdd");long timeout=24 * 60 * 60;RLock lock = redissonClient.getLock(key);boolean tryLock=false;try {tryLock = lock.tryLock();log.debug(port+"获取锁["+key+"]:"+tryLock);if(tryLock){lock.lock(timeout, TimeUnit.SECONDS);//锁到期自动解锁//todo 业务处理Thread.sleep(10000);}} catch (Exception e) {e.printStackTrace();}finally {if(tryLock&&lock.isHeldByCurrentThread()){lock.unlock();log.debug(port+"执行完成,解除锁["+key+"]");}}}
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3. 锁自动续期

@Service
public class StudentService {private static final Logger log = LoggerFactory.getLogger(StudentService.class);@Value("${server.port}")private String port;@Autowiredprivate RedissonClient redissonClient;@Scheduled(cron = "0 0/1 6-23 * * ?")public void redissonRenewal(){String key="student-"+ DateUtils.format(new Date(),"yyyyMMdd");long time=10;RLock lock = redissonClient.getLock(key);boolean tryLock=false;try {tryLock = lock.tryLock(time,TimeUnit.SECONDS);log.debug(port+"获取锁["+key+"]:"+tryLock);if(tryLock){log.debug(port+"锁["+key+"]剩余生存时间为:"+(lock.remainTimeToLive()/1000)+"秒");lock.lock();//todo 业务处理Thread.sleep(40000);log.debug(port+"锁["+key+"]剩余生存时间为:"+(lock.remainTimeToLive()/1000)+"秒");}} catch (Exception e) {e.printStackTrace();}finally {if(tryLock&&lock.isHeldByCurrentThread()){lock.unlock();log.debug(port+"执行完成,解除锁["+key+"]");}}}
}

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述


总结

回到顶部
Redisson
redisson-spring-boot-starter

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/492703.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在使用nginx的时候快速测试配置文件,并重新启动

小技巧 Nginx修改配置文件后需要重新启动&#xff0c;常规操作是启动在任务管理器中关闭程序然后再次双击nginx.exe启动&#xff0c;但是使用命令行就可以快速的完成操作。 将cmd路径切换到nginx的安装路径 修改完成配置文件后 使用 nginx -t校验nginx 的配置文件是否出错 …

C# OpenVINO PaddleSeg实时人像抠图PP-MattingV2

目录 效果 项目 代码 下载 C# OpenVINO 百度PaddleSeg实时人像抠图PP-MattingV2 效果 项目 代码 using OpenCvSharp; using Sdcb.OpenVINO; using System; using System.Diagnostics; using System.Drawing; using System.Security.Cryptography; using System.Text; us…

医院管理系统小程序

**&#x1f345;点赞收藏关注 → 私信领取本源代码、数据库&#x1f345; 本人在Java毕业设计领域有多年的经验&#xff0c;陆续会更新更多优质的Java实战项目希望你能有所收获&#xff0c;少走一些弯路。&#x1f345;关注我不迷路&#x1f345;**一 、设计说明 1.1 研究背景…

智慧公厕是什么?智慧公厕意义何在

随着城市化进程的加速&#xff0c;公厕成为城市管理中不容忽视的一环。智慧公厕传统的公厕管理方式已经无法满足当今社会的需求&#xff0c;因此智慧公厕的出现成为解决问题的利器。什么是智慧公厕&#xff1f;智慧公厕是实现公共厕所信息化、数字化、智慧化全方位管理与服务的…

Vue 卸载eslint

卸载依赖 npm uninstall eslint --save 然后 进入package.json中&#xff0c;删除残留信息。 否则在执行卸载后&#xff0c;运行会报错。 之后再起项目。

gitlab上传代码

1、先在gitlab上新建一个project 2、创建一个新的project 3、自定义项目名称和组名&#xff1a;无组名可新创建一个组 打开git命令行工具&#xff0c;执行如下命令。 git init 这将会创建一个新的空白的Git仓库。 git add . 当前目录及子目录下所有修改过的文件都被添加到Gi…

前端工程化面试题 | 17.精选前端工程化高频面试题

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

使用GPTQ进行4位LLM量化

使用GPTQ进行4位LLM量化 最佳脑量化GPTQ算法步骤1:任意顺序洞察步骤2:延迟批量更新第三步:乔尔斯基重塑 用AutoGPTQ量化LLM结论References 权重量化的最新进展使我们能够在消费级硬件上运行大量大型语言模型&#xff0c;例如在RTX 3090 GPU上运行LLaMA-30B模型。这要归功于性能…

分布式事务,zookeeper,dubbo,rocketmq

1.1 什么是CAP理论 CAP理论是分布式领域中非常重要的一个指导理论&#xff0c;C&#xff08;Consistency&#xff09;表示强一致性&#xff0c;A&#xff08;Availability&#xff09;表示可用性&#xff0c;P&#xff08;Partition Tolerance&#xff09;表示分区容错…

Kubernetes部署及运用

Kubernetes 1. Kubernetes介绍 1.1 应用部署方式演变 在部署应用程序的方式上&#xff0c;主要经历了三个时代&#xff1a; 传统部署&#xff1a;互联网早期&#xff0c;会直接将应用程序部署在物理机上 优点&#xff1a;简单&#xff0c;不需要其它技术的参与 缺点&#xf…

Linux java查看内存消耗 linux查看java程序内存(转载)

Linux java查看内存消耗 linux查看java程序内存 目录 一、jps命令。 二、ps命令。 三、top命令。 四、free命令。 五、df命令。 查看应用的CPU、内存使用情况&#xff0c;使用jps、ps、top、free、df命令查看。 一、jps命令。 可以列出本机所有java应用程序的进程pid。…

还不知道随身WiFi这个蓝海市场怎么做?这个一定要看!适合30-40岁轻资产小生意

有没有发现你身边的人最近都在失业&#xff1f;无论是国企的、事业编的、又或者是民营企业的都在欠薪或者失业&#xff0c;看来经济寒潮是真的来了。虽然经济大环境不好&#xff0c;但是仍然涌现出了物联网、人工智能、大数据等新兴的蓝海市场。可是很多创投圈的朋友都表示&…