前言在实际的项目开发中,为了提高响应的速度,通常都会将热点的数据保存到缓存中,减少数据库的查询,有效提高服务端的响应速度,但是添加缓存之后也引入缓存与数据库的一致性问题,本文将详细的讲解如何保证数据库与缓存的一致性 。
缓存使用策略在使用缓存时,通常的缓存册率有如下几种:
- Cache-Aside Pattern(旁路缓存,业务系统常用)
- Read-Through Pattern
- Write-Through Pattern
- Write-Behind Pattern
读缓存
文章插图
说明:
- 应用程序需要从数据库读取数据时,先检查缓存数据是否命中 。
- 如果缓存未命中,则查询数据库获取数据,同时将数据写到缓存中,以便后续读取相同数据会命中缓存,最后再把数据返回给调用者 。
- 如果缓存命中,直接返回调用者 。
文章插图
写缓存的流程就比较简单,先更新数据库中的数据,然后删除旧的缓存即可 。
Cache-Aside Pattern 一致性问题场景分析【如何保证数据库与缓存数据一致性?】实际的项目中运用最多的为Cache-Aside Pattern(旁路缓存)模式,在此策略下客户端先读取缓存,如果命中则返回,如果没有命中,则查询数据库并发数据写入缓存,由于数据库和缓存都需要进行修改,在高并发的场景下,可能会导致数据不一致,针对数据不一致的场景,提供了四种更新方案具体如下:
- 先更新缓存,再更新数据库 。
- 先更新数据库,再更新缓存 。
- 先删除缓存,再更新数据库 。
- 先更新数据库,再删除缓存 。
先更新缓存,再更新数据库 。
文章插图
流程说明: 线程1:先更新缓存成功,但是网络原因写数据库失败,就会导致缓存是最新数据,而数据库的数据为旧数据,那缓存就是脏数据,线程2:读取缓存中数据,而这个数据数据库中却不存在,数据库都不存在的数据,缓存并返回客户端就毫无意义了 。
此方案在实际生产中不建议采用 。
先更新数据库,再更新缓存 。
文章插图
流程说明:
- 线程1先更新数据库成功,但是由于网络卡顿更新缓存失败,从而导致缓存中的数据为旧数据
- 线程2从缓存中读取数据,缓存中的数据为旧数,从而导致数据库与缓存数据不一致 。
先删除缓存,再更新数据库 。
文章插图
流程说明:
- 线程1,先删除缓存成功,但是由于网络卡顿原因,更新数据库异常 。
- 线程2,读取缓存由于缓存数据为空,则会查询数据库中的数据,查询成功并写入缓存,从而导致数据不一致 。
先更新数据库,再删除缓存 。
推荐阅读
- 2022 年了,MPP 还是当今数据库主流架构吗?
- mysql服务如何查看是否启动?
- |职场人该如何提高自己的能力?
- 三四十岁如何摆脱“大妈”标签?学习日杂的穿衣搭配,高级有品味
- 如何知道自己有月子病
- 交警指导您如何正确规范停车 如何停车
- 如何选择合适自己的养发馆加盟品牌 养发馆加盟连锁
- |你该如何调动其他同事来提拔你或者提拔别人?
- 进口保健品如何选择 进口保健品排行榜
- 怎么鉴别和避开地沟油 如何辨别地沟油