同時実行性の高いプロジェクトを最適化する方法----- redisキャッシュ+静的ページ

同時実行性の高いプロジェクトの場合、システムの耐圧力と応答速度を向上させるために、redisを使用してデータと静的ページをキャッシュできます。この記事では、プロジェクトの最適化のプロセスを記録します。

1.ページキャッシュ
一般的なページでは、ページキャッシュが一般的に使用され、ユーザーに返す必要のあるページは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;
    }

3.オブジェクトキャッシュ
オブジェクトキャッシュは、すべてのキャッシュの中で比較的小さなキャッシュユニットです。最も一般的に使用されるのは、頻繁に使用されるユーザー情報のキャッシュです。これにより、システムによる一般的なユーザー情報の読み取りが高速化され、システムの応答速度が高速化されます。
第4に、静的ページ静的
ページは、フロントエンドとバックエンドを分離することの大きな利点でもあります。これは、ブラウザーを使用してデータをキャッシュし、サーバーとの対話を減らすことです。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("客户端请求错误!");
            }
        });
    }

5.静的リソースの最適化
(1)JS / CSS圧縮、トラフィックの削減
(2)複数のJS / CSSの組み合わせ、接続数の削減
(3)CDNニアアクセス

おすすめ

転載: blog.csdn.net/Wangdiankun/article/details/106663103