Redisson的快速上手
1.声明配置类
@Configuration
public class RedissonConfig {
@Bean
public RedissonClient redissonClient() {
// 配置
Config config = new Config();
config.useSingleServer().setAddress("redis://localhost:6379")
.setPassword("020827");
// 创建RedissonClient对象
return Redisson.create(config);
}
}
2.简易使用
@SpringBootTest
public class RedissonTest {
@Autowired
private RedissonClient redissonClient;
@Test
public void Test1(String key) throws InterruptedException {
RLock lock = redissonClient.getLock(key);
//加锁 最大等待时间,超时时间,时间单位
boolean flag = lock.tryLock(1, 10, TimeUnit.SECONDS);
if(flag){
//业务逻辑
}else{
//锁获取失败
}
//释放锁
lock.unlock();
}
}
Redisson相较与Redis的setnx的优势
一、Redisson有一个watchDog看门狗机制会为锁不断地续约,直到线程主动释放锁,防止了锁在持有线程中长时间运行期间失效,确保其他线程不会在不应该获取锁情况下获得它。看门狗机制相较于不设置过期时间避免了在异常情况下锁资源被持续占用而无法释放。
二、Redisson拥有重试机制 当调用tryLock
方法时,它会在一定时间范围内尝试获取锁。具体如下:
1.如果锁当前可用,则立即获得锁并返回true。
2.如果锁当前不可用,则线程会等待一段时间(最大等待时间)来尝试获取锁。
3.如果最大等待时间内成功获取锁则返回true。
4.如果最大等待时间内无法获取锁则返回false。
三、提供可重入机制
在Redisson中,可重入锁的实现基于Redis的分布式锁(Redis Distributed Lock)。它通过在Redis中存储锁的信息来实现可重入性。每个可重入锁都有一个唯一的标识符用于在Redis中存储锁的状态。
当线程首次获取可重入锁时,Redisson会向Redis中写入锁的状态信息。状态信息包括锁的持有者、锁的持有数量、锁的过期时间等。锁的持有者根据线程的唯一标识符确定,用于判断是否是同一个线程多次获取锁。
当同一个线程再次请求获取可重入锁时,Redisson会检查当前的锁状态信息。如果锁的持有者是当前线程,说明当前线程已经持有了该锁,可以继续获取锁。此时,Redisson会更新锁的持有数量并延长锁的过期时间。这保证了同一个线程可以多次获取锁而不被阻塞。
当线程释放可重入锁时,Redisson会检查锁的持有数量。如果持有数量为1,说明锁已经完全释放,Redisson会删除Redis中的锁状态信息。如果持有数量大于1,说明还有其他线程持有该锁,Redisson会更新锁的持有数量,并根据需要更新锁的过期时间。
通过这种方式,Redisson实现了可重入锁的机制,允许同一个线程多次获取同一个锁而不会产生死锁或阻塞的问题。这对于一些需要嵌套锁或递归调用的场景非常有用。