高并发优化秒杀

一、页面缓存+URL缓存+对象缓存
1.页面缓存
(1)取缓存
(2)手动渲染模板存入缓存
(3)结果输出

@RequestMapping(value = "/to_list",produces ="text/html")
    @ApiOperation(value = "显示商品列表",httpMethod = "GET")
    @ApiResponses(value ={
   
            @ApiResponse(code = 500216,message = "参数校验异常"),
            @ApiResponse(code = 5,message = "服务端异常"),
            @ApiResponse(code = 500210,message = "session不存在或已经失效"),
            @ApiResponse(code = 0,message = "success"),
    })
    @ResponseBody
    public String list(@ApiParam(value = "存储用户信息,以及将数据返回前端",required = true)HttpServletRequest request,HttpServletResponse response, Model model, MiaoshaUser user) {
   
        model.addAttribute("user", user);
        //查询商品列表
        List<GoodsVo> goodsList = goodsService.listGoodVo();
        model.addAttribute("goodsList", goodsList);
//        return "goods_list";
        //取缓存
        String html = redisSevice.get(GoodsKey.getGoodsList, "", String.class);
        if (!StringUtils.isEmpty(html)) {
   
            return html;
        }
        WebContext ctx=new WebContext(request,response,request.getServletContext(),request.getLocale(),model.asMap());
        //手动渲染
        html = thymeleafViewResolver.getTemplateEngine().process("goods_list",ctx);
        if(StringUtils.isEmpty(html)){
   
            redisSevice.set(GoodsKey.getGoodsList,"",html);
        }
        return html;
    }

2.URL缓存

@RequestMapping(value="/to_detail/{goodsId}",produces="text/html")
    @ResponseBody
    //@ApiImplicitParam(name = "goodsId", value = "商品ID", paramType = "path", required = true, dataType = "long")
    public String detai2(HttpServletRequest request, HttpServletResponse response, Model model, MiaoshaUser user,
                         @PathVariable("goodsId")long goodsId){
   


        //showflake  
        model.addAttribute("user",user);


        //取缓存
        String html = redisService.get(GoodsKey.getGoodsDetail, ""+goodsId, String.class);
        if(!StringUtils.isEmpty(html)) {
   
            return html;
        }

        //手动渲染
        GoodsVo goods = goodsService.getGoodsVoByGoodsId(goodsId);
        //System.out.println(goods.toString());
        model.addAttribute("goods",goods);
        
        //
        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;
        }
        //秒杀状态
        model.addAttribute("miaoshaStatus", miaoshaStatus);
        //秒杀倒计时
        model.addAttribute("remainSeconds", remainSeconds);
        //return "goods_detail";

        //手动渲染
        IWebContext ctx =new WebContext(request,response,
                request.getServletContext(),request.getLocale(),model.asMap());
        html = thymeleafViewResolver.getTemplateEngine().process("goods_detail", ctx);
        if(!StringUtils.isEmpty(html)) {
   
            redisService.set(GoodsKey.getGoodsDetail, ""+goodsId, html);
        }
        return html;
    }

3.对象缓存

public MiaoshaUser getById(long id){
   
        //取缓存
        MiaoshaUser user = redisService.get(MiaoshaUserKey.getById, ""+id, MiaoshaUser.class);
        if(user != null) {
   
            return user;
        }
        //取数据库
        user = miaoshaUserDao.getById(id);
        //加缓存
        if(user != null) {
   
            redisService.set(MiaoshaUserKey.getById, ""+id, user);
        }
        return user;
    }

    // http://blog.csdn.net/tTU1EvLDeLFq5btqiK/article/details/78693323
    public boolean updatePassword(String token, long id, String formPass) {
   
        //取user
        MiaoshaUser user = getById(id);
        if(user == null) {
   
            throw new GlobalException(CodeMsg.MOBILE_NOT_EXIST);
        }
        //更新数据库
        MiaoshaUser toBeUpdate = new MiaoshaUser();
        toBeUpdate.setId(id);
        toBeUpdate.setPassword(MD5Util.formPassToDBPass(formPass, user.getSalt()));
        miaoshaUserDao.update(toBeUpdate);
        //处理缓存
        redisService.delete(MiaoshaUserKey.getById, ""+id);
        user.setPassword(toBeUpdate.getPassword());
        redisService.set(MiaoshaUserKey.token, token, user);
        return true;
    }

二、页面静态化

使用html和ajax,把html页面缓存到浏览器,用ajax获取数据,从而来提高性能

GoodsDetailVo:

public class GoodsDetailVo {
   

    private int miaoshaStatus = 0;
    private int remainSeconds = 0;
    private GoodsVo goods ;
    private MiaoshaUser user;
    public int getMiaoshaStatus() {
   
        return miaoshaStatus;
    }
    public void setMiaoshaStatus(int miaoshaStatus) {
   
        this.miaoshaStatus = miaoshaStatus;
    }
    public int getRemainSeconds() {
   
        return remainSeconds;
    }
    public void setRemainSeconds(int remainSeconds) {
   
        this.remainSeconds = remainSeconds;
    }
    public GoodsVo getGoods() {
   
        return goods;
    }
    public void setGoods(GoodsVo goods) {
   
        this.goods = goods;
    }
    public MiaoshaUser getUser() {
   
        return user;
    }
    public void setUser(MiaoshaUser user)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值