整合 Redisson
1、引入依赖
xml
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson</artifactId>
<version>3.12.0</version>
</dependency>
2、配置
java
@Configuration
public class MyRedissonConfig {
@Bean(destroyMethod = "shutdown")
public RedissonClient redisson() {
Config config = new Config();
config.useSingleServer().setAddress("redis://192.168.56.10:6379");
return Redisson.create(config);
}
}
3、使用
java
@Autowired
private RedissonClient redissonClient;
@GetMapping("/redisson")
public String redisson() {
RLock lock = redissonClient.getLock("my-lock");
lock.lock();
try {
Thread.sleep(30000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
} finally {
lock.unlock();
}
return "redisson";
}
Redisson 分布式锁的实现
1、实现了锁的自动续期。如果业务超长,运行期间自动给锁续上新的30s。
2、默认30s 后自动删除,不会产生死锁。
注意
1、 lock.lock(10, TimeUnit.SECONDS); 指定过期时间的加锁,不会有看门狗功能。
2、看门狗功能的实现原理:占锁成功后,会启动一个定时任务,每隔1/3看门狗时间,重置锁的过期时间。
读写锁
保证一定能读到最新数据,修改期间,写锁是排它锁,读锁是共享锁。
- 读 + 读:相当于无锁
- 写 + 读:等待写锁释放
- 写 + 写:阻塞方式
- 读 + 写:等待读锁释放
信号量
使用场景:车库停车、分布式限流
java
@GetMapping("/park")
@ResponseBody
public String park() throws InterruptedException {
RSemaphore park = redissonClient.getSemaphore("park");
boolean b = park.tryAcquire();
return "ok->" + b;
}
@GetMapping("/go")
@ResponseBody
public String go() throws InterruptedException {
RSemaphore park = redissonClient.getSemaphore("park");
park.release();
return "ok";
}
闭锁
使用场景:放假锁门