示例程序
模拟电影票售票过程,票售出时该服务被调用,库存中票数减一。
@RestController
public class RedisDemoController {
@Autowired
private StringRedisTemplate stringRedisTemplate;
@GetMapping("/stock")
public String demo01(){
int stock = Integer.parseInt(stringRedisTemplate.opsForValue().get("stock"));
if (stock>0){
int realStock=stock-1;
stringRedisTemplate.opsForValue().set("stock",realStock+"");
System.out.println("库存扣减成功,当前库存:"+realStock);
}else {
System.out.println("库存扣减失败,库存不足!");
}
return "end";
}
}
存在问题:当电影院推出电影票秒杀活动,同一时间多个请求进来,会导致超卖现象。
解决如下:
加上synchronized关键字,给可能出现并发问题的代码块加锁,当一个请求进来时,其他请求等待直到锁释放。
synchronized (this) {
if (stock > 0) {
int realStock = stock - 1;
stringRedisTemplate