缓存和数据库的一致性的那些事

面试官:如何保障数据库和redis缓存的一致性 随着互联网的高速发展,使用互联网产品的人也越来越多,团队不可避免得也会面对越来越复杂的高并发业务场景(如下图),比如热点视频/文章的观看(读场景),热点视频/文章的评论,点赞等(写场景)。 众所周知,数据库是把数据存储在磁盘上,访问时需要进行IO操作,在请求量小的情况下,耗时还比较低。但随着数据量的增大,访问量的集中,整个数据库负担加重,响应就会变慢,请求延时上升。进而导致用户侧... 阅读详情

目录

问题场景:

更新缓存的设计模式

1.Cache Aside Pattern(旁路缓存)

2.Read/Write Through Pattern

2.1 Read Through

2.2 Write Through

3.Write Behind Caching Pattern

缓存架构设计

1.更新缓存 VS 淘汰缓存

2.先操作数据库 vs 先操作缓存

3. 缓存架构优化

3.1 一种方案是服务化

3.2 另一种方案是异步缓存更新

缓存和DB一致性的解决方案

先淘汰缓存,再写数据库

先写数据库,再更新缓存

    1.基于定时任务来实现

    2.基于消息队列来实现

   3 基于数据库的 binlog 日志

参考文章


问题场景:

主要有以下场景,会导致缓存和 DB 的一致性问题:

  1. 并发的场景下,导致读取老的 DB 数据,更新到缓存中。
  2. 缓存和 DB 的操作,不在一个事务中,可能只有一个操作成功,而另一个操作失败,导致不一致。

当然,有一点我们要注意,缓存和 DB 的一致性,我们指的更多的是最终一致性。我们使用缓存只要是提高读操作的性能,真正在写操作的业务逻辑,还是以数据库为准。例如说,我们可能缓存用户钱包的余额在缓存中,在前端查询钱包余额时,读取缓存,在使用钱包余额时,读取数据库。

更新缓存的设计模式

1.Cache Aside Pattern(旁路缓存)

这是最常用最常用的pattern了。其具体逻辑如下:

失效:应用程序先从cache取数据,没有得到,则从数据库中取数据,成功后,放到缓存中。

命中:应用程序从cache中取数据,取到后返回。

更新:先把数据存到数据库中,成功后,再让缓存失效。

一个是查询操作,一个是更新操作的并发,首先,没有了删除cache数据的操作了,而是先更新了数据库中的数据,此时,缓存依然有效,所以,并发的查询操作拿的是没有更新的数据,但是,更新操作马上让缓存的失效了,后续的查询操作再把数据从数据库中拉出来。而不会像文章开头的那个逻辑产生的问题,后续的查询操作一直都在取老的数据。

要么通过2PC或是Paxos协议保证一致性,要么就是拼命的降低并发时脏数据的概率,而Facebook使用了这个降低概率的玩法,因为2PC太慢,而Paxos太复杂。当然,最好还是为缓存设置上过期时间。

2.Read/Write Through Pattern

在上面的Cache Aside套路中,我们的应用代码需要维护两个数据存储,一个是缓存(Cache),一个是数据库(Repository)。所以,应用程序比较啰嗦。而Read/Write Through套路是把更新数据库(Repository)的操作由缓存自己代理了,所以,对于应用层来说,就简单很多了。可以理解为,应用认为后端就是一个单一的存储,而存储自己维护自己的Cache。

2.1 Read Through

Read Through 套路就是在查询操作中更新缓存,也就是说,当缓存失效的时候(过期或LRU换出),Cache Aside是由调用方负责把数据加载入缓存,而Read Through则用缓存服务自己来加载,从而对应用方是透明的。

2.2 Write Through

Write Through 套路和Read Through相仿,不过是在更新数据时发生。当有数据更新的时候,如果没有命中缓存,直接更新数据库,然后返回。如果命中了缓存,则更新缓存,然后再由Cache自己更新数据库(这是一个同步操作)

下图自来Wikipedia的Cache词条。其中的Memory你可以理解为就是我们例子里的数据库。

3.Write Behind Caching Pattern

Write Behind 又叫 Write Back。write back就是Linux文件系统的Page Cache的算法。

Write Back套路,一句说就是,在更新数据的时候,只更新缓存,不更新数据库,而我们的缓存会异步地批量更新数据库。

这个设计的好处就是让数据的I/O操作飞快无比(因为直接操作内存嘛 ),因为异步,write backg还可以合并对同一个数据的多次操作,所以性能的提高是相当可观的。

但是,其带来的问题是,数据不是强一致性的,而且可能会丢失(我们知道Unix/Linux非正常关机会导致数据丢失,就是因为这个事)。在软件设计上,我们基本上不可能做出一个没有缺陷的设计,就像算法设计中的时间换空间,空间换时间一个道理,有时候,强一致性和高性能,高可用和高性性是有冲突的。软件设计从来都是取舍Trade-Off。

另外,Write Back实现逻辑比较复杂,因为他需要track有哪数据是被更新了的,需要刷到持久层上。操作系统的write back会在仅当这个cache需要失效的时候,才会被真正持久起来,比如,内存不够了,或是进程退出了等情况,这又叫lazy write。

在wikipedia上有一张write back的流程图,基本逻辑如下:

参照:左耳朵耗子《缓存更新的套路》

缓存架构设计

1.更新缓存 VS 淘汰缓存

更新缓存:数据不但写入数据库,还会写入缓存;优点:缓存不会增加一次miss,命中率高

淘汰缓存:数据只会写入数据库,不会写入缓存,只会把数据淘汰掉;优点:简单

这两者的选择主要取决于“更新缓存的复杂度”。

例如,上述场景,只是简单的把余额money设置成一个值,那么:

(1)淘汰缓存的操作为deleteCache(uid)

(2)更新缓存的操作为setCache(uid, money)

更新缓存的代价很小,此时我们应该更倾向于更新缓存,以保证更高的缓存命中率

如果余额是通过很复杂的数据计算得出来的,例如业务上除了账户表account,还有商品表product,折扣表discount

account(uid, money)

product(pid, type, price, pinfo)

discount(type, zhekou)

业务场景是:

用户买了一个商品product,这个商品的价格是price,这个商品从属于type类商品,type类商品在做促销活动要打折扣zhekou,购买了商品过后,这个余额的计算就复杂了,需要:

(1)先把商品的品类,价格取出来:SELECT type, price FROM product WHERE pid=XXX

(2)再把这个品类的折扣取出来:SELECT zhekou FROM discount WHERE type=XXX

(3)再把原有余额从缓存中查询出来money = getCache(uid)

(4)再把新的余额写入到缓存中去setCache(uid, money-price*zhekou)

更新缓存的代价很大,此时我们应该更倾向于淘汰缓存。

总之,淘汰缓存操作简单,并且带来的副作用只是增加了一次cache miss,建议作为通用的处理方式。

2.先操作数据库 vs 先操作缓存

当写操作发生时,假设淘汰缓存作为对缓存通用的处理方式,又面临两种抉择:

(1)先写数据库,再淘汰缓存

(2)先淘汰缓存,再写数据库

对于一个不能保证事务性的操作,一定涉及“哪个任务先做,哪个任务后做”的问题,解决这个问题的方向是:如果出现不一致,谁先做对业务的影响较小,就谁先执行。

由于写数据库与淘汰缓存不能保证原子性,谁先谁后同样要遵循上述原则。

假设先写数据库,再淘汰缓存:第一步写数据库操作成功,第二步淘汰缓存失败,则会出现DB中是新数据,Cache中是旧数据,数据不一致。

假设先淘汰缓存,再写数据库:第一步淘汰缓存成功,第二步写数据库失败,则只会引发一次Cache miss。

结论:数据和缓存的操作时序:先淘汰缓存,再写数据库。

3. 缓存架构优化


上述缓存架构有一个缺点:业务方需要同时关注缓存与DB,主要有两种优化方案.

3.1 一种方案是服务化

加入一个服务层,向上游提供帅气的数据访问接口,向上游屏蔽底层数据存储的细节,这样业务线不需要关注数据是来自于cache还是DB。

3.2 另一种方案是异步缓存更新

业务线所有的写操作都走数据库,所有的读操作都总缓存,由一个异步的工具来做数据库与缓存之间数据的同步,具体细节是:

(1)要有一个init cache的过程,将需要缓存的数据全量写入cache

(2)如果DB有写操作,异步更新程序读取binlog,更新cache

在(1)和(2)的合作下,cache中有全部的数据,这样:

(a)业务线读cache,一定能够hit(很短的时间内,可能有脏数据),无需关注数据库

(b)业务线写DB,cache中能得到异步更新,无需关注缓存

这样将大大简化业务线的调用逻辑,存在的缺点是,如果缓存的数据业务逻辑比较复杂,async-update异步更新的逻辑可能也会比较复杂。

结论:
(1)淘汰缓存是一种通用的缓存处理方式

(2)先淘汰缓存,再写数据库

(3)服务化是向业务方屏蔽底层数据库与缓存复杂性的一种通用方式

参照:沈剑《缓存架构设计细节二三事》

缓存和DB一致性的解决方案

  • 先淘汰缓存,再写数据库

因为先淘汰缓存,所以数据的最终一致性是可以得到有效的保证的。因为先淘汰缓存,即使写数据库发生异常,也就是下次缓存读取时,多读取一次数据库。

但是,这种方案会存在缓存和 DB 的数据会不一致的情况,参照《缓存与数据库一致性优化》 所说。

我们需要解决缓存并行写,实现串行写。比较简单的方式,引入分布式锁。

在写请求时,先淘汰缓存之前,获取该分布式锁。

在读请求时,发现缓存不存在时,先获取分布式锁。

这样,缓存的并行写就成功的变成串行写落。写请求时,是否主动更新缓存,根据自己业务的需要,是否有,都没问题。

  • 先写数据库,再更新缓存

 按照“先写数据库,再更新缓存”,我们要保证 DB 和缓存的操作,能够在“同一个事务”中,从而实现最终一致性。有下面几种做法。

    1.基于定时任务来实现

首先,写入数据库。然后,在写入数据库所在的事务中,插入一条记录到任务表。该记录会存储需要更新的缓存 KEY 和 VALUE 。

【异步】最后,定时任务每秒扫描任务表,更新到缓存中,之后删除该记录。

    2.基于消息队列来实现

 首先,写入数据库,然后,发送带有缓存 KEY 和 VALUE 的事务消息。此时,需要有支持事务消息特性的消息队列,或者我们自己封装消息队列,支持事务消息。

【异步】最后,消费者消费该消息,更新到缓存中。

这两种方式,可以进一步优化,可以先尝试更新缓存,如果失败,则插入任务表,或者事务消息。

另外,极端情况下,如果并发写执行时,先更新成功 DB 的,结果后更新缓存:

理论来说,希望的更新缓存顺序是,线程 1 快于线程 2 ,但是实际线程1 晚于线程 2 ,导致数据不一致。

图中一直是基于定时任务或消息队列来实现异步更新缓存,如果网络抖动,导致【插入任务表,或者事务消息】的顺序不一致。

那么怎么解决呢?需要做如下三件事情:

1、在缓存值中,拼接上数据版本号或者时间戳。例如说:value = {value: 原值, version: xxx} 。

2、在任务表的记录,或者事务消息中,增加上数据版本号或者时间戳的字段。

3、在定时任务或消息队列执行更新缓存时,先读取缓存,对比版本号或时间戳,大于才进行更新。 当然,此处也会有并发问题,所以还是得引入分布式锁或 CAS 操作。

关于 Redis 分布式锁,可以看看 《精尽 Redis 面试题》 的 「如何使用 Redis 实现分布式锁?」 问题。

关于 Redis CAS 操作,可以看看 《精尽 Redis 面试题》 的 「什么是 Redis 事务?」 问题。

   3 基于数据库的 binlog 日志


 1、重客户端

写入缓存:

应用同时更新数据库和缓存

如果数据库更新成功,则开始更新缓存,否则如果数据库更新失败,则整个更新过程失败。

判断更新缓存是否成功,如果成功则返回

如果缓存没有更新成功,则将数据发到MQ中

应用监控MQ通道,收到消息后继续更新Redis。

问题点:如果更新Redis失败,同时在将数据发到MQ之前的时间,应用重启了,这时候MQ就没有需要更新的数据,如果Redis对所有数据没有设置过期时间,同时在读多写少的场景下,只能通过人工介入来更新缓存。

读缓存:

如何来解决这个问题?那么在写入Redis数据的时候,在数据中增加一个时间戳插入到Redis中。在从Redis中读取数据的时候,首先要判断一下当前时间有没有过期,如果没有则从缓存中读取,如果过期了则从数据库中读取最新数据覆盖当前Redis数据并更新时间戳。具体过程如下图所示:

2、客户端数据库与缓存解耦

上述方案对于应用的研发人员来讲比较重,需要研发人员同时考虑数据库和Redis是否成功来做不同方案,如何让研发人员只关注数据库层面,而不用关心缓存层呢?请看下图:

应用直接写数据到数据库中。

数据库更新binlog日志。

利用Canal中间件读取binlog日志。

Canal借助于限流组件按频率将数据发到MQ中。

应用监控MQ通道,将MQ的数据更新到Redis缓存中。

可以看到这种方案对研发人员来说比较轻量,不用关心缓存层面,而且这个方案虽然比较重,但是却容易形成统一的解决方案。

参照: 《技术专题讨论第五期:论系统架构设计中缓存的重要性》

PS:下面这两种比较实用

“先淘汰缓存,再写数据库”的方案,并且无需引入分布式锁。

“先写数据库,再更新缓存”的方案,并且无需引入定时任务或者消息队列。

使用缓存过程中,经常会遇到缓存数据的不一致性和脏读现象。一般情况下,采取缓存双淘汰机制,在更新数据库的前淘汰缓存。此外,设定超时时间,例如三十分钟。

极端场景下,即使有脏数据进入缓存,这个脏数据也最存在一段时间后自动销毁。

另外,在 DB 主从架构下,方案会更加复杂。详细可以看看 《主从 DB 与 cache 一致性优化》 。
 

参考文章

1. 缓存更新的套路

2. 缓存与数据库一致性优化

如何保证 Redis 缓存和数据库的一致性? 具体选择哪儿种解决方案,要根据具体业务场景、项目的需求,以及整体的架构等多种因素去综合考虑,比如是否是高并发、是否要考虑低延迟等等因素。脱离业务谈技术,就是耍流氓。 阅读详情

相关推荐

数据库和数据仓库的区别

数据库是一种用于存储、管理和处理结构化数据的软件系统。它的设计目的是支持大规模的数据持久化和高效的数据检索、插入、更新和删除操作。数据库中的数据通常以表格形式存储,可以通过SQL等查询语言进行访问和操作。数据库通常用于在线事务处理(OLTP)场景,例如管理用户账户、订单、库存等业务数据。

优快云 精品推荐 1686

如何保证缓存一致性?

缓存可以提高数据查询的效率,较低数据库的压力,但使用缓存的过程中,需要注意缓存一致性问题。 先更新缓存,再更新数据库 假设2个并发线程A和B,均为写线程,其执行顺序如下: 线程A更新缓存值为v1; 线程B更新缓存值为v2; 线程B更新数据库值为v2; 线程A更新数据库值为v1。 此时,数据库中存储的为值v1,而缓存中的值为v2,数据不一致。 先删除缓存,再更新数据库 假设2个并发线程,1个读线程A,1个写线程B,其执行顺序如下: 线程B删除缓存; 线程A读取缓存,发现无缓存; 线程A继续读数据库,取出

打酱油的葫芦娃 5562

从Low Byte解析DTC故障类型:系统开发中的诊断精细化实践

本文深入解析DTC故障诊断中Low Byte的关键作用,详细介绍了其在系统开发中的精细化应用实践。通过分析Low Byte的编码规则和故障分类设计,帮助开发者优化诊断数据库和解码方案,提升汽车电子系统的故障诊断效率和准确性。

weixin_28312391的博客 264

深入理解缓存之缓存和数据库的一致性

深入理解缓存之缓存和数据库的一致性 striveb GitHub:https://github.com/JDawnF 产生原因 主要有两种情况,会导致缓存和 DB 的一致性问题: 并发的场景下,导致读取老的 DB 数据,更新到缓存中。 缓存和 DB 的操作,不在一个事务中,可能只有一个操作成功,而另一个操作失败,导致不一致。 当然,有一点我们要注意,缓存和 DB 的一致性,我们指的更多的是最终一致性。我们使用缓存只要是提高读操作的性能,真正在写操作的业务逻辑,还是以数据库为准。例

cxu123321的博客 578

分辨率太小 / Retina 模糊 / 全屏异常:一篇解决 VMware Fusion + Kali 显示问题(Xfce & GNOME 通用)

本文提供了在Mac(尤其是Retina屏)上运行Kali Linux时常见显示问题的完整解决方案。主要解决三类问题:分辨率太小、Retina屏模糊和全屏异常。核心思路是先安装open-vm-tools-desktop并重启,这是90%问题的根源。然后根据不同问题分别处理:调整DPI/Scale解决字体大小,避免双重缩放导致的模糊,以及通过窗口拉伸和重启解决全屏异常。文章还给出了针对Xfce和GNOME的最佳配置建议,并强调调试完成后应创建快照以便快速恢复。最后提供了速查表,方便用户快速参考关键步骤。

致力于分享在各类技术领域的学习与实践经验,涵盖编程、虚拟化、开源工具、网络安全等。 874

移远EC800M CAT1模块HTTP POST实战:从AT指令到OneNet平台数据上报(附STM32代码)

本文详细介绍了移远EC800M CAT1模块通过AT指令实现HTTP POST数据上报到OneNet平台的完整流程,包含STM32实战代码。内容涵盖PDP上下文激活、HTTP服务配置、JSON数据包构建等关键技术要点,并提供硬件连接、状态机设计和错误处理等实用方案,助力开发者快速实现物联网设备稳定数据传输。

weixin_42565652的博客 507

浅析 缓存一致性协议

释义 缓存一致性协议指的是在计算机中,为保证多CPU从内存读取到缓存中的数据一致,而定义的一种解决方案。 由来 1.为什么要不使用多CPU 假如一台计算机只有一个CPU,想要同时执行多个进程,就需要经常进行上下文切换,这个代价是比较大的,所以为了提高性能,一台计算机往往有多个CPU。 2.CPU是如何进行工作的 要理解CPU的工作方式,首先要知道计算机是怎么工作的。 CPU在读取数据的时候,首先是在自己的寄存器和缓存中查看有没有,如果有就直接使用,如果没有则需要去内存中取。而寄存器和缓存存在的价值,就在于比

墨云东风 的博客 1373

【KITTI数据集中Raw_Data数据标定文件中的参数关系解读】

上一节本人将KITTI Odometry数据集中的参数文件进行了解释。本节主要针对一些做融合slam的人,将Raw_Data数据标定文件中的参数按照自己的理解做如下阐述。其中,所讲之处如有错误,欢迎各位批评指正。

weixin_43389152的博客 1526

应用中引入缓存层后,缓存和持久化层数据一致性的思考

一个应用中决定加缓存(Redis,memcached)之前,要考虑的第一个问题就是,引进了缓存之后,会带来哪些收益(利),付出哪些代价,引起哪些额外的问题(弊)? 任何新的中间件引进,收益和成本都是伴随的,只有当利大于弊的情况下,能够容忍其弊端(彻底解决?没有额外代价又没有负面影响,是不可能的,那就是不用就行了),才值得引进。 以Redis作为缓存为例,引进之后,其利和弊也是伴随的。 带来的收益:加速读写,提高并发性,降低后端持久化层数据库的负载 付出的代价:增加代码复杂,缓存本身的...

ElegantHedgehog的博客 355

ANSYS WORKBENCH——参数化建模以及参数优化(结果导出为Excel)

目录 1、打开软件workbench 2、找到static structure,双击打开 3、选择材料 4、参数化建模 ​ 注:印记面的创建 5、模型属性设置 注:设置优化目标 6、回主界面,选择direct optimization模块 1、打开软件workbench 2、找到static structure,双击打开 3、选择材料 4、参数化建模 至此参数化建模就已经完成啦 注:印记面的创建 印记面一般是一个虚拟的区域,参与实际的网格划分,但是只是由于载.

python_AI_fans的博客 1万+

2026年VIVO嵌入式岗位高频面试题(含参考答案)

摘要:VIVO嵌入式岗位考核涵盖智能手机、IoT设备、芯片适配等方向,重点考察硬件底层交互、RTOS/Linux开发、C/C++功底与问题排查能力。题目按优先级排序,分硬件架构、RTOS、C/C++、数据结构、Linux实践、行业认知6大模块,共40道题。硬件部分涉及中断、ARM架构、加速技术、BSP开发等;RTOS部分区分硬/软实时系统;C/C++部分侧重内存管理、位操作;Linux部分考察常用命令;行业部分关注鸿蒙等系统理念。题目设计贴合实际工作场景,全面评估嵌入式开发能力。

Open 52

【缓存】数据库缓存

数据库缓存

秋之回忆Alex的博客 2126

STM32G0/G4电机控制中三角函数与浮点运算优化实战

三角函数(sin/cos)和浮点运算是电机矢量控制(FOC)的核心基础,直接影响Clark/Park变换、SVPWM及观测器的实时性与精度。在资源受限的MCU上,标准math.h库因无硬件FPU支持而引发严重时序抖动,导致电流环延迟、转矩脉动增大甚至系统复位。通过硬件加速(如STM32G4的CORDIC协处理器)或定制化定点算法(如STM32G0的查表+线性插值),可将sin/cos计算从数十微秒压缩至1–3 μs量级,提升30倍以上效率。该方案广泛适用于BLDC/PMSM驱动、伺服控制及高动态响应嵌入式运

weixin_35751412的博客 109

缓存和DB的一致性

打发时间-东如何保证缓存和DB的一致性问题什么时候需要使用缓存?为什么是高可用?什么时候清理缓存?定时清理缓存DB数据有修改如何正确使用缓存(今天的重点)方案1(先删除缓存,再去修改DB)方案2(队列+锁)方案3(DB行锁)方案4(半事务)方案5(自研)总结 如何保证缓存和DB的一致性问题 在公司还碰见有人竟然不知道这个问题,或者是想的太简单了。 简单的提几个问题,如果你都知道了就不用往下看了 一定要保证缓存和DB一致性么? 缓存一定要设置超时时间么? 更新数据,先更新缓存还是DB? 查询数据,先查缓存,

帅东's Blog 978

【人工智能】大模型可以分为L0层:基础大模型/通用大模型、L1层:行业大模型、L2层:细分场景模型三个层级

大模型确实可以分为L0、L1、L2三个层级,这种分层架构不仅有助于提升模型的泛化能力和适应性,还能更好地满足不同行业和场景的需求。华为盘古大模型的分层架构(L0、L1、L2)在多个证据中得到了详细描述和验证。例如,华为云盘古大模型3.0明确分为L0基础大模型、L1行业大模型和L2场景模型三层架构。此外,其他来源也一致支持这一分层架构,如用友网络的企业服务大模型、智谱AI的GLM-4系列等。

奶爸的编程之路,也就一周冷个三天 3980

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

缓存与数据库的一致性

● 当选择了一致性(C)的时候,如果因为消息丢失、延迟过高发生了网络分区,部分节点无法保证特定信息是最新的,那么这个时候,当集群节点接收到来自客户端的写请求时,因为无法保证所有节点都是最新信息,所以系统将返回写失败错误,也就是说集群拒绝新数据写入。● 当选择了可用性(A)的时候,系统将始终处理客户端的查询,返回特定信息,如果发生了网络分区,一些节点将无法返回最新的特定信息,它们将返回自己当前的相对新的信息。三个策略都存在缺陷,应该先改数据库,再删缓存,一般会放弃一定的一致性,追求最终一致。

2301_80092713的博客 5615

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

如何保障缓存和数据库的一致性(超详细案例)

高并发和海量数据下的缓存和数据库一致性实战方案,看完起飞

程序员囧辉 9830

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

一文搞懂缓存和数据库的一致性问题(全面总结)

缓存是我们经常用到的,而如何解决缓存和数据库的一致性也是一个挺让人头疼的问题。

lans_g的博客 8930

没有最好,只有合适——缓存和DB的一致性问题

BG:后端秋招选手,个人公众号TccodeT,欢迎关注,一起交流!本篇文章参考自http://kaito-kidd.com/2021/09/08/how-to-keep-cache-and-consistency-of-db/,写写自己的理解,欢迎留言发表你的看法。

C_go_go_go的博客 1143

redis 与 DB 的一致性 7 种策略

使用(Redis)缓存主要是利用 缓存( Redis)高性能的特性减少DB的重复查询就是数据需要多次查询,并且每次查询的结果是相同的,这时候加到缓存中,可以拦截大量的请求在缓存层,减少db的请求压力举个例子一些 IM 系统的总的 QPS 有几十万(qq,wx 这些)但是每个人接受的消息是不同的,并且消息是一次性消费的,所以针对单行消息而言,QPS 是小于 1 的并且是一次性消费,不涉及多次重复查询,即使总的 QPS 非常高,也不会使用缓存(IM 系统会使用Redis,但是不是做缓存使用的)

dengjiayue的博客 1869

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

目录 先删缓存,再更新数据库 解决方案 延时双删 先更新数据库,再删除缓存 解决方案 消息队列 进阶版消息队列 其他解决方案 设置缓存过期时间 为什么是删除,而不是更新缓存? 总结 对于缓存和数据库的操作,主要有以下两种方式。 先删缓存,再更新数据库 先删除缓存,数据库还没有更新成功,此时如果读取缓存,缓存不存在,去数据库中读取到的是旧值,缓存不一致发生。 解决方案 延时双删 延时双删的方案的思路是,为了避免更新数据库的时候,其他线程从缓存中读取不到数据,就在更新完数

javaTalk 4418

如何保证数据库和缓存的一致性

引入redis缓存后,怎么保证redis和数据库之间的数据一致性?

christmassss的博客 1575

数据库和缓存的一致性问题

一旦决定使用缓存,那必然要面临一致性问题,任何一种解决方案都无法保证绝对意义上的数据一致性。“性能和一致性就像天平的两端,无法做到都满足要求。”缓存和数据库的一致性问题不是一成不变的,分析一致性问题,需要考虑以下3点缓存数据库操作的。缓存有两种模式读写缓存、只读缓存。读写缓存若要对数据进行,需要在Cache进行。同时根据采取的写回策略,决定是否同步写回DB。只读缓存若要对数据进行,只需在DB进行。同时根据缓存更新策略,决定何时更新或者删除。...

weixin_42128977的博客 1199

Redis缓存策略之缓存和数据库的一致性

小概率的情况下,比如在线程一,查缓存时刚好没有数据,于是到数据库查到了数据,在此之后,又有一个线程二在更新数据,它先更新数据库就删除缓存,此时缓存数据依然没有,线程二删完缓存后,线程一写入缓存,线程一写入的是以前的数据,而线程二更新了数据,导致了不一致性,但是这种情况概率很低,线程一在查询数据库到写入缓存所用时间是非常小的,很难在穿插于另一个进程的更新操作。当数据更新时,保证数据库和缓存的一致性,会遇到是先删除缓存,再操作数据库还是先操作数据库,再删除缓存的问题。对于动态数据,可以考虑LRU或LFU策略。

m0_63469711的博客 1109

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

MySQL与Redis的数据一致性如何保证?一文学透

Chos1n__的博客 668
上一篇: java8 流式写法那些事
下一篇: 茅台识别方法
大树叶
博客等级 码龄12年 1171粉丝 664原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值