woxio770 发表于 2017-4-16 07:24:02

使用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接口,所以每次会写入失败。
  
页: [1]
查看完整版本: 使用memcache应该注意的问题