paint-brush
5种缓存机制来加速你的应用程序经过@pragativerma
17,846 讀數
17,846 讀數

5种缓存机制来加速你的应用程序

经过 Pragati Verma8m2022/09/12
Read on Terminal Reader
Read this story w/o Javascript

太長; 讀書

缓存是一种缓冲技术,我们将经常访问的数据存储在临时内存或空间中,以使其随时可用并减少我们的应用程序、服务器或数据库的工作量。根据用例,它可以在 Web 应用程序的不同级别上实现。缓存发生在不同级别,例如边缘缓存或 CDN(内容交付网络)或服务器端缓存(服务器端缓存)缓存可用于所有类型的数据存储,包括 NoSQL 数据库以及关系数据库。

Companies Mentioned

Mention Thumbnail
Mention Thumbnail

Coin Mentioned

Mention Thumbnail
featured image - 5种缓存机制来加速你的应用程序
Pragati Verma HackerNoon profile picture
0-item
1-item


如果您是后端开发人员,无论何时需要加速您的 Web 应用程序,缓存都是首选解决方案。但是,在为您的 Web 应用程序确定正确的缓存策略时,有很多关于缓存的内容会丢失。因此,在本文中,我们将讨论各种可用的缓存策略以及如何为您的用例选择合适的策略。


什么是缓存?

简单来说,缓存是一种缓冲技术,我们将经常访问的数据存储在临时内存或空间中,以使其随时可用并减少应用程序、服务器或数据库的工作量。根据用例,它可以在 Web 应用程序的不同级别上实现。


Web 应用程序中不同级别的缓存

缓存发生在 Web 应用程序的不同级别,例如:


边缘缓存或 CDN(内容交付网络)

CDN 用于在地理分布的服务器中缓存静态资产(例如图像、视频或网页),以便它可以使用缓存更快地将内容发送给最终用户。


来源:https://imagekit.io/


将 CDN 视为连锁杂货店:购买者无需前往数百公里到种植粮食的田地,而是前往当地的杂货店,这仍然需要一些旅行,但距离更近。杂货店购物需要几分钟而不是几天,因为杂货店从遥远的农场储存食物。同样,CDN 缓存“库存”出现在 Internet 上的内容,从而使网页加载速度显着加快。


来源:https://awesome-tech.readthedocs.io/


当用户使用 CDN 从网站请求任何内容时,CDN 从源服务器检索内容并保留内容的副本以供将来请求。只要用户继续访问,缓存的内容就会保存在 CDN 缓存中。


数据库缓存

数据库缓存是指任何数据库用来优化读写的原生智能缓存算法。在这种情况下,缓存可以存在于多个区域中,包括数据库、应用程序或作为独立层。


数据库缓存可用于所有类型的数据存储,包括 NoSQL 数据库以及关系数据库,如 SQL 服务器 - MySQL 或 MariaDB 等。它也适用于许多数据平台,如 AWS 和 Microsoft Azure。


浏览器缓存或客户端缓存

浏览器或客户端根据缓存过期标头存储静态资产。 HTTP 缓存标头指定浏览器可以在多长时间内完成对请求的 Web 内容的后续缓存响应。此外,浏览器可以缓存 GET 请求的响应,以避免不必要的数据调用。


服务器端缓存

服务器缓存是最常用的缓存机制,其中数据缓存在服务器应用程序中。这里的事情很大程度上取决于业务需求,它针对并发用户较少的应用程序进行了高度优化。


服务器端 Web 缓存通常涉及使用 Web 代理来保存来自其所在的 Web 服务器的 Web 响应,从而显着降低它们的负载和延迟。这些缓存由站点管理员实现,并充当浏览器和源服务器之间的中间代理。


服务器端缓存的另一种形式是利用 Memcached 和 Redis 等键值存储。相反,对于仅缓存对特定 HTTP 请求的 HTTP 响应的反向代理,应用程序开发人员需要的任何 Web 内容都可以使用键/值对象存储进行缓存。通常使用可能利用内存数据存储的应用程序代码或应用程序框架来获取 Web 内容。


使用键/值存储进行在线缓存的另一个优点是它们经常用于存储 Web 会话和其他缓存材料。这为各种应用情况提供了统一的解决方案。


为什么我们需要缓存?

缓存有几个好处,如下所述:


改进的应用程序性能

正如我们前面所讨论的,缓存是一个高速数据存储层,它存储经常访问且通常是瞬态的数据子集,因此未来请求的处理速度比访问原始存储位置的速度更快。因此,缓存允许有效重用以前访问或计算的数据。因此,数据的读/写操作大大减少,有助于提高应用程序的整体性能。


降低数据库成本

单个缓存实例每秒可以提供数十万次输入/输出操作,从而通过减少所需的数据库实例数量来降低总成本。因此,如果存储费用是按吞吐量计算的,则成本节约可能非常显着。


减少后端的负载

通过将读取负载的特定部分从后端数据库重定向到内存缓存层,缓存可以有效地减少后端服务器的负载并使其免受性能下降的影响。它可以避免系统在流量过载或高峰时崩溃。


可预测的性能

现代应用程序的一个常见挑战是在处理应用程序使用高峰时。例如 - 在全球科技活动、板球比赛或选举日或电子商务网站上的节日销售等期间,社交媒体应用程序的峰值。应用程序负载的增加可能会导致获取数据的延迟,从而降低性能以及不可预测的用户体验。虽然,通过使用高吞吐量的内存缓存,我们可以在很大程度上缓解这个问题。


消除数据库热点

在许多应用程序中,一小部分数据(例如名人资料或流行产品)可能比其余数据更频繁地被检索。这可能会导致数据库中出现热点,并且需要根据最常用数据的吞吐量要求过度配置数据库资源。将公共密钥存储在内存中可减少过度配置的需要,同时为最常访问的数据提供快速且可预测的性能。


提高读取吞吐量 (IOPS)

除了减少延迟之外,内存系统还提供比类似的基于磁盘的数据库更高的请求率。单个分布式侧缓存机器每秒可以处理数十万个请求。


讨论了缓存的好处之后,让我们通过一些实际用例深入探讨缓存策略。在本文中,我们将主要关注服务器端缓存策略。


5 种不同类型的服务器缓存策略

缓存一旁

在这种缓存策略中,缓存在逻辑上被放在一边,应用程序直接与数据库或缓存通信,以了解所请求的信息是否存在。应用程序首先检查缓存,如果找到信息,则读取并返回数据,称为缓存命中,否则称为缓存未命中,在这种情况下,应用程序查询数据库以读取信息并将请求的数据返回给客户端,然后将其存储到缓存中以供将来使用。


来源:https://www.prisma.io


它在读取繁重的用例中基本上是有益的。因此,如果缓存服务器宕机,那么系统将通过直接与数据库通信来正常工作,但在可能突然发生的峰值负载或峰值的情况下,这不是一个长期或可靠的解决方案。


最常见的写入策略是直接写入数据库,但是在频繁写入的情况下,这可能会导致数据不一致。为了应对这种情况,开发人员经常使用带有TTL(生存时间)缓存,并继续服务直到过期。


以下是带和不带 TTL 的缓存以及何时使用它们的快速概览:


带 TTL 的缓存

当数据频繁更新时,带有 TTL 的缓存是最常用的缓存。在这种情况下,您希望缓存定期过期,因此,您可以使用有时间限制的缓存,一旦时间间隔过去,缓存将自动删除。


例如 - 服务器会话或运动记分卡。


没有 TTL 的缓存

不带 TTL 的缓存用于缓存不需要经常更新的需求,例如提供课程的网站上的内容。在这种情况下,内容将不经常更新或发布,因此更容易缓存而没有任何时间限制。


直写式高速缓存

顾名思义,在这种策略中,任何新信息都首先写入缓存,然后再写入主内存/数据库。在这种情况下,缓存在逻辑上位于应用程序和数据库之间。因此,如果客户端请求任何信息,应用程序不需要与缓存检查信息的可用性,因为缓存已经拥有信息,因此,它直接从缓存中检索并提供给客户端。


来源:https://www.prisma.io


但是,它会增加写入操作的延迟。但是如果与另一种称为直读缓存的缓存策略配合使用,我们可以确保数据的一致性。


直读缓存

在这种缓存策略中,缓存与数据库保持一致,因此只要有缓存未命中(缓存中未找到数据),丢失的数据就会从数据库中填充并返回给客户端。


来源:https://www.prisma.io


正如您可能已经猜到的那样,它最适用于准备繁重的应用程序,以便一次又一次地请求相同的信息集。例如,一个新闻网站会一遍又一遍地提供相同的故事。


这种策略的缺点是如果数据是第一次请求,它总是缓存未命中,因此它会比正常请求慢。


回写

在这种缓存策略中,只要有写操作,应用程序就会将信息写入缓存,缓存会立即确认更改,并在延迟一段时间后,将数据写回数据库。它也被称为后写缓存策略。


来源:https://www.prisma.io


对于写入操作繁重的应用程序来说,这是一种很好的缓存策略,可以提高应用程序的写入性能。它还可以帮助适应适度的数据库停机时间和实例中可能发生的故障。


与通读缓存配对时,它也可以很好地工作。此外,如果支持批处理,它可以进一步减少数据库的写入工作量。但是,缺点是如果缓存失败,数据可能会永远丢失。在大多数关系数据库中,默认情况下启用回写缓存机制。


写周围

在这种情况下,数据直接写入数据库,只有读取的数据存储在缓存中。


来源:https://www.prisma.io


它可以与直读缓存结合使用,并且在数据写入一次且仅读取几次的情况下可能是一个不错的选择。例如,当需要实时日志或聊天时。


结论

在本文中,我们讨论了什么是缓存以及应用程序中不同级别的缓存,以及我们为什么需要它。然后,我们还讨论了服务器端缓存的各种缓存策略。但是,这些缓存策略中的任何一种都没有必要满足您的实际用例,但始终建议您结合使用这些策略以获得最佳结果。


对于刚接触这方面的开发人员来说,可能需要进行一些试验和错误,或者我们可以说,命中或失败以更彻底地理解实际意义上的概念,并为特定用例提出最佳解决方案。


这就是本文的全部内容,希望对您有所帮助。请让我知道你的想法。你可以在这里与我联系:


领英|推特| GitHub


继续阅读!