当前位置:网站首页>阿里面试官:给我描述一下缓存击穿的现象,并说说你的解决思路?
阿里面试官:给我描述一下缓存击穿的现象,并说说你的解决思路?
2022-07-30 19:22:00 【nuzzzzz】
前言
缓存(内存 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的概念)
改进后的代码:
从这里可以看出,我们并不关心缓存的数据从哪里加载,而是交给具体的使用方,而且使用方在使用时再也不必关注缓存击穿的问题,因为我们都给抽象了。
边栏推荐
- 牛客刷题系列之进阶版(组队竞赛,排序子序列,倒置字符串, 删除公共字符,修理牧场)
- ImportError: attempted relative import with no known parent package
- MongoDB打破了原则引入SQL?
- 解决终极bug,项目最终能顺利部署上线。
- iPhone真是十三香?两代产品完全对比,或许上一代更值得买
- MindSpore:【模型训练】【mindinsight】timeline的时间和实际用时相差很远
- nlohmann json 使用指南【visual studio 2022】
- Scrapy framework is introduced
- Multiple instances of mysql
- 【Prometheus】Prometheus联邦的一次优化记录[续]
猜你喜欢
Recommendation | People who are kind to you, don't repay them by inviting them to eat
MindSpore:【模型训练】【mindinsight】timeline的时间和实际用时相差很远
LeetCode 0952.按公因数计算最大组件大小:建图 / 并查集
VBA connects Access database and Excel
电脑死机的时候,发生了什么?
云数据库和本地数据库有什么区别?
Win11如何更改默认下载路径?Win11更改默认下载路径的方法
Download Win11 how to change the default path?Download Win11 change the default path method
已删除
【Swords Offer】Swords Offer 17. Print n digits from 1 to the largest
随机推荐
Go 系统收集
谷歌AlphaFold近日宣称预测出地球上几乎所有蛋白质结构
启动前台Activity
Does the satellite phone communicate directly with the satellite or through a ground station?
Zabbix 5.0 Monitoring Tutorial (1)
牛客刷题系列之进阶版(搜索旋转排序数组,链表内指定区间反转)
JS提升:Promise中reject与then之间的关系
MongoDB打破了原则引入SQL?
VBA batch import Excel data into Access database
电脑死机的时候,发生了什么?
跨域问题的解决方法
The 17th "Revitalization Cup" National Youth Vocational Skills Competition - Computer Programmers (Cloud Computing Platform and Operation and Maintenance) Participation Review and Summary
Start background services across processes
【每日一道LeetCode】——191. 位1的个数
ImportError: attempted relative import with no known parent package
SwiftUI iOS Boutique Open Source Project Complete Baked Food Recipe App based on SQLite (tutorial including source code)
055 c# print
【MindSpore1.2.0-rc1产品】num_workers问题
基于inquirer封装一个控制台文件选择器
Start foreground Activity