千家信息网

对缓存击穿的一点思考

发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,前言缓存(内存 or Memcached or Redis.....)在互联网项目中广泛应用,本篇博客将讨论下缓存击穿这一个话题,涵盖缓存击穿的现象、解决的思路、以及通过代码抽象方式来处理缓存击穿。什
千家信息网最后更新 2026年11月01日对缓存击穿的一点思考

前言

缓存(内存 or Memcached or Redis.....)在互联网项目中广泛应用,本篇博客将讨论下缓存击穿这一个话题,涵盖缓存击穿的现象、解决的思路、以及通过代码抽象方式来处理缓存击穿。

什么是缓存击穿?

上面的代码,是一个典型的写法:当查询的时候,先从Redis集群中取,如果没有,那么再从DB中查询并设置到Redis集群中。

注意,在实际开发中,我们一般在缓存中,存储的数据结构是JSON。(JDK提供的序列化方式效率稍微比JSON序列化低一些;而且JDK序列化非常严格,字段的增减,就很可能导致反序列失败,而JSON这方面兼容性较好)

假设从DB中查询需要2S,那么显然这段时间内过来的请求,在上述的代码下,会全部走DB查询,相当于缓存被直接穿透,这样的现象就称之为"缓存击穿"!

避免缓存击穿的思路分析

加synchronized?

如果synchronized加在方法上,使得查询请求都得排队,本来我们的本意是让并发查询走缓存。也就是现在synchronized的粒度太大了。

缩小synchronized的粒度?

上面代码,在缓存有数据时,让查询缓存的请求不必排队,减小了同步的粒度。但是,仍然没有解决缓存击穿的问题。

虽然,多个查询DB的请求进行排队,但是即便一个DB查询请求完成并设置到缓存中,其他查询DB的请求依然会继续查询DB!

synchronized+双重检查机制

通过synchronized+双重检查机制:

在同步块中,继续判断检查,保证不存在,才去查DB。

代码抽象

发现没有,其实我们处理缓存的代码,除了具体的查询DB逻辑外,其他都是模板化的。下面我们就来抽象下!

一个查询DB的接口:

既然查询具体的DB是由业务来决定的,那么暴露这个接口让业务去实现它。

一个模板:

Spring不是有很多Template类么?我们也可以通过这种思想对代码进行一个抽象,让外界来决定具体的业务实现,而把模板步骤写好。(有点类似AOP的概念)

改进后的代码:

从这里可以看出,我们并不关心缓存的数据从哪里加载,而是交给具体的使用方,而且使用方在使用时再也不必关注缓存击穿的问题,因为我们都给抽象了。

缓存 查询 代码 序列 业务 数据 模板 粒度 检查 思路 接口 方式 机制 现象 问题 集群 同步 处理 也就是 互联网 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 华服互联网科技靠谱吗 新华互联网科技学校 互联网科技公司的优势 互联网为科技 互联网巨头科技公司 互联网科技股票 太原新华互联网科技学校怎么样 汉立互联网科技有限公司联系电话 济南和联互联网科技有限公司 科技赋能互联网健康 宁夏科技产业互联网案例 昭通互联网科技选哪家 洛阳昕诺飞互联网科技有限公司 想开互联网科技公司怎么样 洛阳共同富裕互联网科技有限公司 中天科技中国工业互联网 中国新注册互联网科技 数字互联网科技有限公司 互联网的黑科技实验室 知域互联网科技有限公司官网 深圳九邦互联网科技有限公司 广州大一互联网络科技有限公司 善班互联网科技 世界互联网领先科技成果 亿账通互联网科技 海南科技产业互联网平台 互联网时代的科技公司 浙南科技城互联网大厦招聘 恒生互联网科技趋势 互联网大会出现的黑科技
0