如何保证缓存与数据库的双写一致性

一、涉及到的操作

缓存:读、写、更新、删除,这些操作可能失败

数据库:读、写、更新、删除,这些操作可能失败

二、正常流程

1. 读数据,先读缓存,命中返回数据;未命中读数据库,返回数据,写缓存;读数据不存在不一致问题

2. 写数据库,对缓存不做处理

3. 更新数据库数据,如果数据不在缓存中,不作处理;如果数据在缓存中,删除而不是更新缓存

a. 有些缓存中的数据,是经过处理后的数据,如果更新会消耗计算资源

b. 如果频繁更新,却没有读取,就会浪费计算时间和内存空间

4. 删除数据库数据,如果数据不在缓存中,不作处理;如果数据在缓存中,删除缓存

三、初级的数据不一致问题

更新数据库数据的时候,如果更新数据库数据成功,删除缓存数据失败,则数据不一致

四、解决方法:更新数据库数据时,先删除缓存,可以保证一致性

a. 如果删除缓存失败,则更新失败

b. 如果删除缓存成功,但是更新数据库失败,则缓存中没有数据,数据库是旧数据

五、复杂的数据不一致的问题

在删除缓存后,更新数据库还未成功,此时有请求读取数据库旧数据,并把旧数据写入了缓存,然后更新数据库成功

六、解决方法

设置缓存过期时间,保证最终数据一致性

原文地址:https://www.cnblogs.com/june0816/p/6140626.html

时间: 2024-11-07 14:40:14

如何保证缓存与数据库的双写一致性的相关文章

Java进阶面试必问:如何保证缓存与数据库的双写一致性?

面试题 如何保证缓存与数据库的双写一致性? 面试官心理分析 你只要用缓存,就可能会涉及到缓存与数据库双存储双写,你只要是双写,就一定会有数据一致性的问题,那么你如何解决一致性问题? 面试题剖析 一般来说,如果允许缓存可以稍微的跟数据库偶尔有不一致的情况,也就是说如果你的系统不是严格要求 "缓存+数据库" 必须保持一致性的话,最好不要做这个方案,即:读请求和写请求串行化,串到一个内存队列里去. 串行化可以保证一定不会出现不一致的情况,但是它也会导致系统的吞吐量大幅度降低,用比正常情况下多

经典好文--如何保证缓存和数据库的双写一致性

面试题如何保证缓存与数据库的双写一致性? 面试官心理分析你只要用缓存,就可能会涉及到缓存与数据库双存储双写,你只要是双写,就一定会有数据一致性的问题,那么你如何解决一致性问题? 面试题剖析一般来说,如果允许缓存可以稍微的跟数据库偶尔有不一致的情况,也就是说如果你的系统不是严格要求 “缓存+数据库” 必须保持一致性的话,最好不要做这个方案,即:读请求和写请求串行化,串到一个内存队列里去. 串行化可以保证一定不会出现不一致的情况,但是它也会导致系统的吞吐量大幅度降低,用比正常情况下多几倍的机器去支撑

9.如何保证缓存与数据库的双写一致性?

作者:中华石杉 面试题 如何保证缓存与数据库的双写一致性? 面试官心理分析 你只要用缓存,就可能会涉及到缓存与数据库双存储双写,你只要是双写,就一定会有数据一致性的问题,那么你如何解决一致性问题? 面试题剖析 一般来说,如果允许缓存可以稍微的跟数据库偶尔有不一致的情况,也就是说如果你的系统不是严格要求 “缓存+数据库” 必须保持一致性的话,最好不要做这个方案,即:读请求和写请求串行化,串到一个内存队列里去. 串行化可以保证一定不会出现不一致的情况,但是它也会导致系统的吞吐量大幅度降低,用比正常情

Java面试常被问到这道题:如何保证缓存与数据库的双写一致性?

面试原题 如何保证缓存与数据库的双写一致性? 面试官心理分析 你只要用缓存,就可能会涉及到缓存与数据库双存储双写,你只要是双写,就一定会有数据一致性的问题,那么你如何解决一致性问题? 面试题剖析 一般来说,如果允许缓存可以稍微的跟数据库偶尔有不一致的情况,也就是说如果你的系统不是严格要求?"缓存+数据库" 必须保持一致性的话,最好不要做这个方案,即:读请求和写请求串行化,串到一个内存队列里去. 串行化可以保证一定不会出现不一致的情况,但是它也会导致系统的吞吐量大幅度降低,用比正常情况下

PHP中高级面试题 一个高频面试题:怎么保证缓存与数据库的双写一致性?

分布式缓存是现在很多分布式应用中必不可少的组件,但是用到了分布式缓存,就可能会涉及到缓存与数据库双存储双写,你只要是双写,就一定会有数据一致性的问题,那么你如何解决一致性问题? Cache Aside Pattern 最经典的缓存+数据库读写的模式,就是 Cache Aside Pattern.读的时候,先读缓存,缓存没有的话,就读数据库,然后取出数据后放入缓存,同时返回响应.更新的时候,先更新数据库,然后再删除缓存. 为什么是删除缓存,而不是更新缓存? 原因很简单,很多时候,在复杂点的缓存场景

一个经典面试题:如何保证缓存与数据库的双写一致性?

只要用缓存,就可能会涉及到缓存与数据库双存储双写,你只要是双写,就一定会有数据一致性的问题,那么你如何解决一致性问题? 面试题剖析 一般来说,如果允许缓存可以稍微的跟数据库偶尔有不一致的情况,也就是说如果你的系统不是严格要求 “缓存+数据库” 必须保持一致性的话,最好不要做这个方案,即:读请求和写请求串行化,串到一个内存队列里去. 串行化可以保证一定不会出现不一致的情况,但是它也会导致系统的吞吐量大幅度降低,用比正常情况下多几倍的机器去支撑线上请求. Cache Aside Pattern 最经

一个高频面试题:怎么保证缓存与数据库的双写一致性?

分布式缓存是现在很多分布式应用中必不可少的组件,但是用到了分布式缓存,就可能会涉及到缓存与数据库双存储双写,你只要是双写,就一定会有数据一致性的问题,那么你如何解决一致性问题? Cache Aside Pattern 最经典的缓存+数据库读写的模式,就是 Cache Aside Pattern.读的时候,先读缓存,缓存没有的话,就读数据库,然后取出数据后放入缓存,同时返回响应.更新的时候,先更新数据库,然后再删除缓存.为什么是删除缓存,而不是更新缓存?原因很简单,很多时候,在复杂点的缓存场景,缓

如何保证缓存与数据库的双写一致性?

一般来说,如果允许缓存可以稍微的跟数据库偶尔有不一致的情况,也就是说如果你的系统不是严格要求 “缓存+数据库” 必须保持一致性的话,最好不要做这个方案,即:读请求和写请求串行化,串到一个内存队列里去. 串行化可以保证一定不会出现不一致的情况,但是它也会导致系统的吞吐量大幅度降低,用比正常情况下多几倍的机器去支撑线上的一个请求. Cache Aside Pattern 最经典的缓存+数据库读写的模式,就是 Cache Aside Pattern. 读的时候,先读缓存,缓存没有的话,就读数据库,然后

保证缓存与数据库双写时的数据一致性

缓存与数据库双写时的数据一致性问题:只要用缓存,就可能会涉及到缓存与数据库双存储双写,你只要是双写,就一定会有数据一致性的问题,那么你如何解决一致性问题? 一般来说,就是如果你的系统不是严格要求缓存+数据库必须一致性的话,缓存可以稍微的跟数据库偶尔有不一致的情况,最好不要做这个方案,读请求和写请求串行化,串到一个内存队列里去,这样就可以保证一定不会出现不一致的情况. 串行化之后,就会导致系统的吞吐量会大幅度的降低,用比正常情况下多几倍的机器去支撑线上的一个请求. 原文地址:https://www