0
点赞
收藏
分享

微信扫一扫

秒杀系统实现


日志

完成秒杀系统的配置
书写秒杀博客
观看秒杀视频 https://www.bilibili.com/video/BV1CE411s7xN?p=3&spm_id_from=pageDriver
redis 秒杀 做完了
zookeeper 分布式JVM 级别控制不会 🌺 卡在消息队列
消息队列学习完毕 秒杀继续
秒杀具体实现完成

秒杀业务

  • 初始化将库存转载到redis

/**
* 讲所有商品数量缓存到redis
* @param ${tags}
* @return ${return_type}
* @author yantingrui
* @time 2021/8/31 15:02
*/
@PostConstruct
public void init(){
List<AyProduct> all = productService.findAll();
all.forEach(v -> {
stringRedisTemplate.opsForValue().set(v.getId().toString(),v.getNumber().toString());
}
);
}

  • controller 层秒杀

// 内存标记
private static ConcurrentHashMap<Long,Boolean> productSoldOutMap = new ConcurrentHashMap<>();

public static ConcurrentHashMap<Long, Boolean> getProductSoldOutMap() {
return productSoldOutMap;
}

@ResponseBody
@RequestMapping("/{id}/kill")
public String secKill(@PathVariable(name = "id") Long id ){
// 先判断内存标记 可直接掠过商品已售完
if(productSoldOutMap.get(id)){
return "商品已售完";
}
// 商品秒杀递减
Long stock = stringRedisTemplate.opsForValue().decrement(id.toString());
// 如果秒杀完了
if(stock < 0){
// 将商品状态置为售完状态
productSoldOutMap.put(id,true);
// 因为已经秒杀完了 因此需将秒杀的商品加回去
stringRedisTemplate.opsForValue().increment(id.toString());
// 库存更新
// 订单插入
return "商品卖完了";
}
return "下单成功";
}

  • 秒杀消费者

/**
* 消费者
* @author le
* @date 2021/1/30
*/
@Component
public class AyProductKillConsumer {

//日志
Logger logger = LoggerFactory.getLogger(ProductServiceImpl.class);

@Resource
private AyUserKillProductService ayUserKillProductService;

/**
* 消费消息
* @param killProduct
*/
@JmsListener(destination = "ay.queue.asyn.save")
public void receiveQueue(AyUserKillProduct killProduct){
//保存秒杀商品数据
ayUserKillProductService.save(killProduct);
//记录日志
logger.info("ayUserKillProductService save, and killProduct: " + killProduct);
}
}

  • 秒杀生产者

@Service
public class AyProductKillProducer {

//日志
Logger logger = LoggerFactory.getLogger(ProductServiceImpl.class);

@Resource
private JmsMessagingTemplate jmsMessagingTemplate;

/**
* 描述:发送消息
* @param destination 目标地址
* @param killProduct 描述商品
*/
public void sendMessage(Destination destination, final AyUserKillProduct killProduct) {
logger.info("AyProductKillProducer sendMessage , killProduct is" + killProduct);
jmsMessagingTemplate.convertAndSend(destination, killProduct);
}
}

秒杀防护

  • 按钮制禁 防止重复点击
  • url 加密
  • 答题验证码
  • 分时段
  • 降级、限流、拒绝服务

参考内容

​​微信读书​​


举报

相关推荐

0 条评论