前言数据库和缓存(比如:redis)双写数据一致性问题,是一个跟开发语言无关的公共问题。尤其在高并发的场景下,这个问题变得更加严重。 我很负责的告诉大家,该问题无论在面试,还是工作中遇到的概率非常大,所以…
一致性包含如下情况: 缓存有数据:缓存的数据值需和DB相同 缓存无数据:DB是最新值 不符合这两种情况的,都属缓存和DB数据不一致。 2 缓存的读写模式 根据是否接收写请求,可将缓存分成读写缓存和只读缓存。 2.1 读写缓存 若要对数据进行增删改,需在Cache进行。 同时根据采取的写回策略,决定是否同步写回DB: 2.1...
1)删除缓存失败存在脏数据 2)难以收拢所有更新数据库入口 使用同步删除方案,你必须在所有更新数据库的地方都进行缓存的删除操作,如果你有一个地方漏掉了,对应的缓存就相当于没有删除了,就会导致脏数据问题。还有就是如果我们通过命令行直接来更新数据库的数据,或者通过公司提供的数据库管理平台来更新数据库数据,...
接着来自线程2的写请求再次更新了数据库(step3),但由于网络延迟等原因,线程1可能会晚于线程2更新缓存(step4晚于step3),那么这样便会导致最终写入数据库的结果是来自线程2的新值,写入缓存的结果是来自线程1的旧值,即缓存落后于数据库,此时再有读请求命中缓存(step5),读取到的便是旧值。
缺点:引入了异步处理,可能会在一定程度上牺牲一致性。系统中需要处理缓存和数据库之间的同步问题。 其中,Cache Aside Pattern 是最常用的设计模式 为什么会有一致性问题 在使用缓存的三种设计模式中,Cache Through Pattern因为系统本身不负责缓存的更新,通常需要较为复杂的机制来保证数据的一致性。
写缓存的流程就比较简单,先更新数据库中的数据,然后删除旧的缓存即可。Cache-Aside Pattern 一致性问题场景分析 实际的项目中运用最多的为Cache-Aside Pattern(旁路缓存)模式,在此策略下客户端先读取缓存,如果命中则返回,如果没有命中,则查询数据库并发数据写入缓存,由于数据库和缓存都需要进行修改,在高并发的...
缓存通常存储在内存中,这样可以实现比从磁盘读取数据更快的访问速度。缓存的典型应用场景包括网页缓存、数据库查询缓存、CDN 等。二、缓存与数据库数据一致性问题缓存与数据库数据一致性问题的本质是,在缓存和数据库之间,数据可能因为各种原因出现不一致的现象。这可能导致用户访问到过期或错误的数据,从而影响系统的...
缓存与数据库的数据一致性指的是,缓存中存储的数据与数据库中存储的数据需保持一致。 即缓存中存有数据,缓存的数据值 = 数据库中的值;缓存中没有该数据,数据库中的值 = 最新值。数据一致性主要包含以下两种情况: 缓存中有数据,那么缓存中的值需要和数据库中值相同。
先更新缓存,后更新数据库 这个方案会遇到这种情况:缓存更新成功了,但是第二步更新数据库失败了,要回滚缓存的更新,但是Redis不支持事务回滚。这时候会导致数据不一致,该方案不可行。 先删除缓存,后更新数据库 这个方案即使更新数据库失败了也不需要回滚缓存。这种做法巧妙规避了上面方案失败回滚的问题,但是也引入了其他...
更新数据库+更新缓存 根据数据库与缓存的操作顺序,可分为两种方案:先更新缓存,再更新数据库。先更新数据库,再更新缓存。正常情况,二者没有差别,都能保证缓存数据与数据库数据的一致性。数据一致性问题主要发生在第一步执行成功,第二步执行失败的场景。更新数据库+更新缓存无并发场景 先更新缓存,再更新数据库 ...