请注意高并发系统下缓存的null导致的系统性能下降

  [文章作者:孙立 链接:http://www.cnblogs.com/sunli/ 更新时间:2010-07-13]

缓存的一般用法

      我们在应用中使用缓存的时候,很可能就是使用的如下代码所表示的逻辑的方式。 先获取缓存中的数据,如果为空

则查询数据库或者其他方式获取数据,然后再存入缓存,返回数据。

 

代码
//代码无法直接执行,只是用来表达逻辑

data
=cache.get(key);
if(data=null || !isValid(data)){
   sql
="SELECT ......";
data
=db.query(sql);
   //data可能为null
if(data){
cache.set(key,data,expire);
}
}
return data;

 

上面的代码很多情况下都运行得非常好,很多人也是这么用的。

问题

     当key的内容在数据库也不存在时,那么上面代码中的data始终为null,缓存中也始终没有数据,如果这个key的请求突然变得很大(很多情况下都会发生,比如一个错误的链接请求不存在的数据),那么将会有大量的请求绕过缓存,直接到了后端数据库,将会造成很大的压力,而又不好分析问题的原因,因为你觉得你已经加了缓存了。

如果数据量比较大,访问也很大,很可能让系统崩溃。

解决

     解决这个问题的办法就是当数据库查询到null时,我们也应该把null进行相应的缓存。

比如数据库返回的是一个list,那么我们可以存入一个空的list来处理cache.set(key,new List(),expire);当然,看情况,也可以有其他方式。

 

posted @ 2010-07-13 09:44 草屋主人 阅读(...) 评论(...) 编辑 收藏