使用memcache应该注意的问题
Memcached是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提供动态、数据库驱动网站的速度。Memcached基于一个存储键/值对的hashmap。其守护进程(daemon)是用C写的,但是客户端可以用任何语言来编写,并通过memcached协议与守护进程通信。
项目后台系统做权限管理,菜单每次都是动态生成,为了加快访问速度,我将每次查出来的菜单map放入memcached中,但是奇怪的是通过断点我发现每次刷新还是查的数据库,通过仔细排查,我发现每次memcached写入都失败,我写死一个值,就没有问题,于是我就想肯定是我要写入的东西出了问题。
写入的东西是这个,请看代码:
if (result ==null) {
result = invocation.proceed();
this.memCache.put(cacheKey,result, time);
}
简单解释一下,每次判断result是否为null,如果null,则执行invocation.proceed(),等同于正常调用,相当于走如下方法:
public Map<Menu,List<Menu>> getMenuMapByRoleId(Integer roleId) {
Map<Menu, List<Menu>> map=newLinkedHashMap<Menu, List<Menu>>() ;
List<Menu> list=menuDAO.getMenuListByRoleId(roleId,0);
for(Menu menu:list){
List<Menu> secondMenuList=menuDAO.getMenuListByRoleId(roleId,menu.getId());
map.put(menu, secondMenuList);
}
return map;
}
其实每次放入memcached中的值是Map<Menu,List<Menu>>,这个东西为什么每次都写入失败,经过排查,才发现memcached
中写入的数据必须是可序列化的,而Menu实体我却忘记实现了Serializable接口,所以每次会写入失败。