如何保证Redis cache与DB数据一致性?

例如:项目中,如果人为修改了一个DB数据,那么就会产生缓存层与DB数据不一致,测试环境我就就直接删缓存了。

比较适合小项目的解决方案:

生产环境一般不非法人为操作数据库。

基于代理数据源方式,判断commit提交成功的情况下,将数据异步的提交到redis中。

因为多线程,大项目会对项目有不小影响,可以用mq异步会更好些。

一、多线程:如果并发上来,采用多线程,线程池满了,会导致项目内存爆掉,或拒绝请求。如果出现这种情况可以存在本地文件中,下次做补偿。

如果人为修改数据库一定会造成数据不一致。

二、mq:插入更新删除的时候,将数据放入mq中,昨晚DB操作后,操作redis.

缺陷:耦合度较高,同步操作在一个业务里。如果操作完db停了,那redis还是会不一致。

解决缺陷:mysql主从复制。通过mysql 的binlog文件。mysql主从

binlog:对mqsql操作的写的请求都会有一个二进制的日志文件。

mysql主从复制业务场景:从只读。一般的云数据库都是主从一套,但是有时间的备份

1.备份mysql数据。

2.读写分离

3.高可用集群

cannal:

 分布式微服务项目不可能保证强一致性,最基本的网络传输也需要时间的,只不过时间很快,像是强一致性。

分布式领域中无法保证强一致性,但是可以保证最终一致性。短暂的数据不一致是允许的,但是最终数据一定一致。

上图还有问题,如果频繁的操作db那么canal监听是单线程的,会造成阻塞增大延迟。

下图这种方法,如果出现db操作过大,可以建立mq消费者集群,但是要注意消息顺序性,mq中有

 此处其实还有一个问题,binlog的json发送过来的写入mq的时候,多个消费者会出现操作的前后顺序混乱,也可以做成一个queue对应一个消费者,用内存队列存储然后操作。

 

部分摘自https://www.cnblogs.com/softidea/p/13718927.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值