缓存与数据库一致性问题

缓存与数据库一致性问题

产生一致性问题的业务背景:

一致性问题一般是出现在修改操作,对数据库中数据进行修改。为什么会有一致性问题的提出那?是因为在大流量下,单访问数据库导致系统的性能较差,所以引入的redis缓存,数据发生变化的时候,数据库和redis中的数据都是需要修改的,但是在并发系统中,对数据库和redis的修改不是原子的,所以会触发不一致问题。但是在短链接创建后,进行修改时,需要同时对两者进行变更,因为种种异常原因,如何保障数据库和缓存种短链接的一致性呢?

项目中的应对策略:

由于修改短链接的并发量并不高,所以就没有 引入Canal 配合 Binlog 的形式解决缓存和数据库最终一致性问题。而是 使用的先修改数据库再删缓存 。该方式实现比较简单,不依赖额外中间件,从实时性以及技术实现复杂度来说都比较不错,在系统并发较小的情况下还是可以使用这种方案。

该策略下的不足:

1、小时间段内不一致问题:

小时间段内数据不一致是在我们先修改了数据库之后和删除的Redis中的缓存之间的这段时间,在我们修改短链接时,对数据库中的信息进行了修改,但是还没有对Redis中的缓存进行删除,这段时间内,有人访问了我们修改的短链接,但是缓存中的短链接还是原始的短链接信息,如果修改了原始链接就会跳转到未修改的原始链接。对于绝大多数的情况来说,是可以容忍的。

2、缓存删除问题:

我们上边提到由于我们的并发量并不高,所以我们选择了先更新数据库再删除缓存。在涉及海量并发的场景中,如果程序删除了缓存,可能会导致缓存击穿问题,而更新频繁时则可能引发缓存雪崩。

我们实际场景下,需要充分考虑业务场景是否属于高并发模型。如果是高并发场景,删除缓存可能并不合适,此时应采用最终一致性策略。那就应该引发出来 Canal 配合 Binlog 的形式解决缓存和数据库最终一致性问题。

拿 MySQL 举例,当一条数据发生修改时,MySQL 就会产生一条变更日志(Binlog),我们可以订阅这个日志,拿到具体操作的数据,然后再根据这条数据,去删除对应的缓存。

相关推荐
qq_12498707533 小时前
基于JavaWeb的大学生房屋租赁系统(源码+论文+部署+安装)
java·数据库·人工智能·spring boot·计算机视觉·毕业设计·计算机毕业设计
短剑重铸之日3 小时前
《设计模式》第十一篇:总结
java·后端·设计模式·总结
若鱼19193 小时前
SpringBoot4.0新特性-Observability让生产环境更易于观测
java·spring
倒流时光三十年3 小时前
SpringBoot 数据库同步 Elasticsearch 性能优化
数据库·spring boot·elasticsearch
觉醒大王4 小时前
强女思维:着急,是贪欲外显的相。
java·论文阅读·笔记·深度学习·学习·自然语言处理·学习方法
forestsea4 小时前
深入理解Redisson RLocalCachedMap:本地缓存过期策略全解析
redis·缓存·redisson
努力学编程呀(๑•ี_เ•ี๑)4 小时前
【在 IntelliJ IDEA 中切换项目 JDK 版本】
java·开发语言·intellij-idea
码农小卡拉4 小时前
深入解析Spring Boot文件加载顺序与加载方式
java·数据库·spring boot
怣504 小时前
MySQL多表连接:全外连接、交叉连接与结果集合并详解
数据库·sql
向上的车轮4 小时前
为什么.NET(C#)转 Java 开发时常常在“吐槽”Java:checked exception
java·c#·.net