日志
完成秒杀系统的配置
书写秒杀博客
观看秒杀视频 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 加密
- 答题验证码
- 分时段
- 降级、限流、拒绝服务
参考内容
微信读书