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