`

究竟先操作缓存,还是数据库?

阅读更多

缓存存储,也是数据的冗余

(1)数据库访问数据,磁盘IO,慢;

(2)缓存里访问数据,存操作,快;

(3)数据库里的热数据,可在缓存冗余一份;

(4)先访问缓存,如果命中,能大大的提升访问速度,降低数据库压力;

这些,是缓存的核心读加速原理。

但是,一旦没有命中缓存,或者一旦涉及写操作流程会比没有缓存更加复杂,这些是今天要分享的话题。

读操作,如果没有命中缓存,流程是怎么样的?

:如下图所示

(1)尝试从缓存get数据,结果没有命中;

(2)从数据库获取数据,读从库,读写分离;

(3)把数据set到缓存,未来能够命中缓存;

读操作的流程应该没有歧义。

写操作,流程是怎么样的?

:写操作,既要操作数据库中的数据,又要操作缓存里的数据。

这里,有两个方案:

(1)先操作数据库,再操作缓存;

(2)先操作缓存,再操作数据库;

并且,希望保证两个操作的原子性,要么同时成功,要么同时失败。

这演变为一个分布式事务的问题,保证原子性十分困难很有可能出现一半成功,一半失败,接下来看下,当原子性被破坏的时候,分别会发生什么。

一、先操作数据库,再操作缓存

如上图,正常情况下:

(1)先操作数据库,成功;

(2)再操作缓存(delete或者set),也成功;

但如果这两个动作原子性被破坏:第一步成功,第二步失败,会导致,数据库里是新数据,而缓存里是旧数据,业务无法接受

画外音:如果第一步就失败,可以返回调用方50X,不会出现数据不一致。

二、先操作缓存,再操作数据库

如上图,正常情况下:

(1)先操作缓存(delete或者set),成功;

(2)再操作数据库,也成功;

画外音:如果第一步就失败,也可以返回调用方50X,不会出现数据不一致。

如果原子性被破坏,会发生什么呢?

这里又分了两种情况:

(1)操作缓存使用set

(2)操作缓存使用delete

使用set的情况第一步成功,第二步失败,会导致,缓存里是set后的数据,数据库里是之前的数据,数据不一致,业务无法接受

并且,一般来说,数据最终以数据库为准,写缓存成功,其实并不算成功。

使用delete的情况第一步成功,第二步失败,会导致,缓存里没有数据,数据库里是之前的数据,数据没有不一致,对业务无影响。只是下一次读取,会多一次cache miss。

画外音:此时可以返回调用方50X。

最终,先操作缓存,还是先操作数据库?

(1)读请求,先读缓存,如果没有命中,读数据库,再set回缓存

(2)写请求

(2.1)先缓存,再数据库

(2.2)缓存,使用delete,而不是set

 

 

http://www.sohu.com/a/240164656_178889

分享到:
评论

相关推荐

    究竟先操作缓存,还是数据库

    本文将深入探讨“究竟先操作缓存,还是数据库”的问题,并结合具体场景分析不同操作顺序的影响。 #### 一、缓存的基本原理 缓存是一种临时存储数据的技术,它通过将频繁访问的数据存储在快速存储介质(如内存)中...

    缓存与数据库一致性保证

    2. **先淘汰缓存,再写数据库**:在这种情况下,如果淘汰缓存成功但写数据库失败,则会引发一次缓存未命中,此时缓存中没有数据而数据库中是旧的数据。 接下来,我们通过一个具体的例子来说明第二种情况下的数据不...

    数据库缓存技术文档 缓存 数据库

    数据库缓存技术是一种提高系统性能的关键策略,尤其在高并发...综上所述,数据库缓存技术通过合理利用内存资源,减少了数据库I/O操作,提高了系统的整体性能。理解并正确应用缓存策略,对于优化数据库应用至关重要。

    带有缓存功能的mysqli数据库操作类

    "带有缓存功能的mysqli数据库操作类"是一个专门为PHP设计的实用工具,它将MySQLi数据库连接与缓存机制相结合,旨在优化数据库查询,减少不必要的数据库交互,从而提升整体性能。 MySQLi(Improved MySQL)是PHP中的...

    ASP.NET 数据库缓存

    除了基本的缓存操作,ASP.NET 2010还支持依赖性缓存,这意味着你可以设置缓存项依赖于数据库表或其他缓存项。当依赖项发生变化时,缓存项会自动失效。这可以通过`SqlCacheDependency`或`CacheItemDependency`类实现...

    经典Python面试题之数据库和缓存 共46道题.pdf

    经典Python面试题之数据库和缓存 Python是一种流行的编程语言,广泛应用于Web开发、数据分析、人工智能等领域。在Python开发中,数据库和缓存是两个重要的概念。本文将总结经典Python面试题之数据库和缓存,涵盖...

    linq 的全数据库缓存

    4. **数据更新处理**:当数据发生更改时(例如删除操作),不仅要更新数据库中的数据,还需要清除相关的缓存,确保缓存数据的一致性。这在示例代码中有明确体现,如调用`eee.Remove(CacheName);`后重新插入更新后的...

    在线聊天系统纯缓存无数据库

    【在线聊天系统纯缓存无数据库】是一种轻量级的实时通信解决方案,它采用单一的ASP文件,并且不依赖任何数据库存储数据,而是利用缓存技术来管理用户交互。这种设计使得系统的部署和维护变得简单,同时减少了对...

    Redis缓存数据库技术

    Redis缓存数据库技术是现代Web开发中不可或缺的一部分,它的高效、灵活和丰富的功能使得它在数据缓存、消息传递、计数器、排行榜等多个领域得到广泛应用。通过学习和实践Redis,开发者可以提升应用的性能和用户体验...

    实例--SQL Server数据库缓存依赖

    总的来说,这个实例将展示如何在SQL Server 2005或2008中设置和使用数据库缓存依赖,通过缓存数据库查询结果提高应用程序性能,同时确保当数据库中的数据发生变化时,缓存中的信息能及时更新。它将涉及到数据库查询...

    数据库与缓存深度学习完整版

    数据库与缓存是IT领域中的重要组成部分,特别是在高并发、大数据量的场景下,合理使用数据库缓存能够显著提升系统性能。本章将深入探讨数据库缓存的概念、作用、使用时机以及控制方法。 10.1. 什么是数据库缓存? ...

    内存数据库的CPU和缓存之高效管理

    内存数据库与传统的磁盘数据库系统不同,它不使用磁盘存储数据,而是直接在内存中进行读写操作,从而大幅度减少了访问延迟,并显著提升了数据处理速度。 CPU(中央处理单元)是计算机的核心部件之一,负责执行指令...

    27_如何保证缓存与数据库双写时的数据一致性?.zip

    6. **读写分离**:读操作直接从缓存获取数据,写操作则先更新数据库,再通知缓存更新。这里可以使用缓存失效策略,如定时刷新、LRU(Least Recently Used)淘汰等。 7. **分布式锁**:Java中的ZooKeeper、Redis都...

    如何保证缓存和数据库数据的一致性Java系列2021.pdf

    这种方法的理论基础在于,读操作的频率远高于写操作,读数据时直接操作数据库,写数据时只操作缓存,能够有效减轻数据库的压力。同时,由于数据不一致是短暂的,对于大多数应用场景是可以接受的。 然而,这种策略在...

    高并发场景下的缓存+数据库双写不一致问题分析与解决方案设计.docx

    也发送同一个 jvm 内部的队列中一个队列对应一个工作线程每个工作线程串行拿到对应的操作,然后一条一条的执行这样的话,一个数据变更的操作,先执行,删除缓存,然后再去更新数据库,但是还没完成更新此时如果一个...

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

    如何保证缓存和数据库数据的一致性 知识点: 缓存:读、写、更新、删除,这些操作可能失败; 数据库:读、写、更新、删除,这些操作可能失败。 面试题剖析 一般来说,如果允许缓存可以稍微的跟数据库偶尔有不一致的...

    分布式缓存--缓存与数据库强一致场景下的方案.doc

    在缓存与数据库强一致性的场景下,系统需要确保任何时刻,无论是从数据库还是缓存中读取数据,都能得到完全相同的结果。这种一致性也被称为线性一致性。 1. 场景分析: 秒杀系统是强一致性需求的一个典型例子。在...

    Redis缓存与数据库一致性解决方案1

    主要问题包括:数据更新时,先更新数据库再更新缓存可能导致缓存中的旧数据未被及时替换;或者删除缓存后,数据库的更新尚未完成,其他线程读取到的数据可能不一致。 为解决这些问题,有几种常见的解决方案: 1. *...

Global site tag (gtag.js) - Google Analytics