您当前的位置:首页 > 电脑百科 > 程序开发 > 编程百科

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

时间:2023-11-03 13:57:31  来源:微信公众号  作者:小技术君

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

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

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

一、什么是缓存?

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

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

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

二、为什么缓存很重要?

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

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

三、缓存的类型

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

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

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

四、缓存替换策略

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

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

不同替换策略的比较:

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

五、缓存失效策略

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

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

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

六、缓存失效方法

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

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

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

七、缓存性能指标

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

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

八、结论

1.主要观点

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

2.分布式系统中缓存的未来

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



Tags:系统设计   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
系统设计概念:生产 Web 应用的架构
在你使用的每个完美应用程序背后,都有一整套的架构、测试、监控和安全措施。今天,让我们来看看一个生产就绪应用程序的非常高层次的架构。CI/CD 管道我们的第一个关键领域是持...【详细内容】
2023-11-29  Search: 系统设计  点击:(283)  评论:(0)  加入收藏
系统设计中的缓存技术:完整指南
缓存是软件工程中用于提高系统性能和用户体验的基本技术。它通过临时存储频繁访问的数据在缓存中,缓存比数据的原始来源更容易访问。作为一名软件工程师,了解缓存以及它在不同...【详细内容】
2023-11-03  Search: 系统设计  点击:(175)  评论:(0)  加入收藏
如何为分布式系统设计数据库
译者 | 李睿审校 | 重楼数据库设计是微服务和云原生解决方案中的一个关键因素,因为基于微服务的架构会导致出现分布式数据。多个进程可以操作数据,而不是在单个进程中进行数据...【详细内容】
2023-10-16  Search: 系统设计  点击:(199)  评论:(0)  加入收藏
7种系统设计中的数据库范式
在设计系统时,选择合适的数据库并明确原因是最重要的决策之一。市场上有许多不同的数据库可供选择,这使得做出正确选择变得困难且令人困惑。每个数据库都有其自己的故事和自己...【详细内容】
2023-09-05  Search: 系统设计  点击:(239)  评论:(0)  加入收藏
Google Drive 和 Dropbox 系统设计概述
在现代信息世界中,我们有许多照片、文件、视频等需要存储。我相信几乎所有人都尝试过使用 Google Drive 或 Dropbox。功能需求1.用户可以从任何设备上传和下载文件。2.用户可...【详细内容】
2023-08-30  Search: 系统设计  点击:(358)  评论:(0)  加入收藏
负载均衡器在系统设计中的作用
当一个网站变得非常流行时,网站上的流量增加,单个服务器的负载也增加。并发流量超过单个服务器的处理能力,导致网站变得对用户响应缓慢。为了应对这些高数据量的请求,以快速可靠...【详细内容】
2023-08-29  Search: 系统设计  点击:(227)  评论:(0)  加入收藏
一文讲清楚!高并发系统设计思路
管是哪一门语言,并发都是程序员们最为头疼的部分。同样,对于一个软件而言也是这样,你可以很快增删改查做出一个秒杀系统,但是要让它支持高并发访问就没那么容易了。比如说: 如何...【详细内容】
2023-07-29  Search: 系统设计  点击:(228)  评论:(0)  加入收藏
一种新型的系统设计解决方案:模块树驱动设计
一、前言 系统设计的核心作用是在业务现实世界和抽象的IT实现之间建立起一道桥梁。 与其他行业被物理特性限制所束缚不同,软件世界可以变得无限庞大,而限制软件发展的其实是人...【详细内容】
2023-07-04  Search: 系统设计  点击:(422)  评论:(0)  加入收藏
分布式系统设计中的并发访问解决方案
在分布式环境中,操作互斥性问题和幂等性问题非常普遍。经过分析,我们找出了解决这两个问题的基本思路和实现原理,并给出了具体的解决方案。0、引言随着互联网信息技术的飞速发...【详细内容】
2023-05-18  Search: 系统设计  点击:(383)  评论:(0)  加入收藏
分布式多级缓存系统设计与实战
1. 缓存系统概述 如上图,是一次最基本的网络请求。用户请求从界面(浏览器或 App 界面)到网络转发、应用服务再到存储(数据库或文件系统),然后返回到界面呈现内容。 随着互联网的普...【详细内容】
2023-05-05  Search: 系统设计  点击:(366)  评论:(0)  加入收藏
▌简易百科推荐
即将过时的 5 种软件开发技能!
作者 | Eran Yahav编译 | 言征出品 | 51CTO技术栈(微信号:blog51cto) 时至今日,AI编码工具已经进化到足够强大了吗?这未必好回答,但从2023 年 Stack Overflow 上的调查数据来看,44%...【详细内容】
2024-04-03    51CTO  Tags:软件开发   点击:(5)  评论:(0)  加入收藏
跳转链接代码怎么写?
在网页开发中,跳转链接是一项常见的功能。然而,对于非技术人员来说,编写跳转链接代码可能会显得有些困难。不用担心!我们可以借助外链平台来简化操作,即使没有编程经验,也能轻松实...【详细内容】
2024-03-27  蓝色天纪    Tags:跳转链接   点击:(12)  评论:(0)  加入收藏
中台亡了,问题到底出在哪里?
曾几何时,中台一度被当做“变革灵药”,嫁接在“前台作战单元”和“后台资源部门”之间,实现企业各业务线的“打通”和全域业务能力集成,提高开发和服务效率。但在中台如火如荼之...【详细内容】
2024-03-27  dbaplus社群    Tags:中台   点击:(8)  评论:(0)  加入收藏
员工写了个比删库更可怕的Bug!
想必大家都听说过删库跑路吧,我之前一直把它当一个段子来看。可万万没想到,就在昨天,我们公司的某位员工,竟然写了一个比删库更可怕的 Bug!给大家分享一下(不是公开处刑),希望朋友们...【详细内容】
2024-03-26  dbaplus社群    Tags:Bug   点击:(5)  评论:(0)  加入收藏
我们一起聊聊什么是正向代理和反向代理
从字面意思上看,代理就是代替处理的意思,一个对象有能力代替另一个对象处理某一件事。代理,这个词在我们的日常生活中也不陌生,比如在购物、旅游等场景中,我们经常会委托别人代替...【详细内容】
2024-03-26  萤火架构  微信公众号  Tags:正向代理   点击:(10)  评论:(0)  加入收藏
看一遍就理解:IO模型详解
前言大家好,我是程序员田螺。今天我们一起来学习IO模型。在本文开始前呢,先问问大家几个问题哈~什么是IO呢?什么是阻塞非阻塞IO?什么是同步异步IO?什么是IO多路复用?select/epoll...【详细内容】
2024-03-26  捡田螺的小男孩  微信公众号  Tags:IO模型   点击:(8)  评论:(0)  加入收藏
为什么都说 HashMap 是线程不安全的?
做Java开发的人,应该都用过 HashMap 这种集合。今天就和大家来聊聊,为什么 HashMap 是线程不安全的。1.HashMap 数据结构简单来说,HashMap 基于哈希表实现。它使用键的哈希码来...【详细内容】
2024-03-22  Java技术指北  微信公众号  Tags:HashMap   点击:(11)  评论:(0)  加入收藏
如何从头开始编写LoRA代码,这有一份教程
选自 lightning.ai作者:Sebastian Raschka机器之心编译编辑:陈萍作者表示:在各种有效的 LLM 微调方法中,LoRA 仍然是他的首选。LoRA(Low-Rank Adaptation)作为一种用于微调 LLM(大...【详细内容】
2024-03-21  机器之心Pro    Tags:LoRA   点击:(12)  评论:(0)  加入收藏
这样搭建日志中心,传统的ELK就扔了吧!
最近客户有个新需求,就是想查看网站的访问情况。由于网站没有做google的统计和百度的统计,所以访问情况,只能通过日志查看,通过脚本的形式给客户导出也不太实际,给客户写个简单的...【详细内容】
2024-03-20  dbaplus社群    Tags:日志   点击:(4)  评论:(0)  加入收藏
Kubernetes 究竟有没有 LTS?
从一个有趣的问题引出很多人都在关注的 Kubernetes LTS 的问题。有趣的问题2019 年,一个名为 apiserver LoopbackClient Server cert expired after 1 year[1] 的 issue 中提...【详细内容】
2024-03-15  云原生散修  微信公众号  Tags:Kubernetes   点击:(6)  评论:(0)  加入收藏
站内最新
站内热门
站内头条