==
保持缓存和数据库的一致性,最简单的做法就是直接在业务中去双写或删除保持一致性;如果要跟业务解耦,就要采用订阅binlog或者定时刷新的方式完成。
业务耦合的一致性方案
业务中耦合更新缓存
其中一种常见的方案是更新缓存
,当数据变更时更新对应缓存数据到缓存中,该行为可以在同一个业务中也可用消息中间件解耦。当查询请求来时,就直接查询缓存返回数据,如下图:
弊端:
-
当出现并发数据变更时,如A、B对同一行数据进行变更,A先变更完成,接着B变更完成,B更新缓存,A更新缓存。数据库中的数据是B的数据,但是缓存中却是A的数据。
-
与业务耦合不可取,增加业务复杂性以及依赖的中间件。
业务中耦合删除缓存
其实无论是前置更新还是后置更新缓存,在一些并发的极端场景都会出现缓存不一致的问题(思考一下前置更新),所以一个可以走的路子是删除缓存
。当数据变更后,删除对应key的缓存,缓存的更新由C端业务来保证,如下图:
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师