使用redis解决分布式锁的问题
@Service
public class BookService {
@Autowired
private BookMapper bookMapper;
@Autowired
// private Redisson redisson;
private StringRedisTemplate stringRedisTemplate;
public String descCount(Integer bookid){
Boolean flag = stringRedisTemplate.opsForValue().setIfAbsent("bookid::" + bookid, "lipeng", 30, TimeUnit.SECONDS);
if (flag){
try{
Book book = bookMapper.selectById(bookid);
if (book.getCount()>0){
book.setCount(book.getCount()-1);
bookMapper.updateById(book);
System.out.println("库存剩余"+book.getCount());
return "库存减少成功";
}else{
return "库存不足";
}
}catch (Exception e){
throw new RuntimeException(e.getMessage());
}
finally {
stringRedisTemplate.delete("bookid::"+bookid);
}
}else{
System.out.println("服务器正忙请稍后重试");
return "服务器正忙请稍后重试";
}
}
}
使用redisson解决分布式锁问题
1)导入依赖
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson</artifactId>
<version>3.13.4</version>
</dependency>
2)编写配置类
@Bean
public RedissonClient getRedisson(){
Config config=new Config();
config.useSingleServer().setAddress("redis://192.168.31.181:6379");
RedissonClient redissonClient = Redisson.create(config);
return redissonClient;
}
3)编写service类
@Service
public class StockService {
@Resource
private StockDao stockDao;
@Autowired
private RedissonClient redisson;
public String decrStock(Integer productId) {//synchronized () 同步方法 同步代码块
RLock lock = redisson.getLock("product::" + productId);//获取锁对象
try {
lock.tryLock(60,20,TimeUnit.SECONDS); //自己别设置时间。
Stock stock = stockDao.selectById(productId);
if (stock.getNum() > 0) {
//根据id修改库存
stock.setNum(stock.getNum() - 1);
stockDao.updateById(stock); //异常发生
// int c=10/0;
// Thread.sleep(35000);
System.out.println("库存剩余:" + (stock.getNum()));
return "库存减少成功";
} else {
return "库存不足";
}
}catch (Exception e){
throw new RuntimeException(e.getMessage());
}
finally {
lock.unlock();
}
}
}