网站登录接口怎么做,微信小程序开发网站,crm客户管理系统服务电话,工程建设标准下载网站在分布式系统中#xff0c;常用到分布式锁#xff0c;它有多中实现方式#xff0c;如#xff1a;基于redis#xff0c;database#xff0c;zookeeper等。Spring integration组件有这三种服务的分布式锁实现#xff0c;今天来看看用的比较多的redis和database实现方式。 …在分布式系统中常用到分布式锁它有多中实现方式如基于redisdatabasezookeeper等。Spring integration组件有这三种服务的分布式锁实现今天来看看用的比较多的redis和database实现方式。
第一种Spring原生-基于Redis的分布式锁
1. 需要加入以下依赖第一个是spring boot integration模块一个是integration redis实现模块。
dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-integration/artifactId
/dependency
dependencygroupIdorg.springframework.integration/groupIdartifactIdspring-integration-redis/artifactId
/dependency2. 配置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实现模块。
dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-integration/artifactId
/dependency
dependencygroupIdorg.springframework.integration/groupIdartifactIdspring-integration-jdbc/artifactId
/dependency2. 配置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();