数据库更新以后,需要令缓存失效,而不是更新缓存为数据库的最新值。
如果两个险些同时发出的请求分别要更新数据库中的值为 A 和 B,如果结果是 B 的更新晚于 A,那么数据库中的终极值是 B。但是,如果在数据库更新后去更新缓存,而不是令缓存失效,那么缓存中的数据就有可能是 A,而不是 B。因为数据库虽然是“更新为 A”在“更新为 B”之前发生,但如果不做特殊的跨存储系统的事件控制,缓存的更新顺序就未必会遵从“A 先于 B”这个规则,这就会导致这个缓存中的数据会是一个长期错误的值 A。
如果是更新缓存为数据库最新值,而不是令缓存失效,为什么会产生问题:
如果是令缓存失效,这个问题就消失了。因为 B 是后写入数据库的,那么在 B 写入数据库以后,无论是写入 B 的请求让缓存失效,还是并发的竞争情况下写入 A 的请求让缓存失效,缓存反正都是失效了。那么下一次的访问就会从数据库中取得最新的值,并写入缓存,这个值就一定是 B。
虽然说catch aside可以被称之为缓存使用的最佳实践,但与此同时,它引入了缓存的掷中率降低的问题,(每次都删除缓存自然导致更不容易掷中了),因此它更适用于对缓存掷中率要求并不是特别高的场景。如果要求较高的缓存掷中率,依然需要采用更新数据库后同时更新缓存的方案。在更新数据库后同时更新缓存,会在并发的场景下出现数据不同等,那我们该怎么规避呢?方案也有两种。