高同時プロジェクトの最適化---redisキャッシュ+ページの静的化


高同時プロジェクトでは,システムの圧力耐性と応答速度を向上させるためにredisキャッシュデータとページ静的化を用いることができ,本論文ではプロジェクト最適化に関するプロセスを記録する.


一、ページキャッシュは汎用ページに対して、一般的にページキャッシュを使用し、ユーザーに返す必要があるページを直接redisに格納し、誰かが再アクセスしたときに直接redisから取り出して直接ユーザーに返し、他の操作を行わず、システム資源を節約する.
  /*      
     * */
    @GetMapping(value = "/product_list",produces = "text/html")
    @ResponseBody
    public String product_list(Model model, User user,
                               HttpServletResponse response,
                               HttpServletRequest request,
                               @RequestParam(value = "pageNo",defaultValue = "1")int pageNo,
                               @RequestParam(value = "pageSize",defaultValue = "6")int pageSize){
                               
        model.addAttribute("user",user);
        PageInfo<ProductVo> page = productService.listProcuctVo(pageNo,pageSize);
        model.addAttribute("pageInfo",page);
        
        //   
        String html = (String) redisService.get("product_list");
        System.out.println(html);
        if(!StringUtils.isEmpty(html)){
            return html;
        }
        
        //    
        IWebContext ctx = new WebContext(request,response,request.getServletContext(),
                request.getLocale(),model.asMap());
        html = thymeleafViewResolver.getTemplateEngine().process("product_list",ctx);
        if(!StringUtils.isEmpty(html)){
            redisService.set_Time("product_list",html,60);
        }
        return html;
    }

二、urlキャッシュurlキャッシュは特殊なページキャッシュである.なぜなら、彼には特殊なパラメータ情報があり、異なるページ、例えば商品の詳細ページに対応するには、urlキャッシュが必要である.異なる商品には異なる情報があるため、ページキャッシュを使用してこの機能を実現することはできない.
/*      
 *  url  
 * */
    @RequestMapping(value = "/product_detail/{productId}",produces = "text/html")
    @ResponseBody
    public String product_detail(Model model, User user,
                                 @PathVariable("productId") long productId,
                                 HttpServletRequest request,
                                 HttpServletResponse response){
       
        //   
        String html = (String) redisService.get("product_detail"+productId);
        if(!StringUtils.isEmpty(html)){
            return html;
        }
        model.addAttribute("user",user);
        ProductVo productVo = productService.selectProductById(productId);
        model.addAttribute("product",productVo);
        long startTime = productVo.getStart_date().getTime();
        long endTime = productVo.getEnd_date().getTime();
        long nowTime = System.currentTimeMillis();

        int miaoshaStatus = 0;
        int remainSeconds = 0;
        if( nowTime < startTime){//     
            miaoshaStatus = 0;
            remainSeconds = (int)((startTime-nowTime)/1000);
        }else if(nowTime > endTime){//    
            miaoshaStatus = 2;
            remainSeconds = -1;
        }else {//    
            miaoshaStatus = 1;
            remainSeconds = 0;
        }
        model.addAttribute("miaoshaStatus",miaoshaStatus);
        model.addAttribute("remainSeconds",remainSeconds);
        
        //    
        IWebContext ctx = new WebContext(request,response,request.getServletContext(),
                request.getLocale(),model.asMap());
        html = thymeleafViewResolver.getTemplateEngine().process("product_detail",ctx);
        if(!StringUtils.isEmpty(html)){
            redisService.set_Time("product_detail"+productId,html,60);
        }
        return html;
    }

三、オブジェクトキャッシュオブジェクトキャッシュはすべてのキャッシュの中で比較的小さいキャッシュ単位であり、最もよく使われるのはユーザーの常用情報のキャッシュであり、システムの常用ユーザー情報の読み取り速度を速め、システムの反応速度を速める.四、ページの静的化ページの静的化も前後の分離の大きな利点であり、ブラウザでデータをキャッシュすることでサーバとのインタラクションを減らすことである.いくつかのフロントエンドのフレームVUE.JSなどはこのような問題をうまく解決するフレームワークですが、真面目に勉強する必要があります.簡単にするために、ここではJQueryのajaxを使って実現します.バックエンドコントロールレイヤ:
@RestController
public class MiaoshaController {

    @Autowired
    ProductService productService;
    @Autowired
    OrderService orderService;
    @Autowired
    MiaoshaService miaoshaService;

    private static Logger logger = Logger.getLogger("MiaoshaController.class");
    @PostMapping(value = "/do_miaosha")
    public ResponseResult domiaosha(Model model, User user,
                                    @RequestParam("productId") long productId){
        if(user == null){
            return ResponseResult.error(ResponseCode.NO_LOGIN);
        }
        //    
        ProductVo productVo = productService.selectProductById(productId);
        if(productVo.getStock_count()<=0){
            return ResponseResult.error(ResponseCode.PRODUCT_MIAOSHA_OVER);
        }
        //        
        MiaoshaOrder miaoshaOrder = orderService.getMiaoshaOrderByUserIdAndProductId(user.getId(),productId);
        if(miaoshaOrder!=null){
            return ResponseResult.error(ResponseCode.MIAOSHA_NO_AGAIN);
        }
        //        -》    -》      
        Order order = miaoshaService.miaosha(user,productVo);
        return ResponseResult.success(order);
    }
}

js:JQueryのajaxでデータを処理し、前後の分離を実現
 function domiaosha() {
        var productId = $("#productId").val();
        $.ajax({
            url: "/do_miaosha",
            type: "POST",
            data:{productId:productId},
            dataType:"json",
            success:function (data) {
                if(data.data != null){
                    window.location.href="/product_miaosha_detail.htm?orderId="+data.data.id;
                }else {
                    alert(data.msg);
                }
            },
            error:function () {
                alert("       !");
            }
        });
    }

五、静的資源最適化(1)JS/CSS圧縮、流量減少(2)複数のJS/CSS組み合わせ、接続数減少(3)CDN近接アクセス