分布式开发必备技能-分布式锁-redisson实现
背景
很久很久以前,我们的架构都是单体架构,项目也只会部署到一台服务器,基于JVM的 java 同步工具(如ReentrantLcok或synchronized)完全可以保证我们的业务的 原子性;随着微服务,分布式的出现,一个项目会部署到多台服务器(多个JVM),这时候多个服务之间的一系列操作要保证原子性,基于JVM的 java 同步工具(如ReentrantLcok或synchronized)就无能为力了,这时候需要一个针对整个项目(包含所有服务)的一个全局锁来控制业务,这时候分布式锁就应运而生。
分布式锁的 注意事项
加锁必须设置过期时间(避免死锁)
加锁操作必须和设置 过期时间 是原子性操作
并发操作下 导致加过期时间失败问题(某个线程执行完枷锁操作 未加过期时间 报错终止)过期时间 必须保证业务操作 结束
开始子线程监控 未执行结束 续命(加过期时间)必须保证 谁加锁 谁解锁
防止高并发下 锁失效问题
基于 redisson 实现
@RestController
public class RedissonLock {
// 分布式锁的 注意事项
// 1. 加锁必须设置过期时间
// (避免死锁)
// 2. 加锁操作必须和设置 过期时间 是原子性操作
// 并发操作下 导致加过期时间失败问题(某个线程执行完枷锁操作 未加过期时间 报错终止)
// 3. 过期时间 必须保证业务操作 结束
// 开始子线程监控 未执行结束 续命(加过期时间)
// 4. 必须保证 谁加锁 谁解锁
// 防止高并发下 锁失效问题
static int r = 0;
@Autowired
private RedissonClient redissonClient;
@GetMapping("/testLock")
public int testRedissonLock(@RequestParam boolean isLock) throws InterruptedException {
RLock rLock = null;
int result = 0;
if(isLock){
try{// 获取锁
rLock = redissonClient.getLock("test1");
// 上锁
rLock.lock(12, TimeUnit.SECONDS);
result = dobusiness();
}
finally {
// 解锁
rLock.unlock();
}
} else {
result = dobusiness();
}
return result;
}
private int dobusiness() throws InterruptedException {
++r;
TimeUnit.SECONDS.sleep(1);
System.out.println(r);
return r;
}
个人水平有限,如有问题,请各路大神指教,虚心接纳
如果觉得有帮助,请关注,谢谢