如何进行优化的秒杀

一:为何要进行优化

因为并发的瓶颈在数据库,在优化前我们是对数据库直接进行操作,一旦有多人同时访问,对数据库的优化就会十分缓慢,为了防止、减少这种情况的发生,可以将数据放入到缓存中,即每次查询数据都是先经过缓存,缓存中没有数据的话再对数据库进行操作,这样可以大大提高对数据处理的效率。

二:优化

1.页面缓存
    @RequestMapping(value = "/to_list", produces = "text/html")
    @ResponseBody
    public String list(HttpServletRequest request, HttpServletResponse response, Model model, MiaoshaUser user){
        model.addAttribute("user", user);
        //取缓存
        String html = myRedisUtil.get(GoodsKey.getGoodsList, "", String.class);
        if (!StringUtils.isEmpty(html)){
            return html;
        }
        //查询商品列表,包括商品和秒杀商品
        List<GoodsVo> goodsList = goodsService.listGoodsVo();
        model.addAttribute("goodsList", goodsList);     //放到Model中,供前端展示使用。
//        return "goods_list";
        //手动渲染
        IWebContext ctx =new WebContext(request,response,
                request.getServletContext(),request.getLocale(),model.asMap());

        html = thymeleafViewResolver.getTemplateEngine().process("goods_list", ctx);
        if (!StringUtils.isEmpty(html)){
            myRedisUtil.set(GoodsKey.getGoodsList, "", html);
        }
        return html;
    }
2.对象缓存
public MiaoshaUser getById(long id){
     //取缓存
     MiaoshaUser miaoshaUser = myRedisUtil.get(MiaoshaUserKey.getById, ""+id, MiaoshaUser.class);
     if (miaoshaUser != null){
         return miaoshaUser;
     }
     //取数据库
     miaoshaUser = miaoshaUserMapper.getById(id);
     if (miaoshaUser != null){
         myRedisUtil.set(MiaoshaUserKey.getById, ""+id, miaoshaUser);
     }
     return miaoshaUser;
 }



 public boolean updatePassword(String token, long id, String formPass){
     //取user
     MiaoshaUser miaoshaUser = getById(id);
     if (miaoshaUser == null){
         throw new GlobalException(CodeMsg.MOBILE_NOT_EXIST);
     }
     //更新数据库
     MiaoshaUser toBeUpdate = new MiaoshaUser();
     toBeUpdate.setId(id);
     toBeUpdate.setPassword(MD5Util.formPassToDBPass(formPass, miaoshaUser.getSalt()));
     miaoshaUserMapper.update(toBeUpdate);
     //处理缓存
     myRedisUtil.delete(MiaoshaUserKey.getById, ""+id);
     miaoshaUser.setPassword(toBeUpdate.getPassword());
     myRedisUtil.set(MiaoshaUserKey.token, token, miaoshaUser);
     return true;
 }
3.页面静态化
1)商品详情静态化
@RequestMapping(value = "/detail/{goodsId}")
    @ResponseBody
    public Result<GoodsDetailVo> detail(HttpServletRequest request, HttpServletResponse response, Model model, MiaoshaUser user, @PathVariable("goodsId") long goodsId) {
        GoodsVo goods = goodsService.getGoodsVoByGoodsId(goodsId);

        long startAt = goods.getStartDate().getTime();  //转化为毫秒
        long endAt = goods.getEndDate().getTime();
        long now = System.currentTimeMillis();

        int miaoshaStatus = 0;  //秒杀状态
        int remainSeconds = 0;  //距离开始秒杀还有多久

        if (now < startAt){     //秒杀还没开始,倒计时
            miaoshaStatus = 0;
            remainSeconds = (int)((startAt - now)/1000);
        }else if (now > endAt){ //秒杀已结束
            miaoshaStatus = 2;
            remainSeconds = -1;
        }else {                 //秒杀进行中
            miaoshaStatus = 1;
            remainSeconds = 0;
        }
        GoodsDetailVo goodsDetailVo = new GoodsDetailVo();
        goodsDetailVo.setGoodsVo(goods);
        goodsDetailVo.setMiaoshaUser(user);
        goodsDetailVo.setMiaoshaStatus(miaoshaStatus);
        goodsDetailVo.setRemainSeconds(remainSeconds);
        return Result.success(goodsDetailVo);
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值