redisson的lockAsync用法


lockAsync()顾名思义是异步加锁,相比较lock()的区别是不阻塞主流程;lock()必须加锁成功后才能顺序执行下面的代码;而lockAsync不用等待加锁是否成功,继续执行下面的代码,提高qps;

下面是lockAsync的具体用法,不同版本使用方法有区别。

redisson版本3.5.7的使用

一、加监听

RLock lock = redissonClient.getLock("testLockAsync1");
RFuture<Void> rfuture = lock.lockAsync(5, TimeUnit.SECONDS);
rfuture.addListener(new FutureListener<Void>() {
    @Override
    public void operationComplete(Future<Void> future) throws Exception {// 监听,加锁完成后执行
        logger.error("testLockAsync1加锁成功!{},{}", future.isSuccess(), Thread.currentThread().getId());
    }
});

二、用completionStage接口里的方法,这里我用了两种

1、whenComplete

RLock lock1 = redissonClient.getLock("testLockAsync1");
RFuture<Void> rfuture1 = lock1.lockAsync(5, TimeUnit.SECONDS);

rfuture1.whenComplete((res, e) -> {// 加锁完成后 异步执行
    logger.error("testLockAsync2{},{}", rfuture1.isSuccess(), Thread.currentThread().getId());
});

 

2、whenCompleteAsync

RLock lock1 = redissonClient.getLock("testLockAsync1");
RFuture<Void> rfuture1 = lock1.lockAsync(5, TimeUnit.SECONDS);

rfuture1.whenCompleteAsync((res, e) -> {// 加锁完成后 异步执行
    logger.error("testLockAsync2:whenCompleteAsync{},{}", rfuture1.isSuccess(), Thread.currentThread().getId());
});

本地测试看每一步执行的顺序、打印出线程id:

测试代码:

 

 测试结果:

 

 可以看出主流程无需等待是否加锁成功。当加锁成功后执行监听里的方法及whenComplete、whenCompleteAsync;

whenComplete、whenCompleteAsync这两个方法的区别暂时没搞懂,看log唯一的区别是线程的区别,执行whenComplete的线程是redisson-netty,whenCompleteAsync的线程是ForkJoinPool.commonPool-worker

 

 redisson版本3.11.1的使用

在这个版本addListener监听方法去掉了。增加了一个新的方法onComplete。

RLock lock = redissonClient.getLock("testLockAsync1");
RFuture<Void> rfuture = lock.lockAsync(5, TimeUnit.SECONDS);
rfuture.onComplete((res, e) -> {
  logger.error("testLockAsync1,加锁:{},线程:{}", rfuture.isSuccess(), Thread.currentThread().getId());
});

测试代码:

 

 测试结果:

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM