后端开发缓存篇之缓存及缓存模式的介绍

2023-11-18

一.什么是缓存:

缓存,简单说就是为了节约对原始资源重复获取的开销,而将结果数据副本存放起来以供获取的方式。

二.什么时候使用缓存

1.以 幂等和安全的方式对资源的获取操作

2.缓存数据必须是重复获取的:

     缓存能生效的本质是空间换时间

缓存的命中率: 把一批数据获取中,通过缓存获得数据的次数,除以总的次数,得到的结果,叫做缓存的命中率。

3. 缓存是为了解决“开销”的问题,开销包括:时间的开销、CPU、网络、I/O等资源的开销。

4. 缓存的存取其实不一定是“更快”的

5.缓存使用最常用的动机:(1) 一个是 latency,延迟(2) 另一个使用动机,是 throughput,吞吐量

三.缓存应用模式:

1. Cache-Aside(最常用的缓存模式)

  (1)获取数据: 

        应用先去查看缓存是否有所需数据;

        如果有,应用直接将缓存数据返回给请求方;

        如果没有,应用执行原始逻辑,例如查询数据库得到结果数据;

        应用将结果数据写入缓存。

  (2)更新数据:

        关键点一:必须先更新数据库-再令缓存失效:

(原因在于,如果先令缓存失效,那么在数据库更新成功前,如果有另外一个请求访问了缓存,发现缓存数据库已经失效,于是就会按照数据获取策略,从数据库中使用这个已经陈旧的数值去更新缓存中的数据,这就导致这个过期的数据会长期存在于缓存中,最终导致数据不一致的严重问题。)

        关键点二:数据库更新以后,需要令缓存失效,而不是更新缓存为数据库的最新值

(为什么呢?你想一下,如果两个几乎同时发出的请求分别要更新数据库中的值为 A 和 B,如果结果是 B 的更新晚于 A,那么数据库中的最终值是 B。但是,如果在数据库更新后去更新缓存,而不是令缓存失效,那么缓存中的数据就有可能是 A,而不是 B。因为数据库虽然是“更新为 A”在“更新为 B”之前发生,但如果不做特殊的跨存储系统的事务控制,缓存的更新顺序就未必会遵从“A 先于 B”这个规则,这就会导致这个缓存中的数据会是一个长期错误的值 A。)

  2. Read-Through

   (1)获取数据:

            应用向缓存要求数据;

            如果缓存中有数据,返回给应用,应用再将数据返回;

            如果没有,缓存查询数据库,并将结果写入自己;

            缓存将数据返回给应用。

这种情况下缓存系统彻底变成了它身后数据库的代理,二者成为了一个整体,应用的请求访问只能看到缓存的返回数据,而数据库系统对它是透明的。

虽然read-through和cache-aside非常相似,但至少有两个关键区别:

  1. 在cache-aside中,应用程序负责从数据库中获取数据并填充缓存。在read-through中,此逻辑通常由库或独立缓存提供程序支持。

  2. 与cache-aside不同,read-through cache中的数据模型不能与数据库中的数据模型不同

3. Write-Through

     主要用于处理数据更新的场景。

    (1)获取数据:

            应用要求缓存更新数据;

            如果缓存中有对应数据,先更新该数据;

            缓存再更新数据库中的数据;缓存告知应用更新完成。

    这里的一个关键点是,缓存系统需要自己内部保证并发场景下,缓存更新的顺序要和数据库更新的顺序一致。

  (数据更新的异常情形:如果缓存更新失败,直接返回失败,没有数据不一致的情况发生;如果缓存更新成功,数据库更新失败,这种情况下需要回滚缓存中的更新,或者干脆从缓存中删除该数据。)

    4. Write-Back

   数据写入缓存和数据库更新是异步完成的,即数据写入缓存后立即返回,数据库更新异步完成。

(这种方式带来的最大好处是拥有最大的请求吞吐量,并且操作非常迅速,数据库的更新甚至可以批量进行,因而拥有杰出的更新效率以及稳定的速率,这个缓存就像是一个写入的缓冲,可以平滑访问尖峰。另外,对于存在数据库短时间无法访问的问题,它也能够很好地处理。但是它的弊端也很明显,异步更新一定会存在着不可避免的一致性问题,并且也存在着数据丢失的风险(数据写入缓存但还未入库时,如果宕机了,那么这些数据就丢失了)

总结:缓存在实际项目中应用非常多,而最常用的缓存模式就是 Cache-Aside,所以深入理解 Cache-Aside是关键。

 

 

 

 

 

 

 

 

 

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

后端开发缓存篇之缓存及缓存模式的介绍 的相关文章

  • 图像创建从jpeg() PHP

    我正在使用 imagecreatefromjpeg 函数合并两张图片 现在我面临的问题是 当我使用服务器中的图片时 它工作正常 而当我使用其他网站的图片时 它不起作用 例如 当我使用这个 PHP 文件时http coolfbapps in
  • PHP 文件服务脚本:下载不可靠?

    这篇文章最初是关于 ServerFault 的一个问题 https serverfault com questions 131156 user receiving partial downloads https serverfault co
  • 将字符串的第一个字母大写(前面带有特殊字符) - PHP

    我想将字符串大写 例如 hello 我希望我的函数返回 Hello 我尝试过使用 regex 和 preg match 但没有运气 这是我之前的问题 与此相关 preg match 正在匹配两个字符 而它应该只匹配一个字符 https st
  • 如何改进 PHP 分页算法?

    我正在研究 PHP 中的分页算法 我可以猜测它需要改进的空间 所以我想对如何改进它有一些想法 无论是从 UI UX 的角度清理代码本身 还是你能想到的任何其他东西 该算法应输出如下所示的分页 1 2 3 6 7 8 97 98 99 or
  • 使用 ImapMailbox.php 按日期对 Imap 邮箱进行排序

    我有一个客户支持系统 它会在收到电子邮件时创建电子邮件 我曾经使用后缀和特殊配置来获取电子邮件以添加额外的功能 例如 我想包含从电子邮件发送的附件 系统不会执行此操作 而是创建一封带有主题的电子邮件 因此我可以通过匹配主题来包含附件 我使用
  • PHP DBlib PDO 问题

    我正在尝试通过 php 连接到 MSSQL 服务器 但我的 pdo 连接给我带来了困难和我不太理解的错误 我在下面粘贴的代码一周前运行得很好 突然间它就停止了 没有任何人进行任何更改 我仍然可以连接到服务器并直接从命令行运行查询 但我在 p
  • 提交简单 PHP 表单时出现禁止错误

    我有一个不复杂的问题 这似乎比应有的更复杂 我有一个简单的表单 用于向网站添加内容 有些字段需要输入html 然而 当您在表单的不同部分输入某些 html 元素时 它会认为它讨厌您并抛出禁止的 403 错误 这是下面的表格
  • PHP FTP_PUT 上传到目录

    我正在自学PHP 一本名为 PHP完全参考 PHP5 2 的书 我目前正在使用第 11 章 FTP 上传 删除 makedir 等 但遇到了一些本书未涵盖的问题 根据我的教科书 这是上传到服务器的简单代码 connect ftp conne
  • 项目链接在 Wamp 服务器上不起作用

    我正在另一台计算机上安装 Wamp 服务器来运行中型数据库和 UI 我已成功阻止 IIS 并将服务器路由到 Localhost 8080 但是每当我尝试从 localhost 主页访问我的项目时 在 www 文件中 我被重定向到页面未找到错
  • 在 PHP 中使用可变变量是不好的做法吗?

    例如 一个简单的MVC类型系统 api class method使用重写为 PHP 变量 htaccess nginx conf 然后做类似的事情
  • 使用活动目录对 Intranet 站点上的用户进行身份验证

    我建立了一个 内联网 站点 它有自己的登录系统 用户注册为新用户 并使用其上的用户名 密码登录该站点 但是 现在我想扩展它 让 Intranet 站点使用现有的 ActiveDirectory 进行身份验证 这就是我正在寻找的 前进 当用户
  • 如何使用 Google Calendar API 和官方 PHP 库创建全天活动?

    我有这个代码 event new Event event gt setSummary event summary event gt setLocation event location start new EventDateTime sta
  • 如何捕获反序列化异常?

    PHP 是否可以在以下情况下捕获异常 unserialize 产生错误 一个简单的方法是 ret unserialize foo if ret null Error case 但这不是最现代的解决方案 最好的方法是像前面提到的那样有一个自定
  • 根据重复值对 PHP 数组进行排序

    我有一个包含重复值的数组 我想对数组进行排序 以便重复次数最多的值出现在行中的第一个 这是我的数组的示例 array 1 2 3 2 1 2 2 我想对该数组进行排序 以便它根据重复项的数量对自身进行排序 如下所示 array 2 1 3
  • Twitch API - 无法使用 PHP 获取身份验证令牌

    stackoverflow 的成员们大家好 我不是一个喜欢寻求帮助的人 但在这种情况下 我认为这是解决我的问题的唯一方法 谷歌并没有给我太大帮助 所以 我的问题 我想使用 Twitch API 获取一些数据 听起来很容易 我希望是这样 下面
  • PHP 中正确的存储库模式设计?

    前言 我尝试在具有关系数据库的 MVC 架构中使用存储库模式 我最近开始学习 PHP 中的 TDD 并且我意识到我的数据库与应用程序的其余部分耦合得太紧密 我读过有关存储库并使用国际奥委会容器 http laravel com docs 4
  • Symfony2 - 在自定义验证器中调用 EmailValidator

    我正在创建一个自定义验证器约束来验证 联系人 类似于 John Doe 电子邮件受保护 gt 遵循Cookbook http symfony com doc current cookbook validation custom constr
  • 如何让php页面从html页面接收ajax post

    我有一个非常简单的表单 其中有一个名字输入字段 我捕获了表单数据 并使用标准 jQuery 发布方法通过 ajax 将其传输到 PHP 页面 但是 我根本无法从 PHP 页面获得任何在服务器端捕获数据的响应 我不确定我做错了什么或缺少什么
  • Laravel 5 Eloquent 在多个级别上将关系附加到 JSON

    因此 在模型中包含关系非常容易 例如 class User extends Model protected with roles class Role extends Model protected with permissions 当有对
  • 单元测试和静态方法

    阅读并学习单元测试 试图理解以下帖子 http misko hevery com 2008 12 15 static methods are death to testability 这解释了静态函数调用的困难 我不太清楚这个问题 我一直认

随机推荐

  • Unity C# OnTriggerEnter()理解

    网上看了不少文档 但是实在是看不太明白 所以就索性花了一个晚上 终于算是弄明白了OnTriggerEnter 函数 自认为我理解的没错 如果有错误的地方 还烦请指正 举例说明 ColliderTest cs代码 void OnTrigger
  • JQuery扩展 — div大小改变触发事件

    以下为js代码 function window undefined var elems jq resize resize extend resize timeout id str setTimeout setTimeout str resi
  • mySql查看和修改字符编码

    http blog sina com cn s blog 70e79b050101dhnx html MySQL的默认编码是Latin1 不支持中文 要支持中午需要把数据库的默认编码修改为gbk或者utf8 1 需要以root用户身份登陆才
  • Inno Setup 如何让生成的setup.exe文件有管理员权限

    首先 在 Setup 段 PrivilegesRequired admin 然后 找到INNO安装目录下的SetupLdr e32文件 将程序中的Manifest更改一下 用reshacker这类工具改 这样运行程序的时候 Windows
  • AI实战营第二期 笔记5——MMPretrain代码课

    文章目录 摘要 MMPreTrain实战 安装 推理 OR 使用API 数据集 训练与测试 微调 摘要 MMPretrain 是一个全新升级的预训练开源算法框架 旨在提供各种强大的预训练主干网络 并支持了不同的预训练策略 MMPretrai
  • angular2 router中的路由跳转navigate

    navigate是Router类的一个方法 主要用来跳转路由 函数定义 navigate commands any extras NavigationExtras Promise
  • 人工智能(crawler)—— 爬虫综合

    目录 内容简介 第一章 爬虫简介 1 1 什么是网络爬虫 1 1 1 爬虫的简单定义 1 1 2 爬虫的分类 1 2 为什么需要爬虫 1 2 1 爬虫的用途 1 2 2怎么做爬虫 第二章 爬虫的基本常识 2 1 爬虫的合法性问题 2 2 爬
  • QT按钮显示和隐藏

    创建GroupBox 将按钮放置进去 ui groupBox gt setGeometry 100 100 150 50 int x ui groupBox gt geometry x int y ui groupBox gt geomet
  • Flutter 层叠布局组件

    文章目录 Flutter 层叠布局组件 简述 Stack 基本使用 fit属性 alignment属性 Stack Positioned IndexedStack Flutter 层叠布局组件 简述 Stack组件可以将子元素叠加显示 类似
  • 解放原画师!Wav2Lip 用 AI 听音同步人物口型

    By 超神经 内容提要 眼见为实 在 AI 技术面前已经失效了 换脸 对口型的技术层出不穷 效果越来越逼真 今天要介绍的 Wav2Lip 模型 只需一段原始视频与目标音频 就可将其合二为一 关键词 唇形同步 语音信号 近几年 好莱坞动画屡屡
  • 数据结构----链式栈

    目录 前言 链式栈 操作方式 1 存储结构 2 初始化 3 创建节点 4 判断是否满栈 5 判断是否空栈 6 入栈 7 出栈 8 获取栈顶元素 9 遍历栈 10 清空栈 完整代码 前言 前面我们学习过了数组栈的相关方法 链接 线性表 栈 栈
  • 最小外接矩形思路以及实现

    最小外接矩形 外接矩形计算 对一个凸多边形进行外接矩形计算 需要知道当前面的最大xy 和最小xy值 即可获得外接矩形 最小外接矩形计算 对凸多边形的每一条边都绘制一个外接矩形求最小面积 下图展示了计算流程 计算流程 旋转基础算法实现 旋转点
  • Network Compression 网络压缩

    网络压缩 Network Compression 就是把一个大的网络压缩成一个小的网络 现如今 手机设备 手表等都比较流行 但我们平常训练的网络都比较大 在一些 小 的设备或许很难存储和运行 所以这就需要把网络进行压缩 常用的方法 Netw
  • Shell脚本编写教程

    Shell脚本编写教程
  • 为什么栈的数组长度必须是一个常量?而堆的数组长度可以是变量。为什么栈的大小有限制?

    为什么栈的数组长度必须是一个常量 而堆的数组长度可以是变量 栈区数组长度使用变量会报错 其原因就在于栈是编译器管理的 在程序运行前就已经分配好了空间的大小 而使用变量 编译器无法知道该分配多大的内存空间 于是报错 但堆上的内存是动态创建的
  • Scala简介

    目录 一 Scala简介 1 1 概念 1 2 特点 1 3 Scala的优点 二 Scala基本数据类型和运算符 一 数据类型 1 1 类型支持 1 2 定义变量 1 3 类型推断 1 4 Scala解释器 二 字面量 2 1 整数字面量
  • linux系统安装五笔输入法,Linux下安装五笔输入法

    想体验一下Ubuntu10 10 由于我在Windows下用惯了五笔输入法 装上Ubuntu后一直为装不上理想的五笔输入法而烦恼 幸得高人帮忙 才解决了这一难题 心里那个是痛快啊 开始在网上搜索 查得的结果不尽如人意 一会缺少这个 一会又得
  • R-CNN史上最全讲解

    文章目录 一 初识R CNN 网络结构 二 训练步骤 1 RP的确定 2 模型pre training 3 Fine Tunning 4 提取并保存RP的特征向量 5 SVM的训练 6 bbox regression的训练 三 测试步骤 s
  • MySQL8--Windows下使用msi(图形界面)安装的方法

    原文网址 MySQL8 Windows下使用msi 图形界面 安装的方法 的博客 CSDN博客 简介 本文介绍Windows使用图形界面安装MySQL8的方法 下载地址 1 网址入口 进入MySQL的官方网站 https dev mysql
  • 后端开发缓存篇之缓存及缓存模式的介绍

    一 什么是缓存 缓存 简单说就是为了节约对原始资源重复获取的开销 而将结果数据副本存放起来以供获取的方式 二 什么时候使用缓存 1 以 幂等和安全的方式对资源的获取操作 2 缓存数据必须是重复获取的 缓存能生效的本质是空间换时间 缓存的命中