
前提项目里面已经正确的集成了spring-boot-starter-data-redis,参考本专栏前面文章《单例、哨兵、集群模式整合》
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-integrationartifactId>
dependency>
<dependency>
<groupId>org.springframework.integrationgroupId>
<artifactId>spring-integration-redisartifactId>
dependency>
完成RedisLockRegistry Bean注册
@Configuration
public class RedisLockConfig {
@Bean
public RedisLockRegistry redisLockRegistry(RedisConnectionFactory redisConnectionFactory) {
//第一个参数redisConnectionFactory
//第二个参数registryKey,分布式锁前缀,设置为项目名称会好些
//该构造方法对应的分布式锁,默认有效期是60秒.可以自定义
return new RedisLockRegistry(redisConnectionFactory, "boot-launch");
//return new RedisLockRegistry(redisConnectionFactory, "boot-launch",60);
}
}
使用RedisLockRegistry完成获取锁、加锁以及完成业务之后的释放锁的操作。
@Resource
private RedisLockRegistry redisLockRegistry;
public void updateUser(String userId) {
String lockKey = "config" + userId;
Lock lock = redisLockRegistry.obtain(lockKey); //获取锁资源
try {
lock.lock(); //加锁
//这里写需要处理业务的业务代码
} finally {
lock.unlock(); //释放锁
}
}
org.springframework.integration.redis.util.RedisLockRegistry的核心源码非常简单,就RedisLockRegistry这一个类。源码我就不贴在这里了,我给大家总结一下要点:
现在有很多的博文里面给出了一种非常简单的实现,就是在方法上面加注解,比如:
@RedisLock("lock-key")
public void save(){
}
这种实现使用上非常简单,但是笔者不建议使用这种方式,有几个原因