请注意高并发系统下缓存的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
分类:
高性能
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 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,谁才是开发者新宠?