【分布式技术】分布式缓存技术-旁路缓存模式(Cache Aside Pattern)

旁路缓存模式介绍

    • 概述
      • 1. 读取操作(Read)
      • 2. 写入操作(Write)
      • 3. 一致性问题
      • 4. 解决方案
    • 适用于哪些场景?
    • 如何保证数据一致性?
      • 1. 延时双删策略
        • 具体是怎么工作的?
          • 写操作(更新或删除数据)
          • 读操作
          • 优点
          • 缺点
      • 实施注意事项
      • 2. 借助消息队列
      • 3. 读写穿透模式
        • 读写穿透模式具体是如何工作的?
          • 读操作(Read Through):
          • 写操作(Write Through):
          • 优点:
          • 缺点:
      • 4. 异步回写模式(Write Behind Caching)

概述

Cache Aside Pattern(旁路缓存模式)是一种常见的缓存更新策略,其核心思想是将缓存的读取和更新操作与数据库的操作分开处理。以下是Cache Aside Pattern的详细说明:

1. 读取操作(Read)

  • 步骤1:应用程序首先尝试从缓存中获取数据。如果缓存命中(Cache Hit),则直接返回缓存中的数据。
  • 步骤2:如果缓存未命中(Cache Miss),应用程序从数据库中读取数据。
  • 步骤3:将从数据库中读取的数据写入缓存,以便下次请求时可以直接从缓存中获取。
  • 优点:按需加载数据到缓存,减少数据库的直接访问次数,提高性能。
  • 缺点:首次请求数据时,缓存未命中会导致额外的数据库访问延迟。

2. 写入操作(Write)

  • 步骤1:应用程序直接更新数据库。
  • 步骤2:更新数据库后,删除缓存中对应的数据项,使得缓存失效。这样,下次读取时会从数据库中加载最新数据并更新缓存。
  • 优点:通过删除缓存项而不是更新缓存,避免了缓存数据与数据库数据不一致的问题。
  • 缺点:可能会因为频繁的写操作而导致缓存命中率降低,影响性能。

3. 一致性问题

Cache Aside Pattern并不能保证强一致性,因为存在一个时间窗口,在这个时间窗口内,缓存和数据库的数据可能会不一致。例如,如果一个请求更新了数据库但还没来得及删除缓存,另一个请求可能读取到旧的缓存数据。

4. 解决方案

  • 解决方案1:对于热点数据,可以提前将它们加载到缓存中,以减少缓存未命中的情况。
  • 解决方案2:对于需要强一致性的场景,可以在更新数据库的同时更新缓存,或者使用分布式锁来保证更新操作的原子性。
  • 解决方案3:对于可以接受短暂不一致的场景,可以给缓存设置一个较短的过期时间,这样即使数据不一致,影响也很小。

Cache Aside Pattern适用于读多写少的场景,并且可以根据具体的业务需求和数据一致性要求来调整策略。通过合理地使用Cache Aside Pattern,可以有效地提高系统的性能和响应速度,同时减少对数据库的直接访问压力。

适用于哪些场景?

Cache Aside Pattern(旁路缓存模式)适用于以下场景:

  1. 读多写少的场景:Cache Aside Pattern特别适合于那些读操作远多于写操作的应用场景。在这种场景下,通过缓存可以显著减少对数据库的访问次数,提高系统的响应速度和性能。

  2. 数据更新不频繁的场景:如果数据变化不频繁,缓存未命中的情况相对较少,这样可以减少因缓存未命中导致的额外数据库访问,提高系统效率。

  3. 对数据一致性要求不是非常严格的应用:由于Cache Aside Pattern在更新数据时只是删除缓存,而不是更新缓存中的数据,因此可能会存在一个短暂的时间窗口,期间内缓存和数据库的数据可能不一致。所以,对于那些对数据一致性要求不是非常高的应用,Cache Aside Pattern是一个合适的选择。

  4. 不可预测的加载资源需求:该模式使得系统可以按需加载数据,而不需提前预设哪些数据可能需要被获取,适用于加载资源需求不可预测的情况。

  5. 应用程序可以容忍一定程度的数据不一致性:在某些应用中,可以允许数据在缓存和数据库间存在短暂的不一致性,这种情况下,Cache Aside Pattern可以提供较好的性能和灵活性。

  6. 高并发场景下的读性能优化:在高并发场景下,读操作的性能至关重要,Cache Aside Pattern通过减少对数据库的直接访问,可以提高系统的读性能。

综上所述,Cache Aside Pattern适用于那些读操作频繁、数据更新不频繁、对数据一致性要求相对宽松的应用场景。通过合理使用Cache Aside Pattern,可以有效地提高系统的性能和响应速度,同时减少对数据库的访问压力。

如何保证数据一致性?

Cache Aside Pattern(旁路缓存模式)在保证数据一致性方面面临一些挑战,但可以通过以下几种策略来解决或缓解这些问题:

1. 延时双删策略

这是一种常用的解决策略,用于处理高并发情况下可能出现的缓存与数据库不一致的问题。具体步骤如下:

  • 删除缓存:当数据发生变更时,首先删除缓存中的数据。
  • 更新数据库:然后对数据库进行更新操作。
  • 再次删除缓存:在一定时间后(例如1秒),再次删除缓存中的数据,以确保在这段时间内的读请求能够从数据库中读取最新数据,并更新到缓存中。这种策略可以减少因缓存未及时更新而导致的数据不一致问题。
具体是怎么工作的?

延时双删策略是解决Redis缓存与数据库不一致问题的一种常见方法,特别适用于写操作频繁的场景。以下是延时双删策略的具体工作流程:

写操作(更新或删除数据)
  1. 更新数据库:当数据发生变更时,首先直接更新数据库中的记录。

  2. 立即删除缓存:在数据库更新操作之后,立即删除Redis缓存中对应的数据项。这一步是为了确保在下一次读取操作发生时,能够读取到最新的数据。

  3. 延时删除缓存:由于在删除缓存之后,可能还会有一些请求在处理中,这些请求可能仍然持有旧的缓存数据。为了确保这些请求能够处理完成,可以设置一个短暂的延时(例如几百毫秒到几秒),在延时过后再次删除缓存中的数据。

读操作
  1. 查询缓存:在读取数据时,首先查询缓存。

  2. 缓存未命中:如果缓存中没有找到数据(缓存未命中),则查询数据库。

  3. 加载到缓存:将查询到的数据加载回缓存中,以便后续的读操作可以直接从缓存中获取数据。

优点
  • 减少缓存击穿:通过延时删除缓存,可以减少因为缓存击穿导致的数据库压力。

  • 提高数据一致性:通过两次删除缓存,可以提高缓存和数据库之间的数据一致性。

缺点
  • 可能的数据不一致:在延时期间,缓存和数据库之间仍然可能存在短暂的不一致状态。

  • 复杂性增加:需要额外的逻辑来处理延时删除,增加了系统的复杂性。

实施注意事项

  • 延时时间的选择:延时时间的选择需要根据业务场景和系统性能进行权衡,既要确保数据一致性,又要避免对系统性能造成太大影响。

  • 高并发处理:在高并发场景下,需要考虑并发控制,避免多个请求同时更新数据时导致的问题。

  • 监控和日志:实施延时双删策略时,应该有足够的监控和日志记录,以便在出现问题时能够快速定位和解决。

延时双删策略是一种折中的方案,它在保证数据一致性的同时,也考虑到了系统的性能和复杂性。在实际应用中,需要根据具体的业务需求和系统特点来调整和优化这一策略。

2. 借助消息队列

通过引入消息队列(如Kafka、RabbitMQ等)来异步处理缓存更新操作。具体步骤如下:

  • 更新数据库:首先对数据库进行更新操作。
  • 发送消息到队列:将更新操作发送到消息队列中。
  • 异步处理:通过消费者监听消息队列,异步处理缓存的更新或删除操作。这种方法可以确保在高并发情况下缓存和数据库的一致性,同时避免了直接操作缓存可能带来的并发问题。

3. 读写穿透模式

在Cache Aside Pattern中,可以结合读写穿透模式来进一步保证数据一致性。读写穿透模式中,所有数据的读写操作都通过一个缓存服务(Cache Provider)来进行,这个服务会负责维护缓存和数据库的一致性。具体步骤如下:

  • 读操作:从缓存中读取数据,如果缓存未命中,则从数据库中读取数据并写入缓存。
  • 写操作:更新数据时,先更新数据库,然后由缓存服务负责更新缓存,保持数据一致性。
读写穿透模式具体是如何工作的?

读写穿透模式(Read/Write Through Pattern)是一种缓存策略,它将缓存与数据库紧密结合,使得应用程序在读写数据时都通过缓存层进行操作。以下是读写穿透模式的具体工作流程:

读操作(Read Through):
  1. 查询缓存:应用程序首先尝试从缓存中查询数据。
  2. 缓存未命中:如果缓存中没有找到数据(缓存未命中),缓存层会代表应用程序去数据库查询数据。
  3. 加载到缓存:查询到的数据会被写入缓存,以便之后的请求可以直接从缓存中读取。
  4. 返回数据:缓存层将查询到的数据返回给应用程序。
写操作(Write Through):
  1. 写入数据库:应用程序通过缓存层直接写入数据库。
  2. 同步更新缓存:在写入数据库的同时,缓存层也会更新缓存中的数据,确保缓存和数据库的数据一致性。
  3. 返回结果:写入操作完成后,缓存层将结果返回给应用程序。
优点:
  • 数据一致性:通过缓存和数据库之间的同步操作,确保数据一致性。
  • 简单操作:应用程序无需直接与数据库交互,通过缓存层完成读写操作,简化业务逻辑。
  • 读写效率高:通过缓存层直接操作数据库和缓存,减少应用程序和数据库之间的交互,提高读写效率。
缺点:
  • 性能受限:由于每次读写操作都需要经过缓存层和数据库,可能会受到数据库性能的影响,导致性能瓶颈。
  • 依赖性强:缓存层和数据库之间的紧密联系使得系统对缓存层的依赖性较高,一旦缓存出现问题可能会影响数据库操作。
  • 实现复杂:需要确保缓存和数据库之间的数据同步,增加了系统的复杂性。

读写穿透模式适用于读多写多的场景,特别是那些对数据一致性要求较高的场景。通过使用读写穿透模式,可以有效地减轻应用程序的职责,由缓存服务负责数据的读取和写入,同时保持数据的一致性。

4. 异步回写模式(Write Behind Caching)

虽然这不是Cache Aside Pattern的直接解决方案,但在某些场景下可以作为补充。在这种模式下,数据首先被写入缓存,然后异步地批量写入数据库,这样可以减少对数据库的直接写操作,提高性能。需要注意的是,这种模式可能会牺牲一定的数据一致性,因为存在数据只在缓存中的情况。

通过上述策略,可以在一定程度上保证Cache Aside Pattern下缓存与数据库的数据一致性。每种策略都有其适用场景和优缺点,需要根据具体的业务需求和一致性要求来选择适合的策略。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/915411.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

在arm64架构下, Ubuntu 18.04.5 LTS 用命令安装和卸载qt4、qt5

问题:需要在 arm64下安装Qt,QT源码编译失败以后,选择在线安装! 最后安装的版本是Qt5.9.5 和QtCreator 4.5.2 。 一、ubuntu安装qt4的命令(亲测有效): sudo add-apt-repository ppa:rock-core/qt4 sudo apt updat…

AIGC学习笔记(5)——AI大模型开发工程师

文章目录 AI大模型开发工程师004 垂直领域的智能在线搜索平台1 智能在线搜索平台需求分析大模型不够“聪明”增强大模型的方式需求分析2 智能在线搜索平台方案设计方案设计技术选型大模型版本GLM-4大模型注册使用Google Cloud平台注册创建可编程的搜索引擎3 智能在线搜索平台代…

【React】状态管理之Redux

🌈个人主页: 鑫宝Code 🔥热门专栏: 闲话杂谈| 炫酷HTML | JavaScript基础 ​💫个人格言: "如无必要,勿增实体" 文章目录 状态管理之Redux引言1. Redux 的核心概念1.1 单一数据源(Single Sou…

Unity类银河战士恶魔城学习总结(P124 CharacterStats UI玩家的UI)

【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili 教程源地址:https://www.udemy.com/course/2d-rpg-alexdev/ 本章节实现了玩家属性栏,仓库,物品栏UI的制作 UI_StatSlot.cs 这个脚本是用来在Unity的UI上显示玩家属性&#xf…

蓝桥杯每日真题 - 第7天

题目:(爬山) 题目描述(X届 C&C B组X题) 解题思路: 前缀和构造:为了高效地计算子数组的和,我们可以先构造前缀和数组 a,其中 a[i] 表示从第 1 个元素到第 i 个元素的…

Llama旋转位置编码代码实现及详解

旋转位置编码RoPE 在旋转位置编码与Transformer和BERT之间的区别中介绍了旋转位置编码(RoPE)的特点和优势,这种输入长度动态可变的优势使得在Llama编码时,不需要掩码将多余的嵌入掩住。为了详细了解RoPE是如何实现的,…

WebSocket和HTTP协议的性能比较与选择

WebSocket和HTTP协议的性能比较与选择 引言: 在web应用开发中,无论是实时聊天应用、多人在线游戏还是实时数据传输,网络连接的稳定性和传输效率都是关键要素之一。目前,WebSocket和HTTP是两种常用的网络传输协议,它们…

WebRTC项目一对一视频

开发步骤 1.客户端显示界面 2.打开摄像头并显示到页面 3.websocket连接 4.join、new-peer、resp-join信令实现 5.leave、peer-leave信令实现 6.offer、answer、candidate信令实现 7.综合调试和完善 1.客户端显示界面 步骤:创建html页面 主要是input、button、vide…

GIS基础知识:WKT格式、WKB格式

什么是WKT格式? WKT(Well-Known Text)是一种用于描述地理空间几何对象的文本格式。 这种格式是由Open Geospatial Consortium(OGC)定义并维护的一种开放标准,主要用于在不同的GIS系统和数据库之间交换空间…

力扣(LeetCode)611. 有效三角形的个数(Java)

White graces:个人主页 🙉专栏推荐:Java入门知识🙉 🐹今日诗词:雾失楼台,月迷津渡🐹 ⛳️点赞 ☀️收藏⭐️关注💬卑微小博主🙏 ⛳️点赞 ☀️收藏⭐️关注💬卑微小博主…

Mac Nginx 前端打包部署

安装homebrew /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)" 安装Nginx brew install nginx nginx相关命令 nginx启动命令:nginx nginx -s reload #重新加载配置 nginx -s reopen #重启 nginx -s stop #…

利用VMware workstation pro 17安装 Centos7虚拟机以及修改网卡名称

通过百度网盘分享的文件:安装虚拟机必备软件 链接:https://pan.baidu.com/s/1rbYhDh8x1hTzlSNihm49EA?pwdomxy 提取码:omxy 123网盘 https://www.123865.com/s/eXPrVv-UsKch 提取码:eNcy 先自行安装好VMware workstation pro 17 设置虚拟机…

《实时流计算系统设计与实现》-Part 2-笔记

做不到实时 做不到实时的原因 实时计算很难。通过增量计算的方式来间接获得问题的(伪)实时结果,即使这些结果带有迟滞性和近似性,但只要能够带来尽可能最新的信息,那也是有价值的。 原因可分成3个方面: …

《C陷阱与缺陷》

文章目录 1、【词法陷阱】1.1 符号与组成符号间的关系1.1 与 1.3 y x/*p 与 y x/(*p),a-1 与 a - 1 与 a -1, 老版本编译器的处理是不同的,严格的ANSI C则会报错1.4 十进制的 076,会被处理为八进制,ANSI C禁止这种用法&#x…

初阶C++之C++入门基础

大家好!欢迎来到C篇学习,这篇文章的内容不会很难,为c的引入,c的重点内容将在第二篇的文章中讲解,届时难度会陡然上升,请做好准备! 我们先看网络上的一个梗:21天内⾃学精通C 好了&am…

Maven 构建项目

Maven 是一个项目管理和构建工具,主要用于 Java 项目。它简化了项目的构建、依赖管理、报告生成、发布等一系列工作。 构建自动化:Maven 提供了一套标准化的构建生命周期,包括编译、测试、打包、部署等步骤,通过简单的命令就可以执…

Android中桌面小部件的开发流程及常见问题和解决方案

在Android中,桌面小部件(App Widget)是应用程序可以在主屏幕或其他地方显示的一个可视化组件,提供简化信息和交互功能。Android桌面小部件的framework为开发者提供了接口,使得可以创建和更新小部件的内容。以下是Andro…

opencv(c++)----图像的读取以及显示

opencv(c)----图像的读取以及显示 imread: 作用:读取图像文件并将其加载到 Mat 对象中。参数: 第一个参数是文件路径,可以是相对路径或绝对路径。第二个参数是读取标志,比如 IMREAD_COLOR 表示以彩色模式读取图像。 返回值&#x…

马斯克万卡集群AI数据中心引发的科技涟漪:智算数据中心挑战与机遇的全景洞察

一、AI 爆发重塑数据中心格局 随着AI 技术的迅猛发展,尤其是大模型的崛起,其对数据中心产生了极为深远的影响。大模型以其数以亿计甚至更多的参数和对海量数据的处理需求,成为了 AI 发展的核心驱动力之一,同时也为数据中心带来了…

搭建Python2和Python3虚拟环境

搭建Python3虚拟环境 1. 更新pip2. 搭建Python3虚拟环境第一步:安装python虚拟化工具第二步: 创建虚拟环境 3. 搭建Python2虚拟环境第一步:安装虚拟环境模块第二步:创建虚拟环境 4. workon命令管理虚拟机第一步:安装扩…