Redis 与 Mysql 的数据一致性问题

本文探讨了在高并发场景下,缓存与数据库数据一致性问题的产生原因及其解决方案。分析了先更新数据库再更新缓存、先更新缓存再更新数据库以及先删除缓存再更新数据库等策略的优缺点。提到了MQ异步处理和Canal订阅MySQL binlog作为解决手段,但都存在数据延迟和并发读取脏数据的风险。

数据一致性问题出现原因

在高并发场景下,如果每一次请求都要访问数据库,那么性能一定是低的,因为数据库存储在磁盘里,磁盘的IO操作是比较慢的;
所以就出现的缓存技术,因为内存IO要比磁盘IO快很多,将一些数据存到内存中可以显著的提高访问效率,常用的就是Redis来做缓存。
但同时也会产生一些问题,在缓存和数据库同时存在时,如果数据需要修改,是应该先修改数据库还是先修改缓存呢?这个问题就是数据一致性问题。

解决方案

先更新数据库,再更新缓存

该方案可能会导致数据不一致的情况。

如果在更新数据库后并在更新缓存前服务挂掉了,此时数据库更新了,缓存没有更新,数据库和缓存的数据不一致;

还有一种极端的情况:

如果在更新数据库后,还没来得及更新缓存呢,大量的请求访问缓存,那么这些请求所读到的都是脏数据;

先更新缓存,再更新数据库

该方案可能会导致数据不一致的情况。

如果在更新缓存后并在更新数据库前服务挂掉了,此时缓存更新了,数据库没有更新,数据库和缓存的数据不一致;

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

先删除缓存,如果删除成功,下次请求时到数据库重新拿数据写入缓存,如果删除失败,也不会更新数据库;

该方案看起来很好,但在一些场景下会有数据不一致的情况。

删除成功后,还没来得及更新数据库,另一个请求拿到从数据库拿到数据写入缓存,之后这个请求才更新数据库,此时缓存的数据为脏数据

同时也会产生性能问题:

如果缓存删除成功后有大量的请求来访问,这就会造成穿透、击穿甚至是雪崩问题

MQ异步处理

MQ有消息重投机制,缓存和数据库有一个写入失败消费失败,可以重新消费,重新写入缓存和数据库

缺陷

数据同步会有一段时间的延迟,并发场景下,会有大量请求读到脏数据

canal订阅Mysql的binlog

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值