千家信息网

对缓存击穿的一点思考

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

前言

缓存(内存 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安全错误 数据库的锁怎样保障安全 新基宏互联网科技有限公司 任天堂账号与服务器连接断开 有问必答网络安全竞赛 数据库原理与设计 答案 app重签名服务软件开发 湖南省网络技术学院 诺基亚服务器业务 存储服务器怎么看里面硬盘 激战2泰坦之爪服务器怎么样 网络技术最后一个大题 扬州新品服务器厂家直供 广州商速软件开发有限公司 用友不会保存数据库 django如何部署在云服务器 软件开发产品经理 德惠品质网络技术服务诚信经营 服务器网络连接显示黄色惊叹号 吕梁网络技术服务 河北泰始达互联网科技有限公司 网络技术基础第四章答案 我的世界用电脑进入手机的服务器 软件开发项目的解决方案 方寸之间课件软件开发 魔兽世界 人气服务器 数据库cmd怎么输入 数据库死锁例子 msf连接数据库 6g网络安全愿景技术研究报告 工资管理系统数据库总结 pg数据库是关系型数据库吗
0