首页 > 其他分享 >缓存雪崩/穿透/击穿/失效原理图/14种缓存数据特征+10种数据一致性方案(专家篇)

缓存雪崩/穿透/击穿/失效原理图/14种缓存数据特征+10种数据一致性方案(专家篇)

时间:2024-09-30 16:49:56浏览次数:10  
标签:10 缓存 14 数据库 原理图 更新 场景 一致性 数据

在当今数据驱动的互联网时代,缓存成为了提升应用性能的关键技术。面对海量用户请求,如何通过缓存策略有效减轻数据库压力、降低响应延迟?本文深入探讨了缓存雪崩、缓存穿透、缓存击穿等常见问题,并提供了全面的解决方案。通过实际案例分析,揭示了缓存设计的最佳实践,确保数据一致性的同时,最大化系统吞吐量。让我们一起探索缓存的奥秘,为构建高效、稳定的系统架构打下坚实基础。

肖哥弹架构 跟大家“弹弹” 缓存,关注公号回复 'mvcc' 获得手写数据库事务代码

欢迎 点赞,关注,评论。

关注公号Solomon肖哥弹架构获取更多精彩内容

历史热点文章

1、缓存应用设计

图说明

  • 客户端:用户的请求起点。

  • 应用服务器:处理业务逻辑,决定是否访问缓存或数据库。

  • 本地缓存:应用服务器上的缓存,用于存储频繁访问的数据,减少对分布式缓存或数据库的访问。

  • 分布式缓存:跨多个应用服务器共享的缓存,用于提供更高的扩展性和可用性。

  • 数据库:数据的持久存储层,当缓存未命中时,从这里获取数据。

  • 更新缓存:在数据更新时,同步更新缓存以保持数据一致性。

2、 缓存特性

  1. 快速访问:缓存通常存储在内存中,访问速度远快于磁盘或数据库,这可以显著提高数据检索的速度。

  2. 减轻数据库负载:通过存储频繁访问的数据,缓存可以减少对数据库的直接查询,从而降低数据库的负载和压力。

  3. 提高性能:缓存可以减少系统的响应时间,提高整体性能,特别是在高流量的情况下。

  4. 数据局部性原理:缓存利用了计算机科学中的局部性原理,即最近访问的数据项在未来也可能被访问。

  5. 可扩展性:通过增加缓存层,系统可以更容易地扩展以应对更多的用户和请求。

  6. 容错性:缓存可以作为数据源的一层保护,即使数据源暂时不可用,缓存中的数据仍然可以被访问。

  7. 数据一致性:虽然缓存可以提高性能,但它也带来了数据一致性的挑战。需要策略来确保缓存数据与原始数据源保持同步。

  8. 多种缓存策略:有多种缓存策略,如最近最少使用(LRU)、先进先出(FIFO)、时效性过期等,可以根据不同的应用场景选择最合适的策略。

  9. 分布式缓存:对于大型系统,可以使用分布式缓存来跨多个服务器共享缓存数据,提供更高的可用性和可扩展性。

3、业务缓存数据特征

  1. 高读取频率

    • 特征:缓存那些被频繁读取的数据,可以显著减少对后端数据库的访问压力。

    • 业务案例:电商平台的商品详情页,如亚马逊或淘宝,用户频繁查看商品信息,这些信息变化不频繁,因此可以被缓存以减少数据库访问。

  2. 相对静态

    • 特征:不经常改变的数据,如产品信息、用户配置文件等,适合缓存,因为它们不需要频繁更新。

    • 业务案例:在线教育平台的课程介绍,如Coursera或Udemy,课程的描述和大纲在发布后很少改变,可以缓存这些数据以加快访问速度。

  3. 不涉及复杂事务

    • 特征:对于那些不涉及复杂事务处理的数据,缓存可以提供快速读取,而不用担心一致性问题。

    • 业务案例:网站的静态内容,如HTML页面、CSS样式表和JavaScript文件,它们不涉及后端逻辑,适合使用CDN缓存。

  4. 可预测性

    • 特征:可预测的数据访问模式,如特定时间段内的热点数据,可以通过缓存提前准备。

    • 业务案例:新闻网站在重大新闻事件发布时,可以预测到某些新闻页面的访问量会激增,提前将这些页面缓存起来。

  5. 大数据量

    • 特征:大量数据的聚合结果或计算密集型操作的结果,缓存这些数据可以减少重复计算。

    • 业务案例:金融交易分析平台,如股票交易数据的实时分析结果,这些结果涉及大量数据计算,缓存这些聚合结果可以提高响应速度。

  6. 热点数据

    • 特征:某些数据项可能比其他数据更受欢迎,成为系统中的热点,这些数据非常适合缓存。

    • 业务案例:社交媒体平台,如Twitter或Facebook,某些热门话题或趋势的页面访问量巨大,缓存这些热点数据可以减轻服务器压力。

  7. 读取成本高

    • 特征:从数据库或其他存储系统中读取成本较高的数据,缓存可以减少这种成本。

    • 业务案例:在线视频平台,如Netflix或YouTube,视频元数据的读取成本较高,缓存这些数据可以减少数据库的压力。

  8. 写入后读取

    • 特征:数据写入后通常会被立即读取,这种模式适合缓存,因为可以减少对原始数据源的访问。

    • 业务案例:在线购物车,用户添加商品到购物车后,通常会立即查看购物车,缓存购物车数据可以加快访问速度。

  9. 数据一致性要求不高

    • 特征:对于那些可以容忍短时间数据不一致的业务场景,缓存可以提供性能上的优化。

    • 业务案例:内容管理系统,如WordPress,文章的草稿版本可以缓存,因为它们不需要实时一致性。

  10. 数据预热

    • 特征:对于需要在系统启动或特定事件后立即可用的数据,缓存可以用于数据预热。

    • 业务案例:电子商务网站在大型促销活动(如618或双十一)前,可以预先加载和缓存促销商品的信息。

  11. 过期数据可接受

    • 特征:如果数据过期后可以重新生成或从数据源重新加载,那么这些数据适合缓存。

    • 业务案例:实时公交或地铁时刻表,虽然时刻表会定期更新,但短时间内的过期数据对于用户来说通常是可以接受的。

  12. 数据粒度

    • 特征:细粒度的数据(如单个对象)和粗粒度的数据(如数据集合)都可以缓存,但需要根据访问模式和更新频率来决定。

    • 业务案例:用户个人资料,如GitHub或微信,用户的个人资料页面可以缓存,因为它包含了用户信息的细粒度数据。

  13. 可序列化

    • 特征:可以轻松序列化和反序列化的数据,因为缓存通常需要将数据在网络中传输或在进程间共享。

    • 业务案例:RESTful API服务,如微服务的API,返回的JSON格式数据可以轻松序列化和反序列化,适合缓存。

  14. 独立性

    • 特征:那些不依赖于其他数据项的数据,因为缓存数据时,需要考虑数据之间的依赖关系。

    • 业务案例:天气预报服务,每个地区的天气信息相对独立,可以单独缓存,而不依赖于其他地区的天气数据。

4、缓存数据一致性方案

  1. 缓存失效(Cache Expiration)

    • 方案:为缓存数据设置过期时间,过期后缓存自动失效,下一次访问时从数据库加载最新数据。

    • 一致性:最终一致性,不能保证实时一致性,但可以减少数据不一致的时间窗口。

    • 适用场景:适用于数据更新频率不高,对数据实时性要求不高的场景。

    • 优点:简单易实现,减轻数据库压力。

    • 缺点:存在数据不一致的窗口期,对实时性敏感的业务不适用。 

  2. 写入时清除缓存(Write Through Cache)

    • 方案:数据更新时,同时更新缓存和数据库,确保两者数据一致。

    • 一致性:强一致性,但会增加写操作的延迟。

    • 适用场景:适用于对数据一致性要求极高的场景,如金融交易。

    • 优点:保证了数据的强一致性。

    • 缺点:写操作性能受影响,增加了系统的复杂性。 

  3. 延迟写入(Write Behind Cache)

    • 方案:数据更新时,先更新缓存,异步批量写入数据库。

    • 一致性:短暂不一致,存在数据丢失的风险,但可以提高写操作的性能。

    • 适用场景:适用于写操作频繁且对数据实时性要求不高的场景。

    • 优点:提高了写操作的性能,减轻了数据库的压力。

    • 缺点:数据可能不一致,存在数据丢失的风险。 

  4. 消息队列(Message Queue)

    • 方案:数据更新时,通过消息队列异步更新缓存,确保数据库和缓存的更新操作解耦。

    • 一致性:最终一致性,通过消息队列的确认机制来保证数据的最终同步。

    • 适用场景:适用于分布式系统,需要异步处理数据更新的场景。

    • 优点:提高了系统的伸缩性和响应速度,降低了直接操作数据库的压力。

    • 缺点:增加了系统的复杂性,需要处理消息丢失和重复的问题。 

  5. 发布订阅模式(Pub/Sub)

    • 方案:数据库更新时,发布变更事件,缓存订阅并响应这些事件来更新数据。

    • 一致性:最终一致性,依赖于事件的传播速度和订阅者的响应时间。

    • 适用场景:适用于分布式系统中,需要实时更新多个服务或组件的场景。

    • 优点:实现了数据的实时更新,提高了系统的响应速度。

    • 缺点:需要额外的发布订阅系统支持,增加了系统复杂性。 

  6. 版本号或CAS(乐观锁)

    • 方案:缓存和数据库中的数据都有版本号或CAS值,更新数据时检查版本号或CAS值是否一致。

    • 一致性:强一致性,适用于高并发场景,但增加了操作的复杂性。

    • 适用场景:适用于高并发且需要严格一致性的业务场景。

    • 优点:保证了数据的强一致性,适用于并发更新频繁的环境。

    • 缺点:增加了操作的复杂性,可能会影响性能。 

  7. 数据库事务(Transactional Cache)

    • 方案:将缓存操作纳入数据库事务中,确保缓存和数据库的一致性。

    • 一致性:强一致性,但可能会牺牲一些性能。

    • 适用场景:适用于需要严格事务控制的场景,如金融、会计系统。

    • 优点:保证了数据的强一致性。

    • 缺点:可能会降低性能,增加了系统的复杂性。 

  8. 双写一致性(Double Write)

    • 方案:数据更新时,先写入数据库,再写入一个临时的队列,然后从队列中更新缓存。

    • 一致性:最终一致性,通过队列确保数据最终被写入缓存。

    • 适用场景:适用于对数据一致性要求高,且需要异步处理的场景。

    • 优点:通过队列机制确保了数据的最终一致性。

    • 缺点:增加了系统的复杂性,可能会引入延迟。 

  9. 缓存穿透保护(Cache Penetration Protection)

    • 方案:使用布隆过滤器等机制,防止对数据库的无效查询,同时缓存空结果。

    • 一致性:最终一致性,通过缓存空结果减少对数据库的访问。

    • 适用场景:适用于需要防止大量无效请求穿透到数据库的场景。

    • 优点:减少了对数据库的无效访问,保护了数据库。

    • 缺点:增加了内存消耗,需要维护布隆过滤器。 

  10. 热点数据保护(Hot Data Protection)

    • 方案:对频繁更新的热点数据使用锁或其他同步机制,防止并发写入导致的数据不一致。

    • 一致性:强一致性,但可能会降低热点数据的并发性能。

    • 适用场景:适用于热点数据更新频繁,且对数据一致性要求高的场景。

    • 优点:保证了热点数据的一致性。

    • 缺点:可能会降低热点数据的并发性能,增加了锁的开销。

5、缓存失效场景

5.1 缓存雪崩

想象一下,你正在网上愉快地购物,突然间,大量的用户同时涌入,他们都想快点看到商品信息。这时,如果所有的用户请求都直接打到数据库上,数据库可能就会像被雪崩一样压垮。缓存雪崩就是指在高流量下,缓存数据同时失效,导致大量请求直接访问数据库,造成数据库压力过大。 

解决方案:

  • 设置不同的过期时间:让缓存数据的过期时间错开,避免同时失效。

  • 使用高可用架构:比如Redis集群,即使一个节点挂了,其他节点还能继续工作。

5.2 缓存穿透

缓存穿透是指一些不怀好意的用户,他们故意请求数据库中不存在的数据,比如查询一个不存在的用户ID。这样,缓存中不会有这些数据,每次请求都要去数据库查询,这就像有人拿着一把剑,一次次地刺穿你的防御。 

解决方案:

  • 布隆过滤器:在查询前先判断数据是否存在,不存在就直接返回,避免无用的查询。

  • 缓存空结果:将查询不到的数据也缓存起来,这样同样的请求就不会再次穿透到数据库了。

5.3 缓存击穿

缓存击穿和缓存穿透有点像,但它是指一个非常热门的数据在缓存中过期的那一瞬间,大量的请求同时到达,直接压垮了数据库。这就像是一群粉丝突然冲向一个刚下飞机的明星,场面一度失控。 

解决方案:

  • 设置热点数据不过期:对于非常热门的数据,可以不设置过期时间。

  • 使用互斥锁:在查询数据库前加锁,确保同一时间只有一个请求能查询数据库并回填缓存。

5.4 缓存失效

缓存失效是指缓存和数据库中的数据不一致。比如,你刚更新了数据库中的数据,但缓存中的数据还是旧的,这就导致了数据不一致的问题。 

解决方案:

  • 主动更新缓存:在更新数据库的同时,也更新缓存中的数据。

  • 使用消息队列:通过消息队列来监听数据变更,然后异步更新缓存。

6、热点数据重建

在缓存失效后,如何快速重建缓存,尤其是对于热点数据,这是一个问题。如果重建过程太慢,可能会导致缓存击穿。

解决方案:

  • 异步加载:在后台异步地重建缓存数据。

  • 分层缓存:使用多级缓存策略,比如内存缓存和磁盘缓存,这样可以在内存缓存失效时,先从磁盘缓存中读取数据。

标签:10,缓存,14,数据库,原理图,更新,场景,一致性,数据
From: https://blog.csdn.net/alises1314/article/details/142658463

相关文章

  • UOS 1070/Deepin 23环境下安装Master PDF Editor 5.8.35
    在UOS1070环境下,有福昕PDF编辑器可以使用,但是升级到Deepinv23之后,福昕编辑器就无法安装了,需要换工具。比较好用的就是MasterPDFEditor,安装注册也非常简单,现在写到这里,作为记录。#目前最方便安装的是master-pdf-editor-5.9.35版本,UOS和Deepinv23都支持wgethttps://code-......
  • 10789 神秘指数 数组 枚举 check
    解决思路 计算总和:首先计算所有神秘物品的神秘指数和 sum。 枚举分组数:从 n 开始枚举分组数 i,尝试将神秘物品分成 i 组。 检查分组可行性:对于每个分组数 i,检查是否可以将神秘物品分成 i 组且每组的神秘指数和相同。 输出结果:找到最小的可行分组数 i,......
  • 即插即用篇 | DenseNet卷土重来! YOLOv10 引入全新密集连接卷积网络 | ECCV 2024
    本改进已同步到YOLO-Magic框架!本文重新审视了密集连接卷积网络(DenseNets),并揭示了其在主流的ResNet风格架构中被低估的有效性。我们认为,由于未触及的训练方法和传统设计元素没有完全展现其能力,DenseNets的潜力被忽视了。我们的初步研究表明,通过连接实现的密集连接非常......
  • 即插即用篇 | YOLOv10 引入单头视觉Transformer模块 | CVPR 2024
    本改进已同步到YOLO-Magic框架!最近,高效的视觉Transformer在资源受限的设备上以低延迟表现出了出色的性能。传统上,它们在宏观层面上采用4×4的Patch嵌入和四阶段结构,而在微观层面上使用多头配置的复杂注意力机制。本文旨在通过内存高效的方式解决各个设计层面的计算冗余......
  • Oracle VM VirtualBox安装俄文win10系统
    1. 下载win10俄文版ISO官网地址:https://www.microsoft.com/zh-cn/software-download/windows10/ 双击运行后选择【我接收】进入下面界面 选择【为另一台电脑创建安装介质U盘、DVD或ISO文件】 取消勾选【对这台电脑使用推荐的选项】后,选择语言为俄语(参照本机“安装语言......
  • 触摸芯片SI314替代 GTX314L—低功耗14通道电容触摸传感器芯片 应用智能门锁动能世纪
    1.介绍Si314是一款具有自动灵敏度校准功能的14通道电容传感器,其工作电压范围为1.8~5.5v.Si314设置休眠模式来节省功耗,此时,功耗电流为[email protected]。Si314各个感应通道可实现独立使能、校准、灵敏度调节,可以确保可靠性,且具有自适应滤波功能,以应对各种噪音和环境变化。I2C串行接口可......
  • 题解:P6902 [ICPC2014 WF] Surveillance
    可以在cnblog中阅读。考虑弱化版链怎么做,每次选取左端点在当前位置前面的线段,跳到其中最大的右端点,可以维护一个数组表示起点为\(i\)的目标位置,可以做到\(O(n+k)\)。考虑多次询问一段区间\([l,r]\)的答案,这时如果暴力从\(l-1\)开始跳是\(O(n^2)\)的,只需要一个倍增数......
  • 在 win10 2021 LTSC 上安装配置 wsl2 和 ubuntu
    一、起因因为C盘文件太多,加之程序错误,导致C盘中出现许多无效项,注册列表也出现了很多的错误,因此对计算机系统进行了重装操作,并且不是由本地进行的重装,通过微软的服务器进行的重装。在重装之前,Windows的linux子系统,是完全正常使用的。但是在重装后试图重新安装Linux子系统,就发现......
  • 【hot100-java】【合并两个有序链表】
    记忆中,两个指针合并即可。 建立哨兵节点dum/***Definitionforsingly-linkedlist.*publicclassListNode{*intval;*ListNodenext;*ListNode(){}*ListNode(intval){this.val=val;}*ListNode(intval,ListNodenext......
  • 【hot100-java】【二叉树的层序遍历】
    二叉树BFS队列实现/***Definitionforabinarytreenode.*publicclassTreeNode{*intval;*TreeNodeleft;*TreeNoderight;*TreeNode(){}*TreeNode(intval){this.val=val;}*TreeNode(intval,TreeNodeleft,......