目录
Redis实现的分布式锁还存在一下问题:
Redisson可以全部解决以上问题
1. Redisson获取的锁是可重入的锁
RLock lock = redissonClient.getLock("lock:order");
2. waitTime为重试时间,leaseTime为持有的超时时间
lock.tryLock(long waitTime, long leaseTime, TimeUnit unit)
3.不设置leaseTime,可以解决超时释放带来的并发安全隐患
4.解决主从一致性问题,采用连锁,多个节点都为主节点。同时获取全部节点的锁。
引入依赖
<!-- redisson -->
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson</artifactId>
<version>3.17.5</version>
</dependency>
添加配置
@Configuration
public class RedissonConfig {
@Bean
public RedissonClient redissonClient() {
//配置
Config config = new Config();
//添加Redis地址,这里添加单点地址,也可以使用config.useClusterServers()添加集群地址
config.useSingleServer().setAddress("redis://192.168.99.100:56379").setPassword("123321");
//创建Redis对象
return Redisson.create(config);
}
}
使用Redisson提供的分布式锁
@Service
public class DistributePayImpl implements SinglePay {
@Autowired
SimpleRedisLock simpleRedisLock;
@Autowired
RedissonClient redissonClient;
public void buyOrder(Long userId) {
buyOrder_RedissionLock(userId);
}
private void buyOrder_RedissionLock(Long userId){
String lockKey = "lock:order:" + userId;
//使用Redisson获取锁
RLock lock = redissonClient