分布式锁
可靠的分布式锁,应该具备的几个特征
互斥性 | 在任意时刻,只有一个客户端能持有锁 |
不会发生死锁 | 即使有有一个客户端在持有锁的期间崩溃而没有主动解锁,也能保证后续其他客户端能加锁 |
具有容错性 | 只有大部分的redis节点正常,客户端就可以加锁和解锁 |
解铃还须系铃人 | 加锁和解锁必须是同一个客户端,客户端自己不能把别人加的锁给解锁 |
锁不能自己失效 | 正常执行程序过程中,锁不能因为某些原因失效 |
项目中用到的redissson框架防重复提交:
方式一:
RedissonClient redissonClient = RedissonConfig.redissonClient(); RLock rLock = redissonClient.getLock(accountBookId); try { if (rLock.isLocked()) { createException("当前***正在处理中,请等待"); } rLock.lock(); doMethod(); }finally { if (rLock.isLocked()) { if (rLock.isHeldByCurrentThread()) { rLock.unlock(); } } }
方式二:(推荐)
public void method(XXX xx) { RLock lock = null; try { lock = redissonClient.getLock("test_lock"); if (!lock.tryLock()) {
log.info("repeat xxId:{}",xxId);
throw new BaseException(); } doBusinesss(); } catch (Exception e) {throw new BaseException(); } finally { if (Objects.nonNull(lock) && lock.isHeldByCurrentThread()) { lock.unlock(); } } }
参考:https://zhuanlan.zhihu.com/p/242536987