官方网址
单节点续命锁(自定义线程池测试)
@Slf4j
public class ReentrantLockDemo {
public static RedissonClient redissonClient;
static {
Config config = new Config();
SingleServerConfig singleServerConfig = config.useSingleServer();
singleServerConfig.setPassword("LI1234REDIS!");
singleServerConfig.setAddress("redis://192.168.213.137:6379");
singleServerConfig.setDatabase(0);
redissonClient = Redisson.create(config);
}
public static void main(String[] args) throws InterruptedException {
ExecutorService executorService = new ThreadPoolExecutor(
10,
100,
30, TimeUnit.SECONDS,
new ArrayBlockingQueue<>(100),
new ThreadPoolExecutor.CallerRunsPolicy());
for (int i = 0; i < 10; i++) {
executorService.execute(new Runnable() {
@Override
public void run() {
RLock rLock = redissonClient.getLock("rLock");
boolean res = false;
try {
res = rLock.tryLock(500, -1, TimeUnit.MILLISECONDS);
if (res) {
log.info(Thread.currentThread().getName()+" 拿到锁,开始执行任务");
Thread.sleep(8000);
log.info(Thread.currentThread().getName()+" 拿到锁,执行任务成功");
} else {
log.info(Thread.currentThread().getName()+" 超时,未拿到锁");
}
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
if(rLock.isLocked() && rLock.isHeldByCurrentThread()) {
rLock.unlock();
}
}
}
});
}
executorService.shutdown();
}
}
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/54d16fb24766611385e28a99a81bebf4.png)
单节点续命锁(jmeter测试)
@Resource
private RedissonClient redissonClient;
@GetMapping("reentrantLock")
public BaseResult<String> reentrantLock() {
RLock rLock = redissonClient.getLock("rLock");
boolean res = false;
try {
res = rLock.tryLock(500, -1, TimeUnit.MILLISECONDS);
if (res) {
LoggerUtil.info(MessageFormat.format("{0} 拿到锁,开始执行任务", Thread.currentThread().getName()));
Thread.sleep(150000);
LoggerUtil.info(MessageFormat.format("{0} 拿到锁,执行任务成功", Thread.currentThread().getName()));
return new BaseResult<String>().success(MessageFormat.format("{0} 拿到锁,执行任务成功", Thread.currentThread().getName()));
} else {
LoggerUtil.info(MessageFormat.format("{0} 取锁超市", Thread.currentThread().getName()));
return new BaseResult<String>().success(MessageFormat.format("{0} 取锁超时", Thread.currentThread().getName()));
}
} catch (InterruptedException e) {
LoggerUtil.error(MessageFormat.format("{0} 系统错误:{1}", Thread.currentThread().getName(), e.getMessage()));
return new BaseResult<String>().fail(MessageFormat.format("{0} 系统错误:{1}", Thread.currentThread().getName(), e.getMessage()));
} finally {
if(rLock.isLocked() && rLock.isHeldByCurrentThread()) {
LoggerUtil.info(MessageFormat.format("{0} 释放锁", Thread.currentThread().getName()));
rLock.unlock();
}
}
}
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/a9767d51e307497cc302f42a7773abe2.png)
红锁
主从模式下,客户端跟多个 Redis 实例请求加锁,只有超过半数的实例加锁成功,才认为成功获取了分布式锁。避免(主节点写入数据成功,在没有将数据复制给从节点时,主节点宕机了,则会造成提升为主节点的从节点中是没有锁信息的,其它线程又可以继续加锁)