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

Java使用Redis来实现分布式锁

Java使用Redis来实现分布式锁

在单节点服务中,我们可以使用synchronized来保证同一时间内只允许一个线程执行限定的代码块。但是如果我们是多节点服务呢,因为synchronized是针对服务内部的,其他服务是无法受到他的干预的。那么如何保证多个节点在同一时间内只允许一个节点中的一个线程去访问这个代码块呢?

使用分布式锁!!!

本文使用Redisson来操作Redis并实现分布式锁

Redisson

官网:https://github.com/redisson/redisson/tree/redisson-3.16.8

  1. 引入依赖

    <dependency><groupId>org.redisson</groupId><artifactId>redisson</artifactId><version>3.16.8</version>
    </dependency> 
    
  2. 创建RedissonConfig配置类

    @ConfigurationProperties(prefix = "spring.redis")
    @Configuration
    @Data
    public class RedissonConfig {// 主机名private String host;// 端口private String port;// 使用那个数据库private Integer database;@Beanpublic RedissonClient redissonClient(){Config config = new Config();// 使用单机Redis服务config.useSingleServer()// use "rediss://" for SSL connection.setAddress(String.format("redis://%s:%s",host,port)).setDatabase(database);return Redisson.create(config);}
    }
    
  3. 创建配置文件

    # Redis 配置
    spring.redis.host=xxx
    spring.redis.port=xxx
    spring.redis.database=xxx
    
  4. 在业务代码中添加分布式锁

    // 注入我们的RedissonClient
    @Autowired
    private RedissonClient redissonClient;{// 指定一个key来获取锁,如果是需要按不同的情况加锁的话,这样可以使用变量RLock lock = redissonClient.getLock("LOCK_NAME");try{lock.tryLock(long waitTime, long leaseTime, TimeUnit unit);//... 业务逻辑}catch (InterruptedException ex) {ex.printStackTrace();}finally{// 判断是否由当前线程持有锁 if (lock.isHeldByCurrentThread()) {// 释放锁lock.unlock();}}
    }
    

    tryLock 尝试获取锁 获取成功返回true 获取失败返回false

    • waitTime 尝试获取锁的等待时间,超过不再继续获取
    • leaseTime 锁的持有时间,业务代码的执行时间如果超过该时间则抛出异常
      • 可以设置为null 或者 -1 表示业务执行多久占用多久,这里其实使用了看门狗的一个机制,默认的持有时间是30秒,如果超时未执行完成,每10看门狗会为我们自己续期一次。已保证业务代码执行完成。
    • unit 时间单位
http://www.lryc.cn/news/238815.html

相关文章:

  • 移动端表格分页uni-app
  • 全志R128芯片RTOS调试指南
  • 超级实用的程序员接单平台,看完少走几年弯路,强推第一个!
  • 前端字符串方法汇总
  • 12 分布式锁加入看门狗
  • 怎么判断list是否为null
  • 11.数据公式中使用2个 $$ a =b $$,是什么意思?
  • 设计模式-14-迭代器模式
  • 防雷接地+防雷工程施工综合方案
  • 排序算法--选择排序
  • 【Web】Ctfshow SSRF刷题记录1
  • 【算法挨揍日记】day30——300. 最长递增子序列、376. 摆动序列
  • ROS2对比ROS1的一些变化与优势(全新安装ROS2以及编译错误处理)《1》
  • 基于单片机PM2.5监测系统仿真设计
  • CRM系统中的联系人是什么?如何进行联系人管理?
  • uniapp:如何实现点击图片可以全屏展示预览
  • python运行hhsearch二进制命令的包装器类
  • Java 网络编程、e-mail、多线程编程
  • 为虚幻引擎开发者准备的Unity指南
  • Vue 2使用element ui 表格不显示
  • C++学习 --文件
  • java/Android:将字符串按数量分割
  • JVM 监控命令详解
  • TEE威胁评分与评级
  • -bash: ./deploy.sh: /bin/bash^M: bad interpreter: No such file or directory
  • 【文末送书】十大排序算法C++代码实现
  • vue-waterfall2 实现瀑布流,及总结的问题
  • grafana二次启动失败
  • C/C++杂谈-printf的可变参数机制
  • es基本语法 (kibana)