EhCache 是一个纯Java的进程内缓存框架,具有快速、精干等特点,是Hibernate中默认的CacheProvider。
项目没有加上redis之前,加载菜单没有任何问题,但是加上redis进行缓存之后,加载菜单变得极其缓慢
jsp页面有什么特点呢,他不是一个静态的界面。
这种类似的对象模式的获取后台值,其实都是相当于实时的拼接这个jsp界面,所以这个界面虽然看起来好像是在加载,但是其实,一直都是在走后台
for循环所有的菜单,然后在每一个菜单上调用page.visiblePortletEntities,判断这个菜单是否是可以展示的
有人就会问了,为什么从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;
}