模拟场景
1. redis放入库存数据
2. 修改StockService
@Service
public class StockService {
@Autowired
private StockMapper stockMapper;
@Autowired
private StringRedisTemplate redisTemplate;
public void deduct() {
// 1。 查询库存
String stockStr = redisTemplate.opsForValue().get("stock");
if (StringUtil.isNullOrEmpty(stockStr)) {
return;
}
int stock = Integer.parseInt(stockStr);
// 2。 判断条件是否满足
if (stock > 0) {
// 3 更新redis
redisTemplate.opsForValue().set("stock", String.valueOf(stock - 1));
}
}
}
3. 测试
吞吐量很高,达到了550,这就是redis的魅力。
redis中数据并未清0,发生了超卖。
JVM本地锁解决
类似之前mysql中的解决方案,直接用ReentrantLock或synchronized
这里就简单在方法中加入synchronized进行测试。
吞吐量大大降低,只有16
成功清0,问题解决。