方案1 给缓存设置过期时间 这种方案适用于对数据一致性要求较低或者写请求很少的业务,当读请求没有命中缓存时,就从数据库中读,之后回写到缓存里,同时设置一个过期时间。 写请求直接更改数据库,不用操作缓存。因此当一个key没过期时,写请求更改了数据库,之后的读还是读取到旧数据。这个时候确实发生了不一致,但业务...
7 删除缓存 -> 更新数据库 -> 更新缓存 8 更新缓存 -> 更新数据库 -> 删除缓存 9 删除缓存 -> 更新数据库 -> 删除缓存 10 删除缓存 -> 更新数据库 --> 延迟比如10ms -> 删除缓存 ... 可能还有其他情况,不过,太复杂了就不列出了 注意: 在使用的方案中,更新数据库 是必须要进行,因为数据库才算真...
首先确认产品上对延迟性的要求,如果要求极高,且数据有可能变化,别用缓存。 通常来说,方案1就够了,笔者咨询过4,5个团队,基本都是用方案1,因为能用缓存方案,通常是读多写少场景,同时业务上对延迟具有一定的包容性。方案1没有开发成本,其实比较实用。 如果想增加更新时的即时性,就选择方案2,不过没必要做重试保证...
一、保证最终一致性的策略(Cache Policy) (一)Cache-Aside (二)补偿机制 (三)Read-Through (四)Write-Through (五)Write-Behind (六)Write-Around 二、总结 作者简介 导语| 到底是更新缓存还是删除缓存? 到底是先更新数据库,再删除缓存,还是先删除缓存,再更新数据库?本文主要介绍了在不同场景下保证数据缓存一...
在我们的实际项目中,在一些QPS比较高的场景下,经常引入缓存来缓解数据库的查询压力,以缓存的空间来换取查询效率的提升。但是一旦引入了缓存,就一定会遇到缓存中的数据与数据库中的数据如何保持一致的问题,本文就是针对两者之间的数据一致性问题进行分析,一步一步分析以及解决。
这样,即使某次缓存删除操作失败,消息队列也会确保最终重试成功,从而保证缓存和数据库之间的数据一致性。缓存数据一致性的终极方案:请求串行化 虽然 CacheAside 模式加上消息队列的方式能够大幅减少数据不一致的问题,但在某些极端场景下,还是有可能出现并发读写导致的缓存脏数据。为了进一步提升一致性,我们可以考虑将...
如果是第一步成功(写数据库成功),然后再操作缓存的时候失败,这里有两种情况: 数据库回滚:如果是业务需要保证缓存与数据库强一致性时,可以抛出业务异常给调用方。 不作处理:与数据库回滚相反,业务可以接受在缓存过期时间达到之前,缓存与数据库允许数据不一致。
1.1 读写DB和缓存流程 读请求:命中缓存 :直接返回Redis缓存数据,无数据库请求未命中:从数据库查询数据,并将查询结果写入Redis CUD写请求:更新数据库数据删除缓存中的数据,缓存将在下次未命中缓存时更新 1.2 数据一致性问题 缓存删除之前读取数据:假设进程 A 已成功更新 MySQL 中的值,但在删除 Redis 缓存...
采用先更新数据库,后删除缓存的方式来解决并发引发的一致性问题; 采用异步重试的方式来保证“更新数据库、删除缓存”这两步都能执行成功; 可以采用订阅变更日志的方式来清除 Redis 中的缓存; 基于这种思想,阿Q脑海中搭建了以下架构 APP 从 Redis 中查询信息,将数据的更新写入 MySQL 数据库中; ...
备注:数据库是指mysql 缓存是指redis。双写一致性的解决方案:方案一:先写缓存,再写数据库;方案二...