本章节基于前面的integration来配置分布式锁
详细请看前面文章链接
下面使用integration+redis实现分布式锁
前面无论是注解形式还是声明式的形式,都使用了本地锁
@SpringBootConfiguration
@Slf4j
public class LocalLockConfig {
/**
* 配置本地锁z
* @return
*/
@Bean
public LockRegistry localLockRegistry(){
LockRegistry lockRegistry = new DefaultLockRegistry();
log.info("the local lock is loaded successfully!");
return lockRegistry;
}
}
那么我们在新模块中,只需要重写这个锁就可以实现其他锁,比如实现redis的分布式锁
如下图,前面为本地锁,下面为redis分布式锁
依赖如下
<dependencies>
<dependency>
<groupId>com.imooc.pan</groupId>
<artifactId>lock-core</artifactId>
<version>1.0</version>
</dependency>
<dependency>
<!-- spring integration与redis结合,实现redis分布式锁 -->
<groupId>org.springframework.integration</groupId>
<artifactId>spring-integration-redis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
首先进行锁的配置,配置redis的分布式锁
integrationGroupKey
:这是分布式锁的组名称。在 RedisLockRegistry 中,锁的名称是由该组名称和锁的名字组合而成的。这样可以在 Redis 中更好地组织锁的存储结构,以便于管理和查找。expireAfter
:这是分布式锁的持有时间,即锁的过期时间。在 Redis 中,锁可以设置一个过期时间,以防止锁被长时间持有而导致死锁或其他问题。这里的时间单位是毫秒。
@Configuration
public class RedisLockConfiguration {
private static final String integrationGroupKey = LockConstants.R_PAN_LOCK;//分布式锁的组名称
private static final long expireAfter = 10L * 1000L ;//分布式锁持有时间
@Bean
public LockRegistry redisLockRegistry(RedisConnectionFactory redisConnectionFactory){
return new RedisLockRegistry(redisConnectionFactory, LockConstants.R_PAN_LOCK,expireAfter);
}
后面使用到的话把拥有这个类中bean的类注入到业务模块去,业务模块使用父类接口 private LockRegistry lockRegistry接收,这样子就可以实现不同需要的锁实现,只需要注入不同的依赖的好了(比如本地锁在一个模块,redis分布式锁在一个模块)
接下来我在我的业务模块注入redis分布式锁模块的依赖
接着在对应的业务模块上面使用注解形式的方法加锁(分布式锁),替换之前的synchronized