zoukankan      html  css  js  c++  java
  • 秒杀项目之细节随笔记录————

    秒杀项目具有很多的重要知识点,本片博客记录在解决秒杀项目中产生的各种问题时,遇到的一些小知识点和问题以及解决方案。

    一、ssm框架中一些注解

      1.@Component

        根据项目中的使用和网上的一些贴子,我个人总结以下内容

          @Component,就是把普通pojo实例化到spring容器中,相当于配置文件中的<bean id="" class=""/>

        如果在项目中遇到需要把一个类实例化注入到spring容器中,但是此类不在一些扫描的包下,比如controller、service,就可以加上次注解,进行注入

        

         此处是秒杀项目中,通过消息中间件获取消息的类GetMessageUtils,它不在被扫描的包下,加上此注解,就可注入spring容器中

      2.@ControllerAdvice

        次注解作用的类是全局捕获异常类,只要作用在@RequestMapping上,所有的异常都会被捕获

        项目中使用了异常捕获返回json给前端的方法,后台报异常,同时返回给前端,本项目中使用了自定义异常,包含各种失败信息,而使用次注解就能捕获所有异常类

        

    二、html页面中获取请求参数的方法

      可以获取当前url中的参数,通过名称即可获取

        function GetQueryString(name){

          var reg = new RegExp("(^|&)"+ name +"=([^&]*)(&|$)");
      var r = window.location.search.substr(1).match(reg);//search,查询?后面的参数,并匹配正则
      if(r!=null)return unescape(r[2]); return null;
      }

      项目使用前后端分离,页面在跳转时带有参数,就可以使用该方法,在获取是调用该方法,直接通过名称课可以获取  

      
    
    

       

     三、倒计时插件countdown的使用

      秒杀项目中会用到倒计时插件,在这里记录一下我使用的倒计时插件以及使用

      引入js:    <script src="http://cdn.bootcss.com/jquery.countdown/2.1.0/jquery.countdown.min.js"></script>

       代码中使用:

    seckillBox.countdown(beginTime, function (event) {    -----------此处beginTime为活动开始时间,从后台获取服务器时间
    //时间格式
    var format = event.strftime('秒杀倒计时: %D天 %H时 %M分 %S秒 ');   ---------------此处初始化倒计时时间格式
    seckillBox.html(format);                    ------------------此处为把此时间格式添加到页面中
    }).on('finish.countdown', function () {              -------------------此处为倒计时插件的倒计时结束后执行方法 ,倒计时结束执行此方法

    seckillStart(itemPromo.id,itemPromo.itemId,token,username);  -----------此处为倒计时结束后执行的方法,可自己根据业务需求编写方法
    });

    四、获取商品详情使用guava cache作为一级缓存,redis作为二级缓存

      在获取商品详情页面中,由于用户数量多,刷新页面频繁,导致访问量大,我们采取redis作为缓存,但是即使如此,访问量也是很大,所以采用guava cache作为一级缓存,缓存到本地,用户访问详情页面,先从本地获取,如果没有,在从redis缓存中获取,如果还没有,则访问数据库,点击此链接获取guava具体使用方法:https://www.cnblogs.com/blogofbin/p/11703685.html

    具体代码:(该方法在service层中实现)

    public ItemPromoDetail getItemById(int itemId) {

    ItemPromoDetail promo = null;
    //因为活动未开始时,用户会一直刷新详情页,所以加一个缓存
    //Guava Cache 做一级缓存,用redis做二级缓存
    //商品详情和库存分别存放

    Object obj = localCacheService.getFromCommonCache("ITEMID:" + itemId);

    if (obj == null) {
    //从redis中获取
    if (jedisClient.exists("ITEMID:"+ itemId )){
    String jsonObj = jedisClient.get("ITEMID:"+itemId);
    promo = JsonUtils.jsonToPojo(jsonObj, ItemPromoDetail.class);
    }else {
    promo = promoMapper.getItemById(itemId);

    //将库存也存放如redis中
    int stockNum = promo.getStock();
    jedisClient.set("ITEM_STOCK:"+itemId,stockNum+"");

    //获取商品时,根据库存可以设置大闸的数量
    jedisClient.set("ITEM_DAZHA:"+itemId,(stockNum*5)+"");

    String json = JsonUtils.objectToJson(promo);
    jedisClient.set("ITEMID:"+itemId, json);

    localCacheService.setCommonCache("ITEMID:"+itemId,promo);
    }
    }else {
    promo = (ItemPromoDetail) obj;
    }

    promo.setStock(Integer.valueOf(jedisClient.get("ITEM_STOCK:"+itemId)));
    return promo;
    }
     
  • 相关阅读:
    Django第一天上课笔记
    easyui-datebox 只能获取当前日期以前的日期
    身份证号码 正则表达式 jquery
    动态修改属性设置 easyUI
    easyUi onLoadSuccess:、onChange这些事件不能嵌套使用!!!!
    jstl无法调用js
    decode
    easyui-panel 滚动条禁用
    js文件引用js文件
    硬编码
  • 原文地址:https://www.cnblogs.com/blogofbin/p/11701147.html
Copyright © 2011-2022 走看看