系统设计中的缓存技术:完整指南

529b5f17f2b35b70c928fc96bef26f47.jpeg

Image.png

缓存是软件工程中用于提高系统性能和用户体验的基本技术。它通过临时存储频繁访问的数据在缓存中,缓存比数据的原始来源更容易访问。

作为一名软件工程师,了解缓存以及它在不同类型的系统中的工作方式是至关重要的。在本文中,我们将涵盖关于缓存的一切,从定义和重要性到不同类型的缓存以及实施的最佳实践。

I. 什么是缓存?

缓存是位于应用程序和数据的原始来源之间的高速存储层,例如数据库、文件系统或远程Web服务。当应用程序请求数据时,首先检查缓存。如果在缓存中找到数据,它将被返回给应用程序。如果在缓存中找不到数据,它将从其原始来源检索,存储在缓存中以供将来使用,并返回给应用程序。

缓存可以用于各种类型的数据,如网页、数据库查询、API响应、图像和视频。缓存的目标是减少数据需要从其原始来源获取的次数,这可以导致更快的处理和较低的延迟。

可以通过不同的方式实现缓存,包括内存缓存、磁盘缓存、数据库缓存和CDN缓存。内存缓存将数据存储在计算机的主存中,比磁盘存储更快。磁盘缓存将数据存储在硬盘上,比从远程来源检索数据更快。数据库缓存将经常访问的数据存储在数据库中,减少了访问外部存储的需求。CDN缓存将数据存储在分布式服务器网络上,减少了从远程位置访问数据的延迟。

II. 为什么缓存很重要?

在软件工程中,缓存在提高系统性能和用户体验方面发挥着关键作用。通过将经常访问的数据存储在缓存中,应用程序可以减少操作的响应时间和延迟,从而实现更快速和更高效的处理。以下是一些缓存很重要的原因:

1.改善系统性能: 缓存可以通过减少数据需要从其原始来源获取的次数来显著改善应用程序的性能。由于缓存数据可以比从原始来源获取数据更快地检索,这导致了处理时间的显著减少,从而实现了更响应的应用程序。2.减少网络负载: 缓存还可以通过最小化需要通过网络传输的数据量来减少网络负载。由于缓存数据存储在本地,不需要从原始来源获取数据,从而减少了需要传输的数据量。3.提高可扩展性: 缓存可以通过减少对原始来源的负载来提高应用程序的可扩展性。通过将经常访问的数据存储在缓存中,原始来源不太可能被请求压倒,使其更具可扩展性。4.更好的用户体验: 更快的响应时间和降低的延迟可以提供更好的用户体验。快速加载并及时响应用户请求的应用程序更有可能被用户使用和偏爱。

III. 缓存的类型

根据特定用例和被缓存的数据类型,可以以各种方式实现缓存。以下是一些常见的缓存类型:

1.内存缓存: 内存缓存将数据存储在计算机的主存中,比磁盘存储更快。内存缓存适用于可以容纳在可用内存中的经常访问数据。这种类型的缓存通常用于缓存API响应、会话数据和网页片段。要实现内存缓存,软件工程师可以使用各种技术,包括使用缓存库,如Memcached或Redis,或在应用程序代码中实现自定义缓存逻辑。2.磁盘缓存: 磁盘缓存将数据存储在硬盘上,比从远程来源检索数据更快。磁盘缓存适用于太大无法容纳在内存中或需要在应用程序重新启动之间持久化的数据。这种类型的缓存通常用于缓存数据库查询和文件系统数据。3.数据库缓存: 数据库缓存将经常访问的数据存储在数据库中,减少了访问外部存储的需求。这种类型的缓存可以使用各种技术实现,包括数据库查询缓存和结果集缓存。4.CDN缓存: CDN缓存将数据存储在分布式服务器网络上,降低了从远程位置访问数据的延迟。这种类型的缓存适用于从世界各地访问的数据,如图像、视频和其他静态资源。CDN缓存通常用于内容交付网络和大规模Web应用程序。5.DNS缓存: DNS缓存是域名系统(DNS)中使用的一种缓存,用于在一段时间内存储DNS查询的结果。当用户请求访问网站时,他们的计算机发送DNS查询到DNS服务器,以将网站的域名解析为IP地址。DNS服务器以IP地址回应,然后用户的计算机可以使用IP地址访问网站。DNS缓存通过减少发送到DNS服务器的请求次数来提高DNS系统的性能。当DNS服务器收到对域名的请求时,它检查其本地缓存是否有该域名的IP地址。如果IP地址在缓存中,DNS服务器可以立即用IP地址回应,无需查询其他服务器。这可以显著减少DNS查询的响应时间,并提高系统的整体性能。

e874f70aa40dc3b3941fd771a83358db.jpeg

Image.png

IV. 缓存替换策略

在实施缓存时,有一个缓存替换策略非常重要,以确定缓存变满时应删除哪些项目。以下是一些最常见的缓存替换策略:

最近最少使用 (LRU): LRU 是一种缓存替换策略,当缓存变满时,它会删除最近最少使用的项目。这种策略假定最近访问的项目更有可能在将来再次被访问。•最不常使用 (LFU): LFU 是一种缓存替换策略,当缓存变满时,它会删除最不常使用的项目。这种策略假定更频繁访问的项目更有可能在将来再次被访问。•先进先出 (FIFO): FIFO 是一种缓存替换策略,当缓存变满时,它会删除最旧的项目。这种策略假定缓存中的最旧项目最不可能在将来再次被访问。•随机替换: 随机替换是一种缓存替换策略,当缓存变满时,它会随机删除一个项目。这种策略不做关于将来访问的可能性的任何假设,可以在访问模式不可预测时有用。

不同替换策略的比较

每种缓存替换策略都有其优点和缺点,选择使用哪种策略取决于具体的用例。通常情况下,LRU 和LFU比FIFO和随机替换更有效,因为它们考虑了缓存的访问模式。但是,LRU和LFU的实现可能更昂贵,因为它们需要维护额外的数据结构来跟踪访问模式。FIFO和随机替换更容易实现,但在优化缓存性能方面可能不如LRU和LFU有效。总之,应谨慎选择使用的缓存替换策略,以平衡性能和复杂性之间的权衡。

V. 缓存失效策略

缓存失效是在数据不再有效时从缓存中移除数据的过程。使缓存失效是确保缓存中存储的数据准确和最新的关键步骤。以下是一些常见的缓存失效策略:

写透缓存(Write-through cache): 在这种方案下,数据被写入缓存并同时写入相应的数据库。缓存的数据允许快速检索,并且由于相同的数据被写入永久存储,缓存和存储之间将具有完全的数据一致性。此外,这种方案确保在发生崩溃、断电或其他系统中断时不会丢失任何数据。尽管写透缓存减少了数据丢失的风险,因为每个写操作必须在返回成功给客户端之前执行两次,但这种方案的缺点是写操作的延迟较高。•写绕缓存(Write-around cache): 这种技术类似于写透缓存,但数据直接写入永久存储,绕过缓存。这可以减少缓存被写操作淹没的情况,后续不会被重新读取,但缺点是对最近写入的数据的读取请求将创建“缓存未命中”,必须从较慢的后端存储中读取并经历较高的延迟。•写回缓存(Write-back cache): 在这种方案下,数据只写入缓存,并立即向客户端确认完成。写入永久存储是基于某些条件进行的,例如,当系统需要一些空闲空间时。这会导致写入密集型应用程序的低延迟和高吞吐量;然而,这种速度伴随着在崩溃或其他不利事件发生时数据丢失的风险,因为写入的数据的唯一副本在缓存中。•写后缓存(Write-behind cache): 这与写回缓存非常相似。在这种方案下,数据写入缓存并立即向应用程序确认,但不会立即写入永久存储。相反,写操作被推迟,数据最终会在稍后的时间写入永久存储。写回缓存和写后缓存之间的主要区别在于数据何时写入永久存储。在写回缓存中,只有在需要缓存释放空间时才会将数据写入永久存储,而在写后缓存中,数据将在指定的时间间隔内写入永久存储。

总之,应该谨慎选择使用的缓存失效策略,以在性能和数据准确性之间取得平衡。通过了解可用的不同缓存失效策略,软件工程师可以选择适当的策略来优化缓存性能并减少延迟,同时确保缓存中存储的数据准确和最新。

VI. 缓存失效方法

以下是一些著名的缓存失效方法:

清除(Purge): 清除方法会移除特定对象、URL或一组URL的缓存内容。通常在内容更新或更改时使用,因为缓存版本不再有效。当接收到清除请求时,缓存内容会立即移除,下一个请求的内容将直接从源服务器提供。•刷新(Refresh): 即使有缓存内容可用,刷新方法也会从源服务器获取请求的内容。当接收到刷新请求时,缓存内容将被更新为源服务器的最新版本,以确保内容是最新的。与清除不同,刷新请求不会移除现有的缓存内容;相反,它会使用最新版本进行更新。•封禁(Ban): 封禁方法根据特定条件(例如URL模式或标头)使缓存内容无效。当接收到封禁请求时,任何匹配指定条件的缓存内容将立即被移除,随后的内容请求将直接从源服务器提供。•生存时间到期(TTL到期): 此方法涉及为缓存内容设置生存时间值,超过该值后,内容将被视为陈旧并需要进行刷新。当接收到内容请求时,缓存会检查生存时间值,并仅在该值未到期时提供缓存内容。如果该值已到期,缓存将从源服务器获取内容的最新版本并进行缓存。•同时陈旧时重新验证(Stale-while-revalidate): 此方法用于在Web浏览器和内容传递网络中提供陈旧内容,同时在后台更新内容。当接收到内容请求时,将立即提供缓存版本给用户,并异步请求源服务器以获取内容的最新版本。一旦最新版本可用,缓存版本将被更新。此方法确保用户始终能够快速获取内容,即使缓存版本略有陈旧。

470daae28f13c0f10e51e55b4276dfaf.jpeg

Image.png

VII. 缓存性能指标

在实施缓存时,测量缓存性能是非常重要的,以确保它在减少延迟和提高系统性能方面是有效的。以下是一些最常见的缓存性能指标:

命中率(Hit rate): 命中率是由缓存提供而不访问原始来源的请求的百分比。高命中率表示缓存在减少对原始来源请求的数量方面非常有效,而低命中率表示缓存可能无法提供显著的性能优势。•未命中率(Miss rate): 未命中率是未由缓存提供并需要从原始来源获取的请求的百分比。高未命中率表示缓存可能无法缓存正确的数据,或者缓存大小可能不足以存储所有频繁访问的数据。•缓存大小(Cache size): 缓存大小是为缓存分配的内存或存储容量。缓存大小可以影响缓存的命中率和未命中率。较大的缓存大小可能会导致更高的命中率,但也可能增加缓存解决方案的成本和复杂性。•缓存延迟(Cache latency): 缓存延迟是从缓存中访问数据所需的时间。较低的缓存延迟表示缓存更快,更有效地降低延迟并提高系统性能。缓存延迟可以受到所使用的缓存技术、缓存大小以及缓存替换和失效策略的影响。

VIII. 结论

主要观点

缓存是优化系统性能和减少延迟的软件工程中的重要工具。通过将频繁访问的数据存储在缓存中,可以减少对原始来源的请求次数,从而实现更快的响应时间和更好的可扩展性。缓存在各种软件应用程序中使用,从Web应用程序到数据库再到内容传递网络。

分布式系统中缓存的未来

随着分布式系统在软件工程中的普及,缓存将继续在优化系统性能方面发挥关键作用。像Redis和Memcached这样的分布式缓存解决方案变得越来越流行,允许数据在多个服务器和数据中心之间进行缓存。随着机器学习和人工智能的使用不断增长,缓存也将用于通过减少检索和处理数据所需的时间来优化这些应用程序的性能。

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

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

相关文章

基于AOSP源码Android-10.0.0_r41分支编译,framework开发,修改系统默认字体大小

文章目录 基于AOSP源码Android-10.0.0_r41分支编译,framework开发,修改系统默认字体大小 基于AOSP源码Android-10.0.0_r41分支编译,framework开发,修改系统默认字体大小 主要修改一个地方就行 代码源码路径 frameworks/base/co…

旅游业为什么要选择VR全景,VR全景在景区旅游上有哪些应用

引言: VR全景技术的引入为旅游业带来了一场变革。这项先进技术不仅提供了前所未有的互动体验,还为景区旅游文化注入了新的生机。 一.VR全景技术:革新旅游体验 1.什么是VR全景技术? VR全景技术是一种虚拟现实技术&am…

【C++初阶(四)aoto关键字与基于范围的for循环】

本专栏内容为:C学习专栏,分为初阶和进阶两部分。 通过本专栏的深入学习,你可以了解并掌握C。 💓博主csdn个人主页:小小unicorn ⏩专栏分类:C 🚚代码仓库:小小unicorn的代码仓库&…

python实现MC协议(SLMP 3E帧)的TCP服务端(篇二)

python实现MC协议(SLMP 3E帧)的TCP服务端是一件稍微麻烦点的事情。它不像modbusTCP那样,可以使用现成的pymodbus模块去实现。但是,我们可以根据协议帧进行组包,自己去实现帧的格式,而这一切可以基于socket模…

Kotlin 进阶函数式编程技巧

Kotlin 进阶函数式编程技巧 Kotlin 简介 软件开发环境不断变化,要求开发人员不仅适应,更要进化。Kotlin 以其简洁的语法和强大的功能迅速成为许多人进化过程中的信赖伙伴。虽然 Kotlin 的初始吸引力可能是它的简洁语法和与 Java 的互操作性&#xff0c…

每天一点python——day61

#第61天 #字符串的驻留机制字符串:python中基本数据类型,是一个不可变的序列【目前我们学了两个:元组、字符串】 可以使用单引号,双引号,三引号来定义#定义字符串 apython#用单引号,双引号,三引…

Redis原理到常用语法基础图文讲解

在初期,已经讲述了Redis安装问题。现在正式进入Redis的入门阶段 系统架构的演进 传统单机架构 一台机器运行应用程序、数据库服务器 现在大部分公司的产品都是这种单机架构。因为现在计算机硬件发展速度很快,哪怕只有一台主机,性能也很高…

智慧城市排水系统,管网水位监测仪怎么监测

地下排水管网应用于城市的多个环境之中,比如排放雨水,污水或者是地表水等,总之是在维护城市的安全运行,并且保护城市地下生命线处于正常状态。但是一旦排水系统面对各种极端天气,便有可能会突发安全事故,导…

如何再kali中下载iwebsec靶场

这个靶场有三种搭建方法: 第一种是在线靶场:http://www.iwebsec.com:81/ 第二种是虚拟机版本的,直接下载到本地搭建 官网地址下载:http://www.iwebsec.com/ 而第三种就是利用docker搭建这个靶场,我这里是用kali进行…

部署kubevirt教程

前提条件 已安装:kubernetes集群、kubectl、docker apt install -y qemu-kvm libvirt virt-install bridge-utils 【所有节点全部安装】 virt-host-validate qemu部署kubevirt 下载kubevirt-cr.yaml和kubevirt-operator.yaml 先执行: Kubectl apply …

网络安全(黑客)-0基础小白自学

1.网络安全是什么 网络安全可以基于攻击和防御视角来分类,我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术,而“蓝队”、“安全运营”、“安全运维”则研究防御技术。 2.网络安全市场 一、是市场需求量高; 二、则是发展相对成熟…

Go Gin中间件

Gin是一个用Go语言编写的Web框架,它提供了一种简单的方式来创建HTTP路由和处理HTTP请求。中间件是Gin框架中的一个重要概念,它可以用来处理HTTP请求和响应,或者在处理请求之前和之后执行一些操作。 以下是关于Gin中间件开发的一些基本信息&am…

数据库系统原理与实践 笔记 #7

文章目录 数据库系统原理与实践 笔记 #7数据库设计和E-R模型(续)转换为关系模式具有简单属性的实体集的表示复合属性多值属性联系集的表示模式的冗余—合并 实体-联系设计问题设计问题联系属性的布局 扩展的E-R特性特化概化属性继承特化/概化的设计约束聚集E-R图表示方法总结E-…

聚会娱乐喝酒游戏小程序源码系统 可开流量主 带完整的搭建教程

今天罗峰来给大家分享一款聚会娱乐喝酒游戏小程序源码系统 。在聚会娱乐活动中,喝酒游戏是一种非常受欢迎的活动方式。但是,往往由于缺乏有效的组织和规则,导致游戏的进行不够顺畅,甚至出现混乱的情况。因此,开发一款能…

Java-Hbase介绍

1.1. 概念 base 是分布式、面向列的开源数据库(其实准确的说是面向列族)。HDFS 为 Hbase 提供可靠的 底层数据存储服务,MapReduce 为 Hbase 提供高性能的计算能力,Zookeeper 为 Hbase 提供 稳定服务和 Failover 机制&#xff0c…

云计算实战项目之---学之思在线考试系统

简介: 学之思开源考试系统是一款 java vue 的前后端分离的考试系统。主要优点是开发、部署简单快捷、界面设计友好、代码结构清晰。支持web端和微信小程序,能覆盖到pc机和手机等设备。 支持多种部署方式:集成部署、前后端分离部署、docker部…

一文深入了解 CPU 的型号、代际架构与微架构

在 10 月 16 号的时候,Intel 正式发布了第 14 代的酷睿处理器。但还有很多同学看不懂这种发布会上发布的各种 CPU 参数。借着这个时机,给大家深入地讲讲 CPU 的型号规则、代际架构与微架构方面的知识。 CPU 在整个计算机硬件中、技术体系中都算是最最重…

Wpf 使用 Prism 实战开发Day04

一.菜单导航实现 1.首先创建出所有的页面(View)及对应的页面逻辑处理类(ViewModel) IndexView(首页)-----------------IndexViewModelToDoView(待办事项)------------ToDoViewModelMemoView(忘备录)--------------MemoViewModelSettingsView(设置)--------------SettingsViewMo…

防逆流系统中防逆流电表的正确安装位置-安科瑞黄安南

随着光伏行业的发展,部分地区村级变压器及工业用电变压器容量与光伏项目的装机容量处于饱和。电网公司要求对后建的光伏并网系统为不可逆流发电系统,指光伏并网系统所发生的电由本地负载消耗,多余的电不允许通过低压配电变压器向上级电网逆向…

【漏洞复现】Apache_HTTP_2.4.50_路径穿越漏洞(CVE-2021-42013)

感谢互联网提供分享知识与智慧,在法治的社会里,请遵守有关法律法规 文章目录 1.1、漏洞描述1.2、漏洞等级1.3、影响版本1.4、漏洞复现1、基础环境2、漏洞扫描3、漏洞验证方式一 curl方式二 bp抓捕 1.5、修复建议 说明内容漏洞编号CVE-2021-42013漏洞名称…