读构建可扩展分布式系统:方法与实践05分布式缓存

1. 分布式缓存
1.1. 缓存存在于应用程序的许多地方
-
1.1.1. 行应用程序的CPU具有高速多级硬件缓存,可以减少相对较慢的主内存访问
-
1.1.2. 数据库引擎可以利用主内存来缓存数据存储的内容,这样在许多情况下查询就可以不用访问速度相对较慢的磁盘
1.2. 分布式缓存是可扩展系统的重要组成部分
-
1.2.1. 缓存使耗时的查询和计算结果能够在后续请求中低成本地重用
-
1.2.2. 由于不必为每个请求重建缓存结果,系统的容量增加了,并且可以扩展来处理更大的工作负载
1.3. 应用缓存依赖业务逻辑,业务逻辑使用分布式缓存将预计算结果的缓存和访问结合在一起
1.4. Web缓存充分利用HTTP协议中内置的机制在网络提供的基础设施中缓存结果
1.5. 缓存是任何可扩展分布系统的重要组成部分
- 1.5.1. 缓存将许多客户端请求的信息存储在内存中,并利用这些信息为客户端请求提供服务
1.6. 使用分布式缓存的应用缓存是可扩展系统中最常用的缓存方法
1.7. 互联网还有内建的多级缓存基础设施
- 1.7.1. HTTP缓存使用得当的话可以显著减少下游服务和数据库的请求负载
1.8. 缓存是软件和系统的一个成熟领域
1.9. CDN本身就是一个复杂的、针对供应商的主题
- 1.9.1. 它们适用于用户群在地理上分散、内容需要快速交付的富媒体网站
2. 应用缓存
2.1. 应用缓存旨在通过将查询和计算的结果存储在内存中来提高请求响应能力,以便为后续的请求提供服务
-
2.1.1. 缓存可以减轻数据库读取流量的负担,因为许多查询都可以直接从缓存中获取结果
-
2.1.2. 缓存最终效果是减少了服务和数据库的计算负担,并为更多请求创造了空间或容量
2.2. 缓存需要额外的资源和成本来存储缓存结果
- 2.2.1. 与升级数据库和服务节点以应对更高的请求负载相比,设计良好的缓存方案成本较低
2.3. 应用级缓存采用专用的分布式缓存引擎
-
2.3.1. 主流技术
-
2.3.1.1. memcached
-
2.3.1.2. Redis
-
2.3.1.3. 两者本质上都是分布式内存哈希表,为存储代表数据库查询结果或下游服务API调用结果的任意数据(字符串、对象)而设计
-
2.4. 缓存常见的使用场景是存储用户会话数据、动态网页和数据库查询结果
2.5. 缓存命中
-
2.5.1. 如果可用,它会将缓存的内容作为结果返回
-
2.5.2. 缓存命中率应该是多少并没有一个硬性的规定,因为它取决于构建缓存内容的成本和缓存项的更新频率
- 2.5.2.1. 理想的缓存设计应该是读取频率远高于更新频率
2.6. 如果数据不在缓存中,即缓存未命中,服务将从数据库中查询所请求的数据并将查询结果写入缓存,后续的客户端请求无须查询数据库即可使用这些数据
- 2.6.1. 当项目需要经常更新时,缓存未命中的成本可能会抵消缓存带来的好处
2.7. 当缓存值有效时,所有请求都会使用它
- 2.7.1. 无须为每个请求调用执行耗时的电梯等待时间的计算
2.8. 使用TTL之类的过期时间是使缓存内容失效的一种常用方法
-
2.8.1. 确保了服务不会向客户端提供过期的结果
-
2.8.2. 使系统能够对缓存内容进行一些控制,缓存的空间通常是有限的
2.9. 如果缓存项没有定期刷新,缓存将会填满
- 2.9.1. 在这种情况下,缓存将采用最近最少使用或最少访问之类的策略来选择要剔除的缓存条目并为更新、更及时的结果腾出空间
2.10. 应用缓存可以显著提高吞吐量、减少延迟并提高客户端应用程序的响应能力
2.11. 一般的设计原则是最大化缓存命中率和最小化缓存未命中率
-
2.11.1. 当发生缓存未命中时,必须通过查询数据库或下游服务来满足请求
-
2.11.2. 然后可以将请求的结果写入缓存,用于后续的访问
2.12. 应用级缓存也被称为旁路缓存(cache-aside)模式
-
2.12.1. 如果所需的结果在缓存中可用,则应用程序代码会高效地绕过数据存储系统
-
2.12.2. 旁路缓存策略的一个显著优势是它对缓存故障更具弹性
-
2.12.3. 在缓存不可用的情况下,所有请求基本上都当作缓存未命中来处理
-
2.12.4. 扩展Redis和memcached之类的旁路缓存平台非常简单,得益于其简单的分布式哈希表模型
-
2.12.5. 旁路缓存模式是大规模可扩展系统使用的主要方法
2.13. 缓存提供了“魔法”来确保缓存与后端存储系统进行适当的交互
2.14. NCache支持提供者接口(provider interface)由应用程序实现
-
2.14.1. 接口会在通读缓存未命中和通写缓存写入时自动调用
-
2.14.2. 通读、通写和后写策略需要这样一种缓存技术,该技术可以通过特定应用的处理程序进行扩充,以便在应用程序访问缓存时执行数据库的读取和写入
3. 通读缓存
3.1. 应用通过访问缓存来满足所有请求
3.2. 如果所需的数据在缓存中不可用,则调用加载器来访问数据系统并将结果加载到缓存中以供应用使用
4. 通写缓存
4.1. 应用总是将更新写入缓存
4.2. 当缓存更新时,将调用写入器将新的缓存值写入数据库
4.3. 当数据库更新后,应用可以完成请求
5. 后写缓存
5.1. 回写缓存
5.2. 与通写缓存类似,只是应用不等待将值从缓存写入数据库
5.3. 这种模式是以可能丢失更新(如果缓存服务器在数据库更新完成之前崩溃)为代价来提高请求响应能力
5.4. 是大多数数据库引擎内部使用的策略
6. Web缓存
6.1. Web缓存会在定义的时间段内存储给定资源(例如,网页或图像)的副本
6.2. 由于缓存在物理上更靠近客户端,因此请求的延迟会更低
6.3. 边缘缓存,也叫内容分发网络(CDN)
-
6.3.1. 位于全球多个战略地理位置
-
6.3.2. 可以缓存靠近客户端的频繁访问的数据
-
6.3.3. 边缘缓存由CDN提供商在全球范围内部署
-
6.3.4. Akamai是最早的CDN提供商,拥有2000多个站点,并在全球提供高达30%的互联网流量
-
6.3.5. 对于拥有全球用户的富媒体站点,边缘缓存是必不可少的
6.4. 缓存通常只存储GET请求的结果,缓存键是与GET关联的URI
- 6.4.1. 任何具有所请求资源副本的缓存都可以响应请求
6.5. Cache-Control
- 6.5.1. 客户端请求和服务响应可以使用Cache-Control HTTP标头来定义缓存应该如何利用感兴趣的资源
6.6. Expires和Last-Modified HTTP标头与max-age指令互相配合以控制缓存数据的保留时间
-
6.6.1. 缓存存储的资源是有限的
-
6.6.2. 当请求访问一个有效资源时,缓存会用本地存储的结果提供服务,而无须联系源服务器
6.7. Etag
-
6.7.1. 可用于控制缓存项新鲜度的指令
-
6.7.2. Etag是一个不透明的值,Web缓存可以使用它来检查缓存的资源是否仍然有效
6.8. Web缓存如果能有效使用,可以显著减少延迟并节省网络带宽,对于图像和文档等大型项目尤其明显
6.9. Web缓存对部署静态数据(图像、视频和音频流)以及不经常变化的数据(如天气报告)最为有效
- 6.9.1. Squid和Varnish等代理缓存广泛部署在互联网上
6.10. HTTP缓存与代理和边缘缓存相结合所提供的强大功能是构建可扩展应用的宝贵工具
相关文章:
读构建可扩展分布式系统:方法与实践05分布式缓存
1. 分布式缓存 1.1. 缓存存在于应用程序的许多地方 1.1.1. 行应用程序的CPU具有高速多级硬件缓存,可以减少相对较慢的主内存访问 1.1.2. 数据库引擎可以利用主内存来缓存数据存储的内容,这样在许多情况下查询就可以不用访问速度相对较慢的磁盘 1.2. …...
【逐行注释】自适应Q和R的AUKF(自适应无迹卡尔曼滤波),附下载链接
文章目录 自适应Q的KF逐行注释的说明运行结果部分代码各模块解释 自适应Q的KF 自适应无迹卡尔曼滤波(Adaptive Unscented Kalman Filter,AUKF)是一种用于状态估计的滤波算法。它是基于无迹卡尔曼滤波(Unscented Kalman Filter&am…...
OpenCV高阶操作
在图像处理与计算机视觉领域,OpenCV(Open Source Computer Vision Library)无疑是最为强大且广泛使用的工具之一。从基础的图像读取、 1.图片的上下,采样 下采样(Downsampling) 下采样通常用于减小图像的…...
Vue中的防抖和节流是什么,它们的作用是什么?
在Vue.js中,防抖(debounce)和节流(throttle)是两种常用的性能优化技术,主要用于处理高频事件,如窗口滚动、窗口大小调整、键盘输入等。 **防抖(Debounce)**:…...
C++的类与对象中(主讲默认成员函数)
目录 1.类的默认成员函数 2.构造函数 1.全缺省构造函数 2.第7点中的对自定义类型的成员变量构造(调用编译器自动生成的默认构造函数) 3.析构函数 4.拷贝构造函数 5.运算符重载 1.概念 2.赋值运算符重载 6.const成员函数 1.类的默认成员函数 默…...
C#学习系列之Gmap地图界面上的实时绘制问题
C#学习系列之Gmap地图界面上的实时绘制问题 前言总结 前言 在地图控件上增加绘制不规则图形,在之前的经验来看, System.InvalidOperationException:“无法使用 DependencyObject,它属于其父 Freezable 之外的其他线程。” 其实就是ui线程中…...
Spring Boot中实现定时任务的主要方式
文章目录 在Spring Boot中实现定时任务,主要有以下几种方式:1. 使用Scheduled注解2. 使用Quartz调度器使用Quartz调度器(更好的做法)3. 使用TaskExecutor和ScheduledExecutorService4.总结 在Spring Boot中实现定时任务,主要有以下几种方式&a…...
C#使用HttpWebRequest下载文件
public static bool HttpDownloadFile(string downloadUrl, string localPath, log4net.ILog log) { bool bFlagDownloadFile false; //log.Debug("HttpDownloadFile--准备以HTTP的方式下载文件,url:[" downloadUrl &…...
Linux: virtual: qemu-kvm: top cpu usage的组成是否包含guest的使用?
文章目录 问题试验mpstat问题 最近看一个问题,看到一个虚拟机分配的cpu是:3-4,27-28 Cpus_allowed: 0000,18000018 Cpus_allowed_list: 3-4,27-28 使用top看qemu-kvm进程的cpu usage是:13.3%: [root@qrms6-host01 14278]# top -p 14278 top - 01:19:35 up 4 days...
【03】深度学习——神经网络原理 | 多层感知机 | 前向传播和反向传播 | 多层感知机代码实现 | 回归问题、分类问题 | 多分类问题代码实现
深度学习 1.神经网络原理1.1神经元模型1.2神经网络结构1.3隐藏层1.3.1激活函数层1.4输出层1.4.1softmax层1.5损失函数1.6反向传播2.多层感知机2.1线性网络的局限性2.2引入非线性2.3多层感知机(Multi-Layer Perceptron,MLP)2.4激活函数(Activation Function)2.4.1Sigmoid函…...
MySQL行锁的实践
在MySQL中,根据加锁的粒度,可以将数据库的锁细分为表锁、行锁、页锁。其中,表锁(Table Lock)是一种粗粒度的锁,它锁定整个表,阻止其他事务访问表中的任何行;行锁(Row Lock)是一种细粒度的锁,它锁…...
iOS 18 將在 9 月 16 日正式上線
現在有了正式的上線日期了。一如往常的,它會在 iPhone 16 系列正式推出前的 9 月 16 日先行上線。 iOS 18 最受矚目的無疑是它的 Apple Intelligence 功能,不過並非所有的 iPhone 機種都能享用,而是只有去年的 iPhone 15 Pro 和 Pro Max 才能…...
css选择器有几种?选择器的优先级是怎样的?
CSS选择器的主要分类 元素选择器(Type Selectors):选择HTML文档中的特定类型的元素。 示例:p { color: red; } 类选择器(Class Selectors):选择具有指定类名的元素。 示例:.myClass …...
果蔬识别系统性能优化之路(四)
目录 前情提要剩下问题 问题排查解决方案下一步 前情提要 果蔬识别系统性能优化之路(三) 剩下问题 同步数据库数据并初始化ivf依然要8,9秒 问题排查 通过断点加时间打印,发生其实初始化ivf的时间很快,慢的是数据在网络间的传…...
kafka之protobuf
Protobuf 的 .proto 文件是一种描述消息结构的定义文件,使用这种文件可以定义数据结构(消息),然后生成对应语言的类或代码用于序列化和反序列化数据。生成 .proto 文件涉及到编写 .proto 文件定义,然后通过 protoc 编译…...
BARTBERT
BART和BERT都是基于Transformer架构的预训练语言模型。 模型架构: BERT (Bidirectional Encoder Representations from Transformers) 主要是一个编码器(Encoder)模型,它使用了Transformer的编码器部分来处理输入的文本࿰…...
C++ 11新特性(1)
文章目录 C11新特性之auto和decltype知识点autoauto推导规则什么时候使用auto? decltypedecltype推导规则 auto和decltype的配合使用 C11新特性之左值引用、右值引用、移动语义、完美转发左值、右值纯右值、将亡值纯右值将亡值左值引用、右值引用 移动语义深拷贝、浅…...
彻底理解浅拷贝和深拷贝
目录 浅拷贝实现 深拷贝实现自己手写 浅拷贝 浅拷贝是指创建一个新对象,这个对象具有原对象属性的精确副本 基本数据类型(如字符串、数字等),在浅拷贝过程中它们是通过值传递的,而不是引用传递,修改值并不…...
Spring4-IoC2-基于注解管理bean
目录 开启组件扫描 使用注解定义bean Autowired注入 场景一:属性注入 场景二:set注入 场景三:构造方法注入 场景四:形参注入 场景五:只有一个构造函数,无注解 场景六:Autowired和Quali…...
AI基础 L22 Uncertainty over Time I 时间的不确定性
Time and Uncertainty 1 Time and Uncertainty States and Observations • discrete-time models: we view the world as a series of snapshots or time slices • the time interval ∆ between slices, we assume to be the same for every interval • Xt: denotes the se…...
内存分配函数malloc kmalloc vmalloc
内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...
边缘计算医疗风险自查APP开发方案
核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…...
【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例
文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...
现代密码学 | 椭圆曲线密码学—附py代码
Elliptic Curve Cryptography 椭圆曲线密码学(ECC)是一种基于有限域上椭圆曲线数学特性的公钥加密技术。其核心原理涉及椭圆曲线的代数性质、离散对数问题以及有限域上的运算。 椭圆曲线密码学是多种数字签名算法的基础,例如椭圆曲线数字签…...
【HTML-16】深入理解HTML中的块元素与行内元素
HTML元素根据其显示特性可以分为两大类:块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...
tree 树组件大数据卡顿问题优化
问题背景 项目中有用到树组件用来做文件目录,但是由于这个树组件的节点越来越多,导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多,导致的浏览器卡顿,这里很明显就需要用到虚拟列表的技术&…...
Java毕业设计:WML信息查询与后端信息发布系统开发
JAVAWML信息查询与后端信息发布系统实现 一、系统概述 本系统基于Java和WML(无线标记语言)技术开发,实现了移动设备上的信息查询与后端信息发布功能。系统采用B/S架构,服务器端使用Java Servlet处理请求,数据库采用MySQL存储信息࿰…...
人工智能(大型语言模型 LLMs)对不同学科的影响以及由此产生的新学习方式
今天是关于AI如何在教学中增强学生的学习体验,我把重要信息标红了。人文学科的价值被低估了 ⬇️ 转型与必要性 人工智能正在深刻地改变教育,这并非炒作,而是已经发生的巨大变革。教育机构和教育者不能忽视它,试图简单地禁止学生使…...
在树莓派上添加音频输入设备的几种方法
在树莓派上添加音频输入设备可以通过以下步骤完成,具体方法取决于设备类型(如USB麦克风、3.5mm接口麦克风或HDMI音频输入)。以下是详细指南: 1. 连接音频输入设备 USB麦克风/声卡:直接插入树莓派的USB接口。3.5mm麦克…...
Vue 模板语句的数据来源
🧩 Vue 模板语句的数据来源:全方位解析 Vue 模板(<template> 部分)中的表达式、指令绑定(如 v-bind, v-on)和插值({{ }})都在一个特定的作用域内求值。这个作用域由当前 组件…...
