本文主要是利用springboot,實現一個單機版秒殺demo,通過單機版實現,可以對基本併發秒殺的知識有一定的瞭解。
首先先提供秒殺業務實現類:
/**
* spring 註解加在實現類
*/
@Service
@Transactional
public class OrderServiceImpl implements OrderService {
@Autowired
private StockMapper stockMapper;
@Autowired
private StockOrderMapper orderMapper;
@Autowired
private StringRedisTemplate redisTemplate;
//方法用synchronized修飾,單機應用增加悲觀鎖
//注意,與@Transactional一起使用是,不會生效,如要要使用的話在調用該方法的地方使用synchronized代碼塊
//原因:Transactional事務是在鎖之前開始的,事務範圍廣,當一個線程鎖釋放了,但是事務還沒提交,當下個線程過來是,一起提交上一次事務
//一般不建議使用,線程會單個使用,降低效率,並且不要在業務代碼增加synchronized
@Override
public int kill(Integer id) {
//加入redis緩存限時搶購,即使獲得令牌如果不在活動時間內也是無法搶購
//校驗redis中秒殺商品是否結束
if (!redisTemplate.hasKey("kill"+id)) {
throw new RuntimeException("當前商品的搶購活動已經結束啦!");
}
//校驗庫存
StockDO stockDO = checkStock(id);
//扣減庫存
updateStock(stockDO);
//創建訂單