Cachekit工具类使用遇到的问题

1、数据查询并缓存

public List<SysMenu> findListAllMenu() {
    List<SysMenu> menuList = CacheKit.get(CacheConst.cache_menu.getCacheKey(), "findListAllMenu");
    if (menuList.isEmpty()) {
        String sql = "select menu_id, menu_name, menu_url, parent_id, menu_auth from sys_menu order by parent_id asc";
        menuList = menu.find(sql);
        CacheKit.put(CacheConst.cache_menu.getCacheKey(), "findListAllMenu", menuList);
    }
    return menuList;
}

当没有缓存时,debug返回结果显示为

QQ截图20181018110150.png

2、service中对查询结果处理,例如,勾选已选菜单

public List<SysMenu> findAllMenuZtree(String rights) {
    List<SysMenu> allMenus = menuDao.findListAllMenu();
    for (SysMenu m : allMenus) {
        //根节点展开
        if ("0".equals(m.getStr("parent_id"))) {
            m.put("open", true);
        }
        //当前菜单是否勾选
        if (RightsHelper.testRights(rights, m.getStr("menu_id"))) {
            m.put("checked", true);
        }
    }
    return allMenus;
}

问题就出在这里,当没有缓存时返回结果正常,处理之后数据也是正常的。当有缓存时,1步骤方法返回结果为之前已处理过的数据集合,debug结果为:

QQ截图20181018111028.png

一脸懵逼,数据是在处理之前已经缓存了的,处理过后的数据怎么会跑到缓存里面去?求指点一下问题所在。

评论区

JFinal

2018-10-18 11:48

单步调试一定,这类细节问题,很难肉眼看出来

う小橋彎彎╭や殘陽照

2018-10-18 16:34

@JFinal 刚开始,我以为是model的问题,后面新建对象Menu,拷贝查询结果List到List,然后把新对象集合List缓存一下,service层一样的去处理数据,结果还是跟之前一样处理过的数据会自动更新到List缓存里面。感觉就像是查询结果用CacheKit放缓存里,如果数据处理对象内参数值更新了,缓存内的对象参数值也会自动更新。

JFinal

2018-10-18 16:43

@う小橋彎彎╭や殘陽照 原来你说的是这么个问题

这个就是 ehcache 的特点,对象是缓存在内存中的,从缓存中取出数据得到的不是拷贝,而是指向数据本身的指针,改变取出数据的值,就改变了缓存中的值

一般来说,JVM 内存式缓存都是这种工作机制,如果每次从缓存中取数据都要 clone 复制一份出来用的话,性能会急剧下降

热门反馈

扫码入社