likes
comments
collection
share

5种数据库缓存策略,你了解么?

作者站长头像
站长
· 阅读数 16

全文翻译自:www.prisma.io/dataguide/m…

引言

数据库是应用程序性能的关键组成部分。一个性能良好和性能不佳的数据库之间的差异可能是影响整体应用程序性能的最具影响力的因素。数据库面临的挑战如查询处理速度、扩展成本和数据访问的便利性,使得寻找优化平衡变得困难。在许多其他考虑因素中,很难满足这三个方面的需求。

在本文中,我们将讨论数据库缓存,这是一种为数据库实现的技术,可以减轻前述挑战中的一些问题。我们将介绍数据库缓存的概念,以及在数据存储中实施数据库缓存的好处和不同的数据库缓存策略。

什么是数据库缓存?


  数据库缓存是一种缓冲技术,它将经常查询的数据存储在临时内存中。缓存是一个高速数据存储层,它存储经常被读取请求的数据子集。这个临时存储层使得对这些数据的未来请求能够比通过访问主数据库更快地响应。

数据库缓存策略通过减轻主数据库可能承载的负担来提高其性能。最常见的情况是将对经常读取的数据的查询重新路由到缓存本身,而不是主数据库。缓存本身可以位于数据库、应用程序,或者甚至作为独立的访问层。

例如,当您的应用程序首次从数据库请求用户信息时,此请求会从应用程序服务器发送到数据库服务器,然后返回所请求的信息。使用缓存后,用户配置文件将在首次读取后存储在请求者附近,对于所有后续读取该数据的请求,查询处理时间和数据库负载都会显著减少。通过数据库缓存,我们能够优化数据库性能,提高数据访问的效率,从而改善应用程序的整体性能和用户体验。

数据库缓存的好处是什么?

数据检索速度极大地影响着应用程序的用户体验。在数据库上实施缓存策略可以显著提高数据库性能、可用性和可扩展性,而这所需的成本取决于所选择的策略。所有这些因素共同促成了整体积极的应用程序体验。

性能

正如简要提及的那样,数据库缓存通过更容易访问数据来提高数据库的性能。缓存就像是应用程序引用经常被调用的数据的“键盘快捷键”或“热键”。

这种更快速的请求可以最小化数据库的工作负担,使其避免花费大量时间执行重复任务。相反,它可以使这些任务更加高效,简化数据访问。通过数据库缓存,我们能够优化数据库性能,提高数据访问的效率,从而改善应用程序的整体性能和用户体验。

可用性

尽管不是100%的容错策略,但缓存也有助于提高整体数据库的可用性。根据缓存的存储位置,如果主数据库服务器由于任何原因不可用,缓存仍然可以为应用程序提供数据的调用位置。

虽然数据库性能通常是采用缓存策略的主要原因,但在后端发生故障的情况下,您还能获得额外的弹性优势。通过缓存,即使主数据库不可用,应用程序仍然可以继续访问一部分数据,从而增加了系统的可靠性。

通过数据库缓存,我们能够提高数据库的可用性,使得在主数据库不可用时,应用程序依然能够正常运行。这样的策略可以提高系统的稳定性,并在后端发生故障时提供更多的选择和备选方案。

可扩展性

与增加高可用性类似,数据库缓存对可扩展性也有积极影响。尽管它不应是数据库扩展策略的主要考虑因素,但通过实施缓存来提高数据库性能可以减轻数据库的工作负载,从而在实体间分布后端查询。

这种分布减轻了主数据库的负担,可以降低成本并提供更多的数据处理灵活性。这样的结果减轻了扩展的需求,能更充分地利用已有的资源,可能将扩展的需求推迟到未来。

有哪些数据库缓存策略?

在将数据库缓存纳入数据访问流程之前,重要的是要考虑哪种缓存策略最适合工作。对于任何情况,数据库和缓存之间的关系可能会对性能和系统结构产生不同的影响。提前规划并考虑所有选项将减少未来的困扰。

考虑的五种最受欢迎的策略包括缓存旁路(Cache-Aside),读取穿透(Read-Through),写入穿透(Write-Through),写入回写(Write-Back),以及写入旁路(Write-Around)。我们将介绍每种策略的数据源到缓存的关系和过程。

缓存旁路(Cache-Aside)

缓存旁路的策略中,数据库缓存位于数据库旁边。当应用程序请求数据时,它会首先检查缓存。如果缓存中存在数据(缓存命中),则会直接返回数据。如果缓存中没有数据(缓存未命中),则应用程序将查询数据库。应用程序然后将该数据存储在缓存中,以供后续的查询使用。 5种数据库缓存策略,你了解么?

缓存旁路设计是一种优秀的通用缓存策略。这种策略特别适用于读取密集的工作负载的应用程序。它将经常读取的数据保持在附近,以满足众多的读取请求。将缓存与数据库分开还带来了两个额外的好处。在缓存故障的情况下,仍然可以直接从数据库获取数据,从而增加了一定的弹性。其次,由于缓存与数据库分离,它可以采用与数据库不同的数据模型。

然而,缓存旁路策略的主要缺点是数据库中的不一致性问题。通常,任何写入的数据都会直接写入数据库。因此,缓存可能与主数据库存在一段时间的不一致。根据需求,可以采用不同的缓存策略来解决这个问题。

读取穿透(Read-Through)

读取穿透(Read-Through) 在读取穿透缓存的策略中,缓存位于应用程序和数据库之间。可以将其想象成应用程序到数据库的一条直线,缓存处于中间。在这种策略下,应用程序总是与缓存进行读取交互,当缓存命中时,数据会立即返回。在缓存未命中的情况下,缓存会从数据库中获取缺失的数据,然后将其返回给应用程序。对于任何数据的写入操作,应用程序仍然会直接访问数据库。 5种数据库缓存策略,你了解么?

读取穿透缓存对于读取密集的工作负载也是很有用的。读取穿透和缓存旁路的主要区别在于,在缓存旁路策略中,应用程序负责获取数据并将其填充到缓存中,而在读取穿透设置中,这一逻辑由一个库或者某个独立的缓存提供者完成。与缓存旁路相似,读取穿透设置也存在缓存和数据库之间潜在数据不一致的问题。

读取穿透缓存策略还有一个缺点,即在每次新的读取请求到来时需要访问数据库来获取数据。由于这些数据之前从未被缓存过,所以需要加载数据。开发人员通常会通过手动发出可能发生的查询来“预热”缓存,以减少这种延迟。

写入穿透(Write-Through)

写入穿透缓存策略与前面提到的两种策略不同,因为它不是直接将数据写入数据库,而是首先将数据写入缓存,然后缓存立即将数据写入数据库。这种安排仍然可以像读取穿透策略一样可视化,形成一条直线,应用程序处于中间位置。 5种数据库缓存策略,你了解么?

写入穿透策略的好处在于,确保缓存中具有所有写入的数据,并且任何新的读取请求不会因为缓存从主数据库请求数据而遇到延迟。如果仅采用这种安排,缺点是会产生额外的写入延迟,因为操作必须经过缓存然后再写入数据库。尽管这应该是立即发生的,但仍然存在两次连续写入的情况。

真正的好处来自于将写入穿透与读取穿透缓存配对使用的策略。这种策略将采用读取穿透缓存策略的所有优点,并增加了消除数据不一致的潜在优势。通过使用这种组合策略,可以实现写入数据的高效缓存和读取数据的快速访问,同时保持数据的一致性。

写回(Write-Back)

Write-back与写入穿透策略几乎完全相同,只有一个关键细节不同。在写回策略中,应用程序再次直接将数据写入缓存。然而,缓存不会立即将数据写入数据库,而是会延迟一段时间后再进行写入。 5种数据库缓存策略,你了解么?

通过在写入数据库时延迟而不是立即进行,可以减轻写入密集工作负载对缓存的压力。这使得写回和读取穿透的组合对于混合工作负载非常适用。这种组合确保最近写入的数据和访问的数据始终存在,并可通过缓存进行访问。

缓存到数据库写入的延迟可以改善整体写入性能,并且如果支持批处理,则可以减少总体写入量。这为一些成本节约和整体工作负载减轻带来了潜在的机会。然而,在缓存发生故障的情况下,这种延迟可能会导致可能数据丢失的风险,特别是如果批处理或延迟写入数据库尚未发生。

写入旁路(Write-Around)

写入旁路缓存策略将与缓存旁路或读取穿透缓存策略相结合。在这种安排中,数据总是被写入数据库,而读取的数据会被放入缓存。如果发生缓存未命中,则应用程序会从数据库读取数据,然后更新缓存以备下次使用。 5种数据库缓存策略,你了解么?

这种特定的策略在数据仅被写入一次且不进行更新的情况下表现最佳。数据很少被读取或根本不被读取。

结束语

在本指南中,我们介绍了数据库缓存的概念。我们讨论了配置缓存策略对数据库和应用程序性能可能产生的主要好处。我们还讨论了各种缓存策略的基础知识,以及如何将这些安排可视化并优化以协同工作。

配置优化缓存和数据库工作负载的缓存策略对于应用程序的性能、可用性和可扩展性有着重要的积极影响。了解从何处开始以及有哪些选项是至关重要的。

转载自:https://juejin.cn/post/7259668331712299063
评论
请登录