请注意高并发系统下缓存的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);当然,看情况,也可以有其他方式。
新浪微博:http://t.sina.com.cn/sunli1223