首页 > 代码库 > 缓存空对象的使用

缓存空对象的使用

     缓存空对象是一种用空间换其他资源(时间、IO、CPU)的技术,可以有效的防止数据库被击穿,并一度程序上减少恶意攻击(特别是将Cache做到client本地)。
     普通使用缓存的场景是,将请求从数据库中读出数据返回的时候,将读出的正常数据写到缓存。而空缓存的意思是,如果请求在数据库中没有命中,依然在缓存中放入一个空缓存对象,这样的话,以后请求过来时访问缓存就会命中这个空缓存,它也就明白了自己的要查的数据不存在,从而避免访问数据库。
     
普通使用缓存的代码,例:
public class UserManager {
     UserDAO userDAO;
     LocalCache localCache;

     public UserDO getUser(String userNick) {
          UserDO user = (UserDO)localCache.get(userNick);
          if(user == null) {
               user = userDAO.getUser(userNick);
               if(user != null) {
                    localCache.put(userNick,user);
               }
          }
          return user;
     }          
}

使用空缓存对象的示例:
public class NullValueResultDO implements Serializable{
     private static final long serialVersionUID = -6550539547145486005L;
}

public class UserManager {
     UserDAO userDAO;
     LocalCache localCache;

     public UserDO getUser(String userNick) {
          Object object = localCache.get(userNick);
          if(object != null) {
               if(object instanceof NullValueResultDO) {
                    return null;
               }
               return (UserDO)object;
          } else {
               User user = userDAO.getUser(userNick);
               if(user != null) {
                    localCache.put(userNick,user);
               } else {
                    localCache.put(userNick, new NullValueResultDO());
               }
               return user;
          }
     }          
}

     缓存空对象可没想象中的那么尽善尽美,对于大量分散的失效的访问会造成缓存容量的膨胀,这可算是一种内存攻击,即使缓存采用LRU实现,也会挤压其他正常数据的空间,所以对于缓存空对象要慎用。缓存空对象最适用于集中地无效数据高频度访问的状况,这种状况可能最适用于内部服务的应用,这种服务应用的请求无效数据的较少,但频度较高。


缓存空对象的使用