分布式锁

可靠的分布式锁,应该具备的几个特征

 

互斥性 在任意时刻,只有一个客户端能持有锁
不会发生死锁 即使有有一个客户端在持有锁的期间崩溃而没有主动解锁,也能保证后续其他客户端能加锁
具有容错性 只有大部分的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

posted @ 2021-06-15 22:38  不死码农  阅读(76)  评论(0编辑  收藏  举报