在网上看到一次使用redis当分布式锁的文章,我就自己写了个demo
前置条件:建议新建一个springboot工程(添加web依赖),然后自行整合mybatisplus、redis,可以参照以下链接:
mybatisPlus:https://blog.csdn.net/wang20000102/article/details/132615071
redis:https://blog.csdn.net/lwj_07/article/details/126265935。就只需要引入依赖和添加redis配置
核心代码如下:
controller层
service
serviceImpl
@Override
@Transactional
public void testConcurrent() {
//使用redis实现分布式锁setnx
String CHANGE_DEMO = "change_demo";
Boolean flag = redisTemplate.opsForValue().setIfAbsent(CHANGE_DEMO, Thread.currentThread().getId(), 5, TimeUnit.SECONDS);
//如果拿到了锁,执行业务逻辑
if (flag) {
try {
log.info("线程{}拿到锁,开始执行业务逻辑",Thread.currentThread().getId());
Device device = deviceMapper.selectById(3);
//锁过期时间是5秒 这里我让线程休眠5s 那键值肯定就是过期了 看看有什么问题
//Thread.sleep(6000);
if (device.getSortNum() > 0) {
log.info("当前库存是:{}", device.getSortNum());
int i = device.getSortNum() - 1;
device.setSortNum(i);
Integer integer = deviceMapper.updateById(device);
Device select = deviceMapper.selectById(3);
log.info("线程{}抢到商品,当前减后库存是:{}", Thread.currentThread().getId(), select.getSortNum());
}
}catch (Exception e){
log.info("扣除库存中出现异常",e);
}finally {
//谁加锁 谁解锁
if (Objects.equals(redisTemplate.opsForValue().get(CHANGE_DEMO),Thread.currentThread().getId())){
redisTemplate.delete(CHANGE_DEMO);
log.info("线程{}解锁成功",Thread.currentThread().getId());
}
}
}
}
配置文件application.yaml
数据库表:
参照如下链接:https://blog.csdn.net/weixin_44130574/article/details/125678000
注:不是抄袭,我只是把代码自行实现下,我觉得作者写的很好。如有侵权,联系我删除文章。
标签:info,currentThread,Thread,记录,Redis,redis,log,device,分布式 From: https://www.cnblogs.com/qwg-/p/17979992