码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 【项目调优】项目从EhCache缓存变为redis之后,加载菜单变得极其缓慢


    项目调优

    • 问题重现
      • 1、原本用的缓存机制EhCache
      • 2、换成redis之后有问题
    • 问题所在
      • 1、前端的页面为JSP页面
      • 2、JSP页面里面的【对象.属性】,也有可能是【对象.方法】
        • page.visiblePortletEntities方法在哪里呢
        • 在哪里请求的EhCache/redis(请求了400多次啊!)
    • 问题怎么解决
    • 代码实现

    问题重现

    1、原本用的缓存机制EhCache

    EhCache 是一个纯Java的进程内缓存框架,具有快速、精干等特点,是Hibernate中默认的CacheProvider。

    2、换成redis之后有问题

    项目没有加上redis之前,加载菜单没有任何问题,但是加上redis进行缓存之后,加载菜单变得极其缓慢

    问题所在

    1、前端的页面为JSP页面

    jsp页面有什么特点呢,他不是一个静态的界面。
    在这里插入图片描述
    这种类似的对象模式的获取后台值,其实都是相当于实时的拼接这个jsp界面,所以这个界面虽然看起来好像是在加载,但是其实,一直都是在走后台

    2、JSP页面里面的【对象.属性】,也有可能是【对象.方法】

    for循环所有的菜单,然后在每一个菜单上调用page.visiblePortletEntities,判断这个菜单是否是可以展示的
    在这里插入图片描述

    page.visiblePortletEntities方法在哪里呢

    在这里插入图片描述

    在哪里请求的EhCache/redis(请求了400多次啊!)

    有人就会问了,为什么从EhCache(java内存)里面拿的时候快啊,因为是内部的啊!!!!是redis的几千倍几万倍!!!!!
    这就是为什么换了redis方式之后变卡了!!!!【其实redis已经很快了,毫秒级别,但是架不住次数多啊,400多个菜单就要循环400多次,一加起来就可能是40s甚至更多】
    在这里插入图片描述

    问题怎么解决

    既然问题已经找到了,那就解决掉这个方法就好了!!!
    1、不每一次去调用方法去判别
    2、在对象page,里面设置一个属性userOrNot,判断当前这个菜单是否展示
    3、在加载页面之前,先给每个page的userOrNot属性塞值true【展示】,false【不展示】

    代码实现

    逻辑:一级菜单,二级菜单,三级菜单
    只要三级菜单有权限,那么二级和一级菜单都需要展示
    所以递归:setUserOrNot 方法的结果为true,就说明上级也需要 pg.setUserOrNot(true) 从而实现所有有权限的菜单进行展示

    public boolean setUserOrNot(List<Page> pages,List<String> a ){
    		boolean trueOrFalse = false;
    		for(Page pg :pages){
    			Collection<String> portletEntities = pg.getPortletEntities();
    			Iterator<String> iterable = portletEntities.iterator();
    			while(iterable.hasNext()) {
    				String entitieString = iterable.next();
    				String[] entitys = entitieString.split("\\.");
    				if(entitys!=null&&entitys.length>1){
    					String entityCode = entitys[1];
    					String entityCodes[] = entityCode.split("!");
    					if(entityCodes!=null){
    						if(a.contains(entityCodes[0])){
    							pg.setUserOrNot(true);
    							trueOrFalse = true;
    					        break;
    						}
    					}
    				}
    			}
    			List<Page> childPages = pg.getPages();
    			if(childPages!=null&&childPages.size()>0){
    				if(setUserOrNot(childPages,a)){
    					pg.setUserOrNot(true);
    					trueOrFalse = true;
    				}
    			}
    		}
    		return trueOrFalse;
    	}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
  • 相关阅读:
    MetaFormer-3
    卷积神经网络(VGG-16)海贼王人物识别
    Linux用户空间与内核空间(理解高端内存)
    猿创征文|工具百宝箱-数据库连接工具-接口调试与测试工具-抓包工具
    springmvc国际化
    一本通1075;药房管理
    Python&C++相互混合调用编程全面实战-25基于ffmpeg扩展库示例环境项目创建和调用
    Flutter 小技巧之 3.16 升级最坑 M3 默认适配技巧
    Java开发全终端实战租房项目-开发GraphQL服务以及前台系统搭建
    Databend 开源周报 #69
  • 原文地址:https://blog.csdn.net/u010978399/article/details/127693873
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号