请注意高并发系统下缓存的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 @   草屋主人  阅读(4490)  评论(21编辑  收藏  举报
编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· 展开说说关于C#中ORM框架的用法!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
点击右上角即可分享
微信分享提示