使用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接口,所以每次会写入失败。

使用memcache应该注意的问题

相关推荐