如何保证缓存与数据库的双写一致性?

2 篇文章 0 订阅
1 篇文章 0 订阅

涉及到缓存和数据库双储存和双写问题一定会遇到数据不一致的问题,那么如何解决呢?
1.如果在数据一致性要求不严格情况下:
可以采用:读请求和写请求串行化,串到一个内存队列里去。
2.数据库一致性要求严格情况下:
常采用:缓存+数据库读写模式,就是 Cache Aside Pattern。
读时,先读缓存,缓存没有的话,就读数据库,然后取出数据后放入缓存,同时返回响应。
更新时,先更新数据库,然后再删除缓存。
3.初级的缓存不一致问题:
先修改数据库,再删除缓存。如果删除缓存失败了,那么会导致数据库中是新数据,缓存中是旧数据,数据就出现了不一致怎么办?
解决思路:先删除缓存,再修改数据库。如果数据库修改失败了,那么数据库中是旧数据,缓存中是空的,那么数据不会不一致。因为读的时候缓存没有,则读数据库中旧数据,然后更新到缓存中。
4.复杂的数据不一致问题分析:
数据变更时,将缓存的数据删除了,然后去修改数据库,此时一个请求去读缓存,缓存为空,请求在去读数据库的数据,放到缓存,然后数据库的数据修改成功后和缓存的数据不一致…只有在对一个数据在并发的进行读写的时候,才可能会出现这种问题
解决方案如下:

更新时,根据数据唯一标识,将操作路由之后,发送到一个 jvm 内部队列中。读取数据的时候,若发现数据不在缓存中,那么将重新读取数据+更新缓存的操作,根据唯一标识路由之后,也发送同一个 jvm 内部队列中。

一个队列对应一个工作线程,每个工作线程串行拿到对应的操作,然后一条一条的执行。这样的话,一个数据变更的操作,先删除缓存,然后再去更新数据库,但是还没完成更新。此时如果一个读请求过来,读到了空的缓存,那么可以先将缓存更新的请求发送到队列中,此时会在队列中积压,然后同步等待缓存更新完成。通过将请求放到对列中起到过滤的作用,

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值