缓存和数据库一致性的保障方案

业界流行的有下面几种,不能说孰优孰劣,只能具体问题具体分析,软件开发没有银弹

同步删除

同步删除说明了是同步,所以流程的处理就是一步一步来,先更新数据库的数据,再对缓存进行删除

没有问题吗?

假如并发场景下,有两条线程,一条线程查询了数据库,还没来得及写缓存,但是另一条线程更新了这条数据库记录,并完成了写缓存操作,这时原来的线程再回过头来写缓存,就会有脏数据

又假如本来是应该在 API 里进行数据的更新的,但是有人直接连上数据库进行 update,这样数据库的数据是被删掉了,但是在 API 的层面并不知道,所以缓存中的数据还是旧的

再加入同步删除过程中发生异常了,也会存在脏数据问题

延时双删

延时双删顾名思义就是延时 + 双删,先删一次缓存,接着更新数据库,休眠毫秒级的时间,再删一次缓存

没有问题吗?

到底要休眠多久,这个要看具体的业务需求

数据库主从架构下,写主库,数据同步到从库需要一定的时间,不能保证强一致性,万一双删后数据还没同步完成,此时有请求过来了,就缓存了旧数据

监听 binlog

监听 binlog 其实解决了同步删除的场景下,通过 API 外操作数据库的问题

比如用 Canal,只要你更新数据库,无论你是正常请求 API 更新,还是直接连数据库,都能监听到,然后就能对缓存进行删除

没有问题吗?

和消息队列一样,解耦了,吞吐量提高了,但是严重依赖第三方中间件,Canal 挂了怎么办