黑马点评--Redis优化秒杀

Redis优化秒杀

异步秒杀思路:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Xd5i89Jh-1669207961602)(C:\Users\20745\AppData\Roaming\Typora\typora-user-images\image-20221120161810736.png)]

思路,在多线程同时秒杀时,由于判断秒杀库存和校验一人一单用时短,而减库存和创建订单时间耗时长。

所以采用同步思路就浪费时间。如果采用异步思路就能:在redis中判断秒杀库存和校验一人一单,在tomcat中读取队列中的信息对数据库进行操作。在redis返回结果,Tomcat判断生成id并返回。大大提高用户体验。

Redis的操作通过Lua脚本保证原子性

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8xsz5DU9-1669207961604)(C:\Users\20745\AppData\Roaming\Typora\typora-user-images\image-20221120165237766.png)]

改进秒杀业务,提高并发性能:

需求:

新增秒杀优惠券的同时,将优惠券保存到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 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值