分布式锁的简单使用

分布式锁的简单使用

在一个关于简单商品库存的需求下,有个逻辑为,假设当某个商品的当前库存小于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("===========> 库存预警结束 <===========");
	}
}

以上就是分布式锁的简单使用了!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值