缓存与数据一致性问题

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

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

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

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

以上两种,全都不推荐。

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

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

存在的问题是什么?

高并发情况下!!

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

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

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

扩展思路

1、消息队列补偿

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

2、canal

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

相关推荐
熊猫钓鱼>_>14 小时前
Redis 突发缓存穿透:一次完整的定位复盘
数据库·人工智能·redis·缓存·ai·agent·智能
~kiss~1 天前
大模型的缓存
缓存
刘小八1 天前
Redis 缓存一致性:一文讲透延时双删原理、并发时序
java·数据库·redis·缓存
数行拙笔1 天前
Redis---zset类型
数据库·redis·缓存
足球中国2 天前
nuget把缓存搬离C盘
c语言·windows·缓存
Wang's Blog2 天前
Go-Zero项目开发5: 数据库与缓存一致性问题及 go-zero 缓存机制解析
数据库·缓存·golang
蚰蜒螟2 天前
从 Jedis 到内核:深入剖析 Redis BRPOP 的阻塞与唤醒机制
数据库·redis·缓存
后端观测站2 天前
第八篇:Redis 为什么不会每次修改都写磁盘?
数据库·redis·缓存
Lucis__2 天前
基于Cache替换算法的LRU缓存实现
数据结构·c++·算法·缓存·lru
辞旧 lekkk2 天前
【Redis初阶】常见数据类型
开发语言·数据库·c++·redis·学习·缓存·bootstrap