Redis 中如何保证缓存与数据库的数据一致性

可以分为先操作缓存和先操作数据库两种方式,更新缓存中的数据都是采用删除的方式,等到下一次查询时从更新之后的数据库中再写入缓存。

如果说先删除缓存,那么会出现下面这种情况,当线程 1 删除缓存之后,由于网络延迟,线程 2 先执行查询操作,没有查询到目标数据之后,就会从数据库中把旧的数据写入缓存中,然后线程 1 再更新数据库,此时虽然数据库中是更新之后的数据,但是之后再进行查询的时候,由于缓存中已经又重新被写入了旧数据,此时就会出现数据不一致的问题

解决方案是通过延迟双删的方式,第一次线程 1 删除缓存,等到数据库中的数据更新之后,延迟一段时间再进行删除缓存,通过两次删除,就能保证之后再获取缓存中的数据时不会获取到脏数据,而延迟一段时间再删除是为了确保线程 2 把旧数据写入缓存之后再进行删除,不然即使执行双删操作,旧数据也会重新被写入缓存,双删了个寂寞。

再来看先操作数据库的方案:

先把数据写入到数据库,然后再删除缓存,这种方式其实还是存在问题,如果删除缓存时删除失败了,那么之后查询到的还是旧数据,还是存在数据不一致问题。

针对缓存删除失败的情况,可以采用删除重试的方式,重试的操作可以添加到 MQ 中,通过异步的方式来处理,这样的话代码的耦合度也会上来,如果要实现解耦,可以采用读取 binlog 来进行异步删除。

最终的方案就是:先修改数据库,然后通过 Canal 监听数据库的 binlog 日志,记录数据库的修改信息,然后通过消息队列异步修改缓存的数据,需要注意保证缓存中数据按顺序更新,然后加上重试机制,避免由于网络问题导致更新失败

相关推荐
一 乐4 小时前
二手交易平台|基于springboot + vue二手交易平台(源码+数据库+文档)
java·数据库·vue.js·spring boot·小程序
SelectDB5 小时前
同等资源下 Apache Doris 4.2 vs StarRocks 4.1.1:1TB SSB 与 TPC-H 性能实测
大数据·数据库·数据分析
这个DBA有点耶5 小时前
数据库集群与分布式架构:三条技术路线对比、金仓KES RAC实测数据与决策框架
数据库·程序员·架构
MayBaymax5 小时前
MongoDB 索引与事务
java·数据库·mongodb
SelectDB5 小时前
Doris vs ClickHouse:企业 OLAP 走向下一阶段,两种技术路线如何选择
大数据·数据库·数据分析
vx-程序开发5 小时前
【计算机毕设】django校园跑腿服务系统83141
java·数据库·vue.js·spring boot·spring·elasticsearch·django
一 乐6 小时前
养老院管理系统|基于springboot + vue养老院管理系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·毕业设计
这个DBA有点耶6 小时前
InnoDB页结构深入:页分裂、页合并、填充因子——B+树底层机制全解析
数据库·mysql·架构
山岚的运维笔记7 小时前
mysql 专业笔记 -- 第 36 章:MySQL 管理
运维·数据库·笔记·后端·mysql·oracle·dba
阳光宅男@李光熠8 小时前
【电子通识】一起学习TDK的EMC基础——电池兼容设计方法概述
java·前端·数据库