依赖
<!-- 使用redisson作为分布式锁 --> <dependency> <groupId>org.redisson</groupId> <artifactId>redisson-spring-boot-starter</artifactId> <version>3.16.2</version> </dependency>
//做缓存 获取业务间 boxResservation+餐别id+包厢id
RLock lock = redissonClient.getLock("这里是业务键");
try{
// 60 秒
boolean isLocked = lock.tryLock(60, TimeUnit.SECONDS);
log.info("isLocked:{}", isLocked);
if (isLocked) {
//这里开始上锁(里面写需要上锁的业务逻辑)
//进入返回成功信息
return 1;
}
} catch (Exception e) {
throw new RuntimeException(e);
}finally {
if (lock.isHeldByCurrentThread()) {
lock.unlock();
}
}
//没有进入返回失败信息
return -1;
理解:redisson是基于redis集成Netty框架。 这里的锁原理是把业务键存入redis中。
tryLock方法给过期时间(避免死锁、符合业务),并发业务进入时通过业务建查询redis是否存在。存在则表示有线程在操作同一条是数据。则进行锁操作 源码解析:如果在等待的时间内是空闲的,则获取锁。如果锁是可用的则返回true。如果锁不可用的则返回false