让数据库和缓存数据保持一致的三种策略
一、让数背景
目前随着缓存架构方案越来越成熟化,据库据保通常做法是和缓引入「缓存」来提高读性能,架构模型就变成了这样:
图片
先来看一下什么时候创建缓存,存数持致策略前端请求的让数读操作先从缓存中查询数据,如果没有命中数据,据库据保则查询数据库,和缓从数据库查询成功后,存数持致策略返回结果,让数同时更新缓存,据库据保方便下次操作。和缓
在数据不发生变更的存数持致策略情况下,这种方式没有问题,让数如果数据发生了更新操作,据库据保就必须要考虑如何操作缓存,和缓保证一致性。
如何保证缓存和数据库的一致性,这算得上是个老生常谈的话题啦,看到好多技术新人在写更新缓存数据代码,采用了非常复杂甚至“诡异”的方案,甚为不解。
今天就一起花点儿时间来聊聊吧~
二、缓存和数据库数据一致性问题
(1)先更新缓存,后更新数据库如果缓存更新成功了,但数据库更新失败,那么此时缓存中是最新值,云服务器但数据库中是「旧值」。
虽然此时读请求可以命中缓存,拿到正确的值,但是,一旦缓存「失效」,就会从数据库中读取到「旧值」,重建缓存也是这个旧值。
这时用户会发现自己之前修改的数据又「变回去」了,对业务造成影响。
(2)先更新数据库,后更新缓存如果数据库更新成功了,但缓存更新失败,那么此时数据库中是最新值,缓存中是「旧值」。
之后的读请求读到的都是旧数据,只有当缓存「失效」后,才能从数据库中得到正确的值。
这时用户会发现,自己刚刚修改了数据,但却看不到变更,一段时间过后,数据才变更过来,IT技术网对业务也会有影响。
可见,上面两种情况,无论谁先谁后,但凡后者发生异常,就会对业务造成影响。那怎么解决这个问题呢?
三、缓存更新Design Pattern
介绍几个也许有效的套路给大家吧~ 希望有帮助。
(1)Cache Aside Pattern
图片
图片
如上图所示,一个是查询操作,一个是更新操作的并发。
首先,没有了删除cache数据的操作了,而是先更新了数据库中的数据,此时,缓存依然有效,所以,并发的查询操作拿的是没有更新的数据,但是,更新操作马上让缓存的失效了,站群服务器后续的查询操作再把数据从数据库中拉出来。而不会像文章开头的那个逻辑产生的问题,后续的查询操作一直都在取旧数据。
那么,是不是Cache Aside这个就不会有并发问题了?
不是的。
比如,一个是读操作,但是没有命中缓存,然后就到数据库中取数据,此时来了一个写操作,写完数据库后,让缓存失效,然后,之前的那个读操作再把老的数据放进去,所以,会造成脏数据。
(2)Read/Write Through PatternRead ThroughRead Through 套路就是在查询操作中更新缓存,也就是说,当缓存失效的时候(过期或LRU换出),Cache Aside是由调用方负责把数据加载入缓存,而Read Through则用缓存服务自己来加载,从而对应用方是透明的。
Write ThroughWrite Through 套路和Read Through相仿,不过是在更新数据时发生。当有数据更新的时候,如果没有命中缓存,直接更新数据库,然后返回。如果命中了缓存,则更新缓存,然后再由Cache自己更新数据库(这是一个同步操作)
操作逻辑如下图所示:
图片
基本逻辑如下:
图片
Write Behind 又叫 Write Back。
简单说就是,在更新数据的时候,只更新缓存,不更新数据库,而我们的缓存会异步地批量更新数据库。这个设计的好处就是让数据的I/O操作飞快无比(直接操作内存的嘛 ),因为异步,write backg还可以合并对同一个数据的多次操作,所以性能的提高是相当可观的。
但是,其带来的问题是,数据不是强一致性的,而且可能会丢失(我们知道Unix/Linux非正常关机会导致数据丢失,类似这种情况)。
另外,Write Back实现逻辑比较复杂,因为他需要track有哪些数据是被更新了的,需要刷到持久层上。操作系统的write back会在仅当这个cache需要失效的时候,才会被真正持久起来,比如,内存不够了,或是进程退出了等情况,这又叫lazy write。
四、总结
对于这个老生常谈的问题,分析起来其实并不简单。
额外分享几点自己心得给你:
1、性能和一致性不能同时满足,为了性能考虑,通常会采用「最终一致性」的方案;
2、掌握缓存和数据库一致性问题,核心问题有 3 点:缓存利用率、并发、缓存 + 数据库一起成功问题;
3、失败场景下要保证一致性,常见手段就是「重试」,同步重试会影响吞吐量,所以通常会采用异步重试的方案;
4、订阅变更日志的思想,本质是把权威数据源(例如 MySQL)当做 leader 副本,让其它异质系统(例如 Redis / Elasticsearch)成为它的 follower 副本,通过同步变更日志的方式,保证 leader 和 follower 之间保持一致。
面讲到的几种缓存更新的设计方式,都是前人总结出来的经验,这些方式或多或少都有一些弊端,并不完美,实际上也很难有完美的设计。大家在做系统设计的时候,也不要去追求完美,要有一些取舍,找到一种最适合自己业务场景的方式就行。
图片
相关文章
如何以3分钟强制删除管理员权限文件(快速、高效、安全的解决办法)
摘要:管理员权限文件对于用户来说可能是一个棘手的问题。本文将介绍一种能够在3分钟内强制删除管理员权限文件的方法,帮助用户解决此类困扰。1.关闭所有与该文件相关的进程通过任务管...2025-11-05
同步 vs 异步性能差十倍!SpringBoot 高吞吐接口实现终极方案
兄弟们,当你去银行办业务,柜员必须等你填完表格、签字、盖章,再慢悠悠处理下一个客户。这种模式就是同步编程的典型写照。在 Java 世界里,同步接口就像这位 “一根筋” 的柜员 ——Tomcat 线程池2025-11-05
CERT/CC 警告:新型 HTTP/2 漏洞 MadeYouReset 恐致多数服务器遭 DDoS 攻击瘫痪
CERT/CC计算机应急响应协调中心)近日发布漏洞公告,警告多个HTTP/2实现中新发现的缺陷可能被威胁行为者用于发起高效拒绝服务DoS)或分布式拒绝服务DDoS)攻击。该漏洞被非正式命名为"Made2025-11-05- 一、概述在现今云计算、大数据等新型技术推动下,业界主流的应用架构,正由松耦合、集中式的 SOA 架构向解耦合、分布式的微服务架构发展,运维人员的工作方式也正在由烟囱式运维、人工运维向自动化、流程化、2025-11-05
解决电脑恢复手机时老提示错误的方法(教你如何应对电脑恢复手机时的错误提示问题)
摘要:在使用电脑恢复手机数据的过程中,我们可能会遇到一些错误提示,这给我们的操作带来了不便。然而,只要我们掌握一些方法和技巧,就能轻松解决这些问题,保证数据的顺利恢复。本文将介绍一些常见...2025-11-05
CERT/CC 警告:新型 HTTP/2 漏洞 MadeYouReset 恐致多数服务器遭 DDoS 攻击瘫痪
CERT/CC计算机应急响应协调中心)近日发布漏洞公告,警告多个HTTP/2实现中新发现的缺陷可能被威胁行为者用于发起高效拒绝服务DoS)或分布式拒绝服务DDoS)攻击。该漏洞被非正式命名为"Made2025-11-05

最新评论