字节面试官:高并发场景下,如何保证缓存与数据库一致性?

问题分析

我们日常开发中,对于缓存用的最多的场景就像下图一样,可能仅仅是对数据进行缓存,减轻数据库压力,缩短接口响应时间。

这种方案在不需要考虑高并发得去写缓存,高并发得读写缓存时,是不会有问题,但是如果是在高并发场景下,要保证缓存和数据库的一致性,至少需要解决以下问题:

高并发写时的数据不一致问题

高并发读写时,请求执行各步骤的顺序是不可控的。假设此时有一个请求 A,B 都在在执行写流程,请求 A 是需要将某个数据改成 1,请求 B 是需要将某个数据改为 2,执行操作如下时就会导致数据不一致的问题:

1.请求 A 执行操作 1.1 删除缓存。

2.请求 A 执行操作 1.2 更新数据库,将值改为 1。

3.请求 B 执行操作 1.1 删除缓存。

4.请求 B 执行操作 1.2 更新数据库,将值改为 2

5.假设说请求 B 所在服务器网络延迟比较低,请求 B 先更新缓存,此时缓存中的 key 对应的 value 是 2。

6.请求 A 更新缓存,将缓存中 B 更新的数据进行覆盖,将 key 对应的值改为 1。

此时数据库中是 B 修改后的数据,值为 2,而缓存中的数据是 1,这样在缓存过期钱,用户读到的都是脏数据,与数据库不一致。

高并发读写时的数据不一致的问题

高并发读写时,请求执行各步骤的顺序是不

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值