Redis优化秒杀
异步秒杀思路:
思路,在多线程同时秒杀时,由于判断秒杀库存和校验一人一单用时短,而减库存和创建订单时间耗时长。
所以采用同步思路就浪费时间。如果采用异步思路就能:在redis中判断秒杀库存和校验一人一单,在tomcat中读取队列中的信息对数据库进行操作。在redis返回结果,Tomcat判断生成id并返回。大大提高用户体验。
Redis的操作通过Lua脚本保证原子性
改进秒杀业务,提高并发性能:
需求:
新增秒杀优惠券的同时,将优惠券保存到Redis中
public void addSeckillVoucher(Voucher voucher) {
// 保存优惠券
save(voucher);
// 保存秒杀信息
SeckillVoucher seckillVoucher = new SeckillVoucher();
seckillVoucher.setVoucherId(voucher.getId());
seckillVoucher.setStock(voucher.getStock());
seckillVoucher.setBeginTime(voucher.getBeginTime());
seckillVoucher.setEndTime(voucher.getEndTime());
seckillVoucherService.save(seckillVoucher);
//保存秒杀库存到Redis中
stringRedisTemplate.opsForValue().set( SECKILL_STOCK_KEY + voucher.getId(),voucher.getStock().toString());
}
基于Lua脚本,判断秒杀库存,一人一单,决定用户是否抢购成功,
如果抢购成功,将优惠劵id和用户id封装后存入阻塞队列
**基于Redis完成秒杀资格判断:**
//执行lua脚本
private static final DefaultRedisScript<Long> SECKILL_SCRIPT