聚焦Java性能优化 打造亿级流量秒杀系统【学习笔记】06_交易性能优化技术之缓存库存

本章目标

  • 掌握高效交易验证方式
  • 掌握缓存库存模型

7-1 交易性能瓶颈

  • jmeter压测(对活动下单过程进行压测,采用post请求,设置传入参数,性能发现下单avarage大约2s,tps500,交易验证主要完全依赖数据库的操作)
  • 交易验证完全依赖数据库
  • 库存行锁
  • 后置处理逻辑

7-2 交易验证优化

  • 用户风控策略优化:策略缓存模型化

在开始交易后,针对活动实时信息和用户实时信息的验证,目的是为了风控策略,检查用户账号是否异常,是否异地登陆,策略是:通过异步的方式将用户模型写入缓存,与实时信息做一致性检验,做到风控策略

  • 活动校验策略优化:引入活动发布流程,模型缓存化,紧急下线能力

实时活动的缓存存在一个问题:如果后台修改活动信息(修改活动结束时间),但redis的缓存还处于正常有效期,用户依然可以以活动价格秒杀商品,因此需要有紧急下线的能力。对应的策略是:在活动开始前半个小时发布活动,对缓存预热,同时后台设计一个紧急下线的接口,清除redis缓存,那么用户下单时就会去数据库查询活动的最新信息了

Jmeter压测效果:avg:800 吞吐量tps:800左右

7-3 活动缓存库存方案一(重点)

库存行锁优化

首先回顾我们之前减库存的操作:

<update id="decreaseStock">
  update item_stock
  set stock = stock - #{amount}
  where item_id = #{itemId} and stock >= #{amount}
</update>

库存的数量就是stock-amount 条件是商品itemId和stock的大小大于amount,条件是item_id要加上唯一索引,这样查询的时候为数据库加上行锁,否则是数据库表锁

扣减库存缓存化(方案一)

方案是:我们要将扣减库存的操作发生在缓存而不是数据库中,缓存的扣减时间相对较少

首先要:(1)活动发布同时同步库存进缓存

​ (2)下单交易减缓库存

PromoService 接口中添加活动发布接口

 //活动发布
    void publishPromo(Integer promoId);

PromoServiceImpl实现类(默认获取活动id以及商品信息的时候库存不发生变化)

@Override
    public void publishPromo(Integer promoId) {
   
        //通过活动id获取活动
        PromoDO promoDO = promoDOMapper.selectByPrimaryKey(promoId);
        if(promoDO.getItemId()==null || promoDO.getItemId().intValue()==0) {
   
            return;
        }
        ItemModel itemModel = itemService.getItemById(promoDO.getItemId());

        //将库存同步到redis内
        redisTemplate.opsForValue().set("promo_item_stock_"+itemModel.getId(),itemModel.getStock());

    }

前端写发布活动的controller接口

    @RequestMapping(value = "/publishpromo",method = RequestMethod.GET) //浏览时服务端用GET请求
    @ResponseBody
    public CommonReturnType publishpromo(@RequestParam(name = 
  • 6
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值