• 【项目调优】项目从EhCache缓存变为redis之后,加载菜单变得极其缓慢


    问题重现

    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
  • 相关阅读:
    JSON Web Token
    useReducer的用法
    Capto2024专为Mac电脑设计的屏幕录制和视频编辑软件
    Java工具类--http请求-post
    「学习笔记」基环树
    基于springboot的图片文字识别,支持中英文识别
    基于SSM的网上手机商城
    React-Router(V6版本)
    vue3+elementPlus el-select组件同时支持label和value模糊查询
    从0搭建vue3组件库:Shake抖动组件
  • 原文地址:https://blog.csdn.net/u010978399/article/details/127693873