前言
日常开发中,难免遇到一些并发的场景,为了保证接口执行的一致性,通常采用加锁的方式,因为服务是分布式部署模式,本地锁Reentrantlock和Synchnorized这些就先放到一边了,Redis的setnx锁存在无法抱保证原子性的问题就暂时搁且到一边,直接上大招Ression也是我最近开发项目中基本都在用的缓存,并且也都是用它的分布式锁机制。
Ression分布式锁常规使用
关于Ression的一些基本概念,本章就不做太详细的说明了,有兴趣的小伙伴可以自己去了解下,主要说下加锁的常规使用,Ression分布式锁是基于Redis的Rlock锁,实现了JavaJUC包下的Lock接口。
Lock
public void getLock(){
//获取锁
RLock lock = redisson.getLock("Lxlxxx_Lock");
try {
// 2.加锁
lock.lock();
} catch (InterruptedException e) {
e.getStackTrace();
} finally {
// 3.解锁
lock.unlock();
System.out.println("Finally,释放锁成功");
}
复制代码
getLock获取锁,lock.lock进行加锁,会出现的问题就是lock拿不到锁一直等待,会进入阻塞状态,显然这样是不好的。
TryLock
返回boolean类型,和Reentrantlock的tryLock是一个意思,尝试获取锁,获取到就返回true,获取失败就返回false,不会使获不到锁的线程一直处于等待状态,返回false可以继续执行下面的业务逻辑,当然Ression锁内部也涉及到watchDog看门狗机制,主要作用就是给快过期的锁进行续期,主要用途就是使拿到锁的有限时间让业务执行完,再进行锁释放。
RLock lock = redisson.getLock(name);
try {
if (lock.tryLock(2, 10, TimeUnit.SECONDS)) {
//执行业务逻辑
} else {
System.out.println("已存在");
}
} c