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

适用Java SpringBoot项目的分布式锁

在分布式系统中,常用到分布式锁,它有多中实现方式,如:基于redis,database,zookeeper等。Spring integration组件有这三种服务的分布式锁实现,今天来看看用的比较多的redis和database实现方式。

第一种:Spring原生-基于Redis的分布式锁:

1. 需要加入以下依赖,第一个是spring boot integration模块,一个是integration redis实现模块。

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-integration</artifactId>
</dependency>
<dependency><groupId>org.springframework.integration</groupId><artifactId>spring-integration-redis</artifactId>
</dependency>

2. 配置RedisLockRegistry Bean,有了这个Bean之后,就可以用来加锁、解锁了,Spring框架中有继承redis的实现和异常处理,我们可以方便且稳定的使用。

@Configuration
public class LockConfig {@Beanpublic RedisLockRegistry redisLockRegistry(RedisConnectionFactory redisConnectionFactory) {return new RedisLockRegistry(redisConnectionFactory, "test",60);}
}

3. 加锁、解锁。在需要分布式加锁的时候,先通过redisLockRegistry获取到lock对象,然后用lock对象加锁(可以设置等待尝试时间,到点自动放弃,不加时间默认立即放弃),处理完业务之后一定要记得解锁。

Lock lock = redisLockRegistry.obtain(lockKey);if (lock.tryLock(0L, TimeUnit.SECONDS)) {log.info("获取到锁,执行业务代码...");} else {log.info("很遗憾没获取到锁。");
}lock.unlock();

 

第二种:Spring原生-基于DB的分布式锁:

1. 需要加入以下依赖,第一个是spring boot integration模块,一个是integration jdbc实现模块。

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-integration</artifactId>
</dependency>
<dependency><groupId>org.springframework.integration</groupId><artifactId>spring-integration-jdbc</artifactId>
</dependency>

2. 配置JdbcLockRegistry Bean,有了这个Bean之后,就可以用来加锁、解锁了,Spring框架中有继承redis的实现和异常处理,我们可以方便且稳定的使用。

@Configuration
public class LockConfig {@Beanpublic JdbcLockRegistry getJdbcLockRegistry(DataSource dataSource, ApplicationContext applicationContext) {DefaultLockRepository lockRepository = new DefaultLockRepository(dataSource);lockRepository.setApplicationContext(applicationContext); //必须设置applicationContextlockRepository.afterSingletonsInstantiated(); //在LockRepository实例化后必须调用这个方法,否则后面会报事务对象空指针错误lockRepository.setPrefix("spring_"); //分布式锁表前缀,自定义lockRepository.setTimeToLive(60000); //锁存活时间60slockRepository.afterPropertiesSet(); //属性设置结束后必须调用此方法,格式化加锁、解锁SQL语句return new JdbcLockRegistry(lockRepository);}
}

3. 加锁、解锁。在需要分布式加锁的时候,先通过jdbcLockRegistry获取到lock对象,然后用lock对象加锁(可以设置等待尝试时间,到点自动放弃,不加时间默认立即放弃),处理完业务之后一定要记得解锁。

Lock lock = jdbcLockRegistry.obtain(lockKey);if (lock.tryLock(0L, TimeUnit.SECONDS)) {log.info("获取到锁,执行业务代码...");} else {log.info("很遗憾没获取到锁。");
}lock.unlock();

http://www.lryc.cn/news/308767.html

相关文章:

  • 面试笔记系列二之java基础+集合知识点整理及常见面试题
  • 搭建LNMP环境并搭建论坛和博客
  • 蓝桥杯刷题2
  • 低代码与国产化部署:软件开发的未来趋势与应用实践
  • 【Python笔记-设计模式】迭代器模式
  • Linux基本指令(上)
  • 浅谈XSS简单漏洞xss-labs-master(初级)
  • WordPress分类目录ID怎么看?如何查找WordPress标签ID?
  • 达梦数据库基础操作(一):用户操作
  • Java进阶(锁)——锁的升级,synchronized与lock锁区别
  • Flask+Gunicorn中文乱码解决方案
  • vue3的开发小技巧
  • 十三、Qt多线程与线程安全
  • 今日话题:---自卑
  • Unity 预制体与变体
  • leetcode:860.柠檬水找零
  • Python程序的流程
  • C语言可以干些什么?C语言主要涉及哪些IT领域?
  • element-ui附件上传及在线查看详细总结,后续赋源码
  • 投标中excel表格常用功能梳理
  • C++二叉搜树的实现(递归和非递归)
  • 蓝桥杯算法 一.
  • 如何学习自然语言处理之语言模型
  • Zoho ToDo 满足您的需求:任务管理满足隐私和安全要求
  • 仿牛客网项目---社区首页的开发实现
  • 虚拟机部署Sentry步骤,国内地址
  • [Android View] 可绘制形状 (Shape Xml)
  • [游戏开发][虚幻5]新建项目注意事项
  • 防考试作弊切屏
  • 浅析能耗监测系统在大型数据中心的应用