一定要设置前提,先介绍业务背景

问题来了,那么先删除数据库,还是先删除缓存呢?我们都分析一下,这里只分析异常情况
先删除缓存,再删除数据库。假设我们有缓存数据A=10,和数据库数据A=10

先操作数据库,再删除缓存,假设我们有缓存数据已经过期,和数据库数据A=10

我们发现这两种都会导致脏数据的出现,所以,删除两次缓存就出现了。这就是延时双删:删除缓存-修改数据库-延迟一会删除缓存,就是为了降低脏数据的出现,那为什么要延时呢?因为一般情况下,数据库是主从模式,我们要延时一会,让数据库主节点同步到从节点,再删除缓存。但是也会有小问题,因为延时的时间不好把控。所以做不到绝对的强一致。
那有更好的办法吗?我们可以使用分布式锁来解决这个问题

但是这个显然效率有点太低了,我们可以优化一下
一般缓存数据都是读多写少,我们可以使用读写锁控制
这样性能就得到了提升,虽然实现了强一致,但是性能还是有点低

最终一致性的保证,主要取决于MQ的可靠性

canal是阿里开发的中间件,主要是基于mysql的主从同步实现的
二进制日志(BNLOG)记录了所有的DDL (数据定义语言)语句和DML(数据操纵语言)语句,但不包括数据查询(SELECT、SHOW)语句。
优点:无代码侵入