更新操作写入消息队列,然后由消息队列保证最终一致性。 消费者从队列中读取更新消息,并按照消息顺序更新数据库和缓存。 「4. 事务性缓存」 使用支持事务的缓存解决方案,如使用支持事务的缓存中间件。 在数据库事务提交的同时,提交缓存的变更。 「5. 最终一致性模型」 接受缓存和数据库之间存在短暂的数据不一致。 通...
先删除缓存,后更新数据库,再删除缓存 这个方案其实跟前面的方案差不多,因为还是会出现前面方案提到的脏数据问题——在更新数据库成功后和删除缓存成功前读到的都是旧数据,不过能规避第二步删除缓存失败的问题,因为该方案是先删除缓存再更新数据库。只有在第一步和第二步之间又有查询请求,把旧的数据重新加载到缓存...
1,而缓存中的数据却是 2,依然出现了缓存和数据库中的数据不一致的现象。 3.先删除缓存,再更新数据库 A请求要更新数据,先删除缓存,在更新数据库的过程中,B请求读取该数据,因缓存未命中,读取了数据库中未更新的数据1,并将结果写入了缓存 此时,数据库中的数据是 2,而缓存中的数据却是 1,所以,在读写并发时,...
使用分布式锁 在更新数据库和缓存的操作过程中,通过获取分布式锁来保证同一时间只有一个线程进行操作,避免并发导致的不一致。 引入数据版本号 数据库中的每条数据都有一个版本号字段。 读数据时,将版本号返回并存入缓存。 写数据时,比较数据库中的版本号和缓存中的版本号,如果一致则更新,不一致则重新读取数据库后再...
2. 缓存缓存是一种临时存储技术,其目的是为了提高数据访问速度。缓存通常存储在内存中,这样可以实现比从磁盘读取数据更快的访问速度。缓存的典型应用场景包括网页缓存、数据库查询缓存、CDN 等。二、缓存与数据库数据一致性问题缓存与数据库数据一致性问题的本质是,在缓存和数据库之间,数据可能因为各种原因出现不一致...
同时更新缓存和数据库,确保两者一致。代码示例 @Cacheable(value="cache",key="#key")publicStringget...
那么,我们该如何更新缓存呢? 目前有以下4种方案: 先写缓存,再写数据库 先写数据库,再写缓存 先删缓存,再写数据库 先写数据库,再删缓存 接下来,我们详细说说这4种方案。 2. 先写缓存,再写数据库 对于更新缓存的方案,很多人第一个想到的可能是在写操作中直接更新缓存(写缓存),更直接明了。
1)请求A发起查询请求,直接到数据库查询到100,但还没有来得及去设置缓存2)请求B更新值,先更新数据库,在删除缓存3)请求A这时才设置缓存为100 这种情况发生的不一致,是因为缓存突然失效了。而且还要保证请求B更新操作 比 请求A的查询操作还要快;才会导致不一致。这种情况概率会很少。一般要求不高的项目可以...
还真的有,那就是缓存双删,很好理解,就是写之前删除一次,写完以后再删一次,这样就能保证后面的缓存和数据库的一致性了。不过这里要注意一点,那就是第二次删除一定要间隔一段时间,不能一完成数据库的更新就立马删除,因为此时数据库刚刚更新,可能有别的请求正拿着旧数据还没写完缓存,你前脚刚删它后脚就...