分布式锁的简单使用
在一个关于简单商品库存的需求下,有个逻辑为,假设当某个商品的当前库存小于100的时候,需要添加一条预警记录通知管理员,但是这个项目在部署的时候会出现多负载部署,假如不加锁的情况下,那么就会出现重复添加预警记录的Bug,最开始想到就是直接在mysql数据层面上面加锁,但是一想,查询商品的时候是全部一起查的,假如对商品数据加锁的话,那么全部的数据都要加,而且还要做释放锁,有些麻烦且不划算,后面想到要不要建一个预警任务的表,在执行预警定时任务的时候,修改预警任务状态(锁)字段,多个同时操作一条数据,只有一个会成功,这个办法是可以的,但是感觉单单为这个建一张表没有意义,后面就想到正好项目中也使用了redis,与其使用mysql行,还不如直接使用redisson分布式锁,下面是简单使用分布式锁的简单代码:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson-spring-boot-starter</artifactId>
<version>3.16.1</version>
</dependency>
@Slf4j
@Configuration
public class StockWarnTask{
@Resource
private StockWarnService stockWarnService;
@Resource
private RedissonClient redissonClient;
@Scheduled(cron = "0 0/20 * * * ?")
public void stockWarn() {
log.info("===========> 库存预警开始 <===========");
// 定义分布式锁的名称
String lockName = "inventoryAlertLock";
// 获取分布式锁
RLock lock = redissonClient.getLock(lockName);
try {
// 尝试获取锁,等待时间为10秒,持有锁的时间为60秒
boolean lockAcquired = lock.tryLock(10, 60, TimeUnit.SECONDS);
log.info("===========> 分布式锁获取结果:{} <===========", lockAcquired);
if (lockAcquired) {
// 获得锁后执行业务逻辑
this.stockWarnService.stockWarn();
} else {
// 未能获得锁
log.info("===========> 分布式锁获取失败 <===========");
}
} catch (Exception e) {
// 中断线程
e.printStackTrace();
log.error("===========> 分布式锁获取异常:{} <===========", e.getMessage());
} finally {
// 释放锁
lock.unlock();
}
log.info("===========> 库存预警结束 <===========");
}
}
以上就是分布式锁的简单使用了!