当前位置:网站首页>缓存一致性,删除缓存,写入缓存,缓存击穿,缓存穿透,缓存雪崩
缓存一致性,删除缓存,写入缓存,缓存击穿,缓存穿透,缓存雪崩
2022-06-29 11:38:00 【raoxiaoya】
一、DB操作与缓存操作一致性的问题
当你既要更新数据库,又要更新缓存的时候,就涉及到一致性的问题,如何保证两者能同时成功呢?
- 通过消息队列,将对缓存的操作放到队列实现,可以确保其成功。
- 订阅 binlog 日志,需要借助 canal 工具来知道数据库做了哪些操作,然后去操作缓存。
- 通过 dtm 二阶段消息,也可以确保缓存被操作成功。
二、如何删除缓存
1、先删缓存再更新数据库
- 线程A删除缓存,还没来得及更新数据库。
- 线程B进来了,发现缓存没有,读取数据库(此时是旧值),将旧值回填缓存。
- 线程A更新了数据库。
会出现缓存中的数据是旧值。
缓解方法
- 设置简短的过期时间兜底,在这个时间内会出现不一致,缺点是数据库负载会加大。
- 延时双删,线程A删除缓存,更新数据库,sleep一会,再删一次缓存,这个睡眠时间是个问题,所以没办法根治。
- 在应用层引入类似版本的机制,对应用层有要求,通用性受限,不易复用。
2、先更新数据库再删缓存
- 线程A更新了数据库中的值,但还没来得及删除缓存中的值。
- 线程B读取到缓存,此时为旧值。
- 线程A删除缓存。
这种情况总体对业务影响较小。一般在生产环境中,也推荐大家采用该模式。
三、如何写入缓存
线程A发现缓存为空,查询数据库,准备回填缓存的时候发生了阻塞。
线程B发现缓存为空,查询数据库,此时看到的值为新值,因为其他线程修改了数据,回填缓存。
线程A苏醒过来,回填缓存,此时是旧值。
会出现缓存中的数据是旧值。
如果要想解决这种问题,那就只能在读缓存的时候加分布式锁,当然在这个过程中可以做一些优化,具体可以使用 rockscache,它的说明,具体原理图

四、缓存击穿
前面说到,我们应该先更新数据库,再删除缓存,那么对于热点数据,突然把缓存删了会导致缓存击穿,对数据库造成巨大冲击,针对这种情况,我们需要限制最终去到数据库的流量,我们可以在进程内部加锁,也就是单飞模式,这样每个进程只有一个查询数据库的操作,当然如果你的项目服务器很多,那么对数据库的查询也会很多,那么只能使用分布式锁来加以限制。
五、缓存穿透
如果请求的数据在数据库中也不存在,那么为了节省缓存空间一般是不会缓存它的,这就会导致这些请求都会一次次的被打到数据库,这就是缓存穿透。
首先,如果预防住了缓存击穿,那么在一点程度上也减轻了缓存穿透的危害,除此之外,我们还可以引入布隆过滤器将这些恶意的key存起来。
六、缓存雪崩
如果在某一个时刻,缓存大面积同时过期,那么这就是缓存雪崩,预防的方式也很简单,为不同的key设置不同的过期时间,过期时间最好带一个随机数。
边栏推荐
- GBase8s数据库select有ORDER BY 子句1
- Numpy's ndarray array Foundation
- Codeforces Round #803 (Div. 2)
- 高校如何基于云原生构建面向未来的智慧校园?全栈云原生架构VS传统IT架构
- bison使用error死循环的记录
- 龙书虎书鲸书啃不动?试试豆瓣评分9.5的猴书
- Helping the ultimate experience, best practice of volcano engine edge computing
- 智能垃圾桶(四)——树莓派pico实现超声波测距(HC-SR04)
- [pbootcms template] composition website / document download website source code
- ArtBench:第一个类平衡的、高质量的、干净注释的和标准化的艺术品生成数据集
猜你喜欢

The blackened honeysnow ice city wants to grasp the hearts of consumers by marketing?
![[pbootcms模板]作文网站/文档下载网站源码](/img/6e/51bbb4ce961defa4abd098ff3af21f.jpg)
[pbootcms模板]作文网站/文档下载网站源码

揭秘百度智能测试在测试自动执行领域实践

LM07丨细聊期货横截面策略

Embedded database development programming (IV) -- DDL, DML

速看|期待已久的2022年广州助理检测工程师真题解析终于出炉
![Jerry's configuration of TWS cross pairing [chapter]](/img/35/a041093ce3dab8e2739bbc1466ba29.png)
Jerry's configuration of TWS cross pairing [chapter]

黑化的蜜雪冰城,凭营销就想抓牢消费者的心?

参加2022年杭州站Cocos Star Meetings

地球观测卫星数据
随机推荐
智能指标驱动的管理和决策平台 Kyligence Zen 全新上线,限量内测中
ShanDong Multi-University Training #3
求大数的阶乘 ← C语言
Li Kou daily question - day 31 -13 Roman array to integer
地球观测卫星数据
How to obtain method parameter values through WinDbg
钛动科技:我们的 Zadig 落地之路
智能垃圾桶(四)——树莓派pico实现超声波测距(HC-SR04)
Gbase8s database select has order by Clause 6
Gbase8s database for read only clause
Take another picture of cloud redis' improvement path
论文复现——AC-FPN:Attention-guided Context Feature Pyramid Network for Object Detection.
妙!妙盈科技全面实施 Zadig 助力容器化建设,全面拥抱 Kubernetes 和云原生
Gbase8s database into temp clause creates a temporary table to save query results.
Gbase8s database select has order by Clause 5
Gbase8s database select has order by Clause 1
SOFARegistry 源码|数据同步模块解析
oracle 19c : change the user sys/system username pasword under Linux
Gbase8s database for update clause
ERP编制物料清单 金蝶