缓存与数据一致性问题

1、更新了数据库,再更新缓存

假设数据库更新成功,缓存更新失败,在缓存失效和过期的时候,读取到的都是老数据缓存。

2、更新缓存,更新数据库

缓存更新成功了,数据库更新失败,是不是读取的缓存的都是错误的。

以上两种,全都不推荐。

3、先删除缓存,再更新数据库

有一定的使用量。即使数据库更新失败。缓存也可以会刷。

存在的问题是什么?

高并发情况下!!

比如说有两个线程,一个是 A 线程,一个是 B 线程。

A 线程把数据删了,正在更新数据库,这个时候 B 线程来了,发现缓存没了,又查数据,又放入缓存。缓存里面存的就一直是老数据了。

延迟双删。更新完数据库之后,我再删一次。

扩展思路

1、消息队列补偿

删除失败的缓存,作为消息打入 mq,mq 消费者进行监听,再次进行重试刷缓存。

2、canal

监听数据库的变化,做一个公共服务,专门来对接缓存刷新。优点业务解耦,业务太多冗余代码复杂度。

相关推荐
打工的小王6 小时前
redis(四)搭建哨兵模式:一主二从三哨兵
数据库·redis·缓存
春生野草9 小时前
Redis
数据库·redis·缓存
万象.12 小时前
redis持久化:AOF和RDB
数据库·redis·缓存
cheungxiongwei.com12 小时前
深入解析 DNS 缓存与 TTL:工作原理、修改生效机制与优化策略
缓存
!chen12 小时前
Redis快速实现布隆过滤器
数据库·redis·缓存
xxxmine14 小时前
Redis 持久化详解:RDB、AOF 与混合模式
数据库·redis·缓存
what丶k15 小时前
SpringBoot3 缓存抽象深度实践:Caffeine+Redis多级缓存,穿透/雪崩/击穿防御全方案
数据库·redis·缓存
咖啡の猫15 小时前
Redis简单介绍
数据库·redis·缓存
爱吃大芒果15 小时前
Flutter for OpenHarmony 实战: mango_shop 购物车模块的状态同步与本地缓存处理
flutter·缓存·dart
源代码•宸16 小时前
Redis 攻略(Redis Object)
数据库·redis·后端·缓存·字符串·哈希表·type