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());
});
測試代碼:
測試結果: