先更新数据库,再删除缓存
如果反过来操作,先更新数据库,再删除缓存呢?这个就更明显的问题了,更新数据库成功,如果删除缓存失败或者还没有来得及删除,那么,其他线程从缓存中读取到的就是旧值,还是会发⽣不⼀致。
解决⽅案
消息队列
这是⽹上很多⽂章⾥都有写过的⽅案。但是这个⽅案的缺陷会更明显⼀点。先更新数据库,成功后往消息队列发消息,消费到消息后再删除缓存,借助消息队列的重试机制来实现,达到最终⼀致性的效果。
这个解决⽅案其实问题更多。
1. 引⼊消息中间件之后,问题更复杂了,怎么保证消息不丢失更麻烦
2. 就算更新数据库和删除缓存都没有发⽣问题,消息的延迟也会带来短暂的不⼀致性,不过这个延迟相对来说还是可以接受的
进阶版消息队列
为了解决缓存⼀致性的问题单独引⼊⼀个消息队列,太复杂了。其实,⼀般⼤公司本身都会有监听binlog消息的消息队列存在,主要是为了做⼀些核对的⼯作。这样,我们可以借助监听binlog的消息队列来做删除缓存的操作。这样做的好处是,不⽤你⾃⼰引⼊,侵⼊到你的业务代码中,中间件帮你做了解耦,同时,中间件的这个东⻄本身就保证了⾼可⽤。当然,这样消息延迟的问题依然存在,但是相⽐单纯引⼊消息队列的做法更好⼀点。⽽且,如果并发不是特别⾼的话,这种做法的实时性和⼀致性都还算可以接受的。
网友评论