分享到

导言

数据库是应用程序性能的关键组成部分。性能良好和性能较差的数据库之间的差异可能是影响整体应用程序性能的最重要因素。数据库挑战,如查询处理速度、扩展成本和数据访问的简易性,使得找到优化的平衡点变得困难。在众多其他考虑因素中,很难兼顾这三者。

在本文中,我们将讨论数据库缓存,这是一种为数据库实施的技术,旨在缓解上述一些挑战。我们将介绍什么是数据库缓存、在数据存储上实施数据库缓存的优势以及不同的数据库缓存策略。

什么是数据库缓存?

数据库缓存是一种缓冲技术,用于将频繁查询的数据存储在临时内存中。缓存是一个高速数据存储层,用于存储经常被读取请求的数据子集。这种瞬态存储层使得未来对这些数据的请求能够比访问主数据库更快地得到服务。

数据库缓存策略通过减轻主数据库可能承担的负担来辅助您的主数据库。这最常见的情况是将频繁读取的数据的查询重定向到缓存本身,而不是主数据库。缓存本身可以驻留在数据库、应用程序中,甚至可以作为独立的访问层。

例如,您的应用程序首次从数据库请求用户信息,此请求从应用程序服务器到数据库服务器,并返回请求的信息。通过缓存,此用户配置文件在初始读取后更靠近请求者存储,并且对于该数据的后续所有读取请求,查询处理时间和数据库工作负载都将显着减少。

数据库缓存有哪些优势?

数据检索速度极大地影响应用程序的用户体验。在数据库上实施缓存策略可以提高数据库性能、可用性和可扩展性,并且根据策略,成本最低,所有这些因素都有助于整体积极的应用程序体验。

性能

正如前面简要提到的,数据库缓存通过使数据更容易访问来提高数据库的性能。缓存充当应用程序引用其频繁调用的数据的“键盘快捷键”或“热键”。

这种更快速的请求可以最大限度地减少数据库的工作负载,使其免于花费大量时间执行重复性任务。而是使这些任务更有效率并简化数据访问。

可用性

虽然不是 100% 的故障转移策略,但缓存在整体数据库可用性方面也提供了优势。根据缓存的存储位置,在主数据库服务器因任何原因变得不可用的情况下,缓存仍然可以为应用程序提供一个调用数据的地方。

虽然数据库性能通常是采用缓存策略的主要原因,但在发生任何后端故障时,您还可以获得一些额外的弹性优势。

可扩展性

与增加高可用性类似,数据库缓存对可扩展性具有积极影响。虽然它不应该是您数据库扩展策略的主要考虑因素,但实施缓存以提高数据库性能可以减少数据库工作负载,从而在实体之间分配后端查询。

这种分配减轻了主数据库的负载,可以降低成本,并为数据处理提供更大的灵活性。这种结果减轻了扩展的需求,并利用您已有的资源做了更多的事情,从而可能将扩展的需求推迟到未来。

有哪些不同的数据库缓存策略?

在将数据库缓存引入您的数据访问流程之前,重要的是要考虑哪种缓存策略最适合这项工作。对于任何场景,数据库和缓存之间的关系都可能对性能和系统结构产生不同的影响。提前计划并考虑所有选项将减少日后的麻烦。

要考虑的五种最流行的策略是旁路缓存、直读式缓存、直写式缓存、回写式缓存和环绕式缓存。我们将介绍每种策略的数据源到缓存的关系和过程。

旁路缓存

旁路缓存布置中,数据库缓存与数据库并排放置。当应用程序请求数据时,它将首先检查缓存。如果缓存中存在数据(缓存命中),则它将返回数据。如果缓存中没有数据(缓存未命中),则应用程序将查询数据库。然后,应用程序将该数据存储在缓存中,以供后续查询使用。

Cache-Aside

旁路缓存设计是一种良好的通用缓存策略。此策略对于读取密集型工作负载的应用程序特别有用。这使频繁读取的数据触手可及,以满足大量传入的读取请求。缓存与数据库分离带来了两个额外的好处。在缓存发生故障的情况下,依赖缓存数据的系统仍然可以直接访问数据库。这提供了一些弹性。其次,由于缓存是分离的,因此它可以采用与数据库不同的数据模型。

另一方面,旁路缓存策略的主要缺点是存在数据库不一致的窗口。通常,任何正在写入的数据都将直接写入数据库。因此,缓存可能存在与主数据库不一致的时期。根据您的需要,有不同的缓存策略来应对这种情况。

直读式

直读式缓存布置中,缓存位于应用程序和数据库之间。它可以被设想为从应用程序到数据库的直线,缓存位于中间。在此策略中,应用程序将始终与缓存对话以进行读取,并且当发生缓存命中时,数据会立即返回。在缓存未命中的情况下,缓存将从数据库填充缺失的数据,然后将其返回给应用程序。对于任何数据写入,应用程序仍将直接访问数据库。

Read-Through

直读式缓存也适用于读取密集型工作负载。直读式缓存和旁路缓存之间的主要区别在于,在旁路缓存策略中,应用程序负责获取数据并填充缓存,而在直读式设置中,逻辑由库或某些单独的缓存提供程序完成。在缓存和数据库之间潜在的数据不一致方面,直读式设置类似于旁路缓存。

直读式缓存策略还具有缺点,即每当有新的读取请求通过时,都需要访问数据库以获取数据。此数据以前从未缓存过,因此需要加载数据。开发人员通常通过手动发出可能发生的查询来“预热”缓存,从而减轻这种延迟。

直写式

直写式缓存策略与前面提到的两种策略不同,因为它不是将数据写入数据库,而是首先写入缓存,然后缓存立即写入数据库。这种布置仍然可以像直读式策略一样可视化,即应用程序位于中间的直线上。

Write-Through

直写式策略的优点是确保缓存具有任何写入的数据,并且没有新的读取会在缓存从主数据库请求数据时遇到延迟。如果仅进行此布置,则存在额外的写入延迟的巨大缺点,因为该操作必须先转到缓存,然后再转到数据库。这应该立即发生,但仍然会连续发生两次写入。

真正的好处来自将直写式缓存与直读式缓存配对。此策略将采用直读式缓存策略的所有上述优势,并增加消除数据不一致的可能性的好处。

回写式

回写式的工作方式几乎与直写式策略完全相同,只是有一个关键细节。在回写式策略中,应用程序再次直接写入缓存。但是,缓存不会立即写入数据库,而是在延迟后写入。

Write-Back

通过延迟而不是立即写入数据库,可以减少写入密集型工作负载中缓存的压力。这使得回写式和直读式组合适用于混合工作负载。这种配对确保最近写入的数据和访问的数据始终存在并且可以通过缓存访问。

缓存到数据库写入的延迟可以提高整体写入性能,如果支持批处理,还可以减少整体写入次数。这为节省一些成本和减少整体工作负载打开了可能性。但是,在缓存发生故障的情况下,如果尚未发生批处理或延迟写入数据库,则此延迟会为可能的数据丢失打开大门。

环绕式

环绕式缓存策略将与旁路缓存或直读式缓存结合使用。在这种布置中,数据始终写入数据库,而读取的数据则转到缓存。如果发生缓存未命中,则应用程序将读取数据库,然后更新缓存以备下次使用。

Write-Around

这种特定策略在数据仅写入一次且未更新的情况下将是最有效的。数据很少读取或根本不读取。

结论

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

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

关于作者
Alex Emerich

Alex Emerich

Alex 是典型的观鸟、喜欢嘻哈音乐的书虫,也喜欢撰写关于数据库的文章。他目前居住在柏林,在那里人们可以看到他像利奥波德·布卢姆一样漫无目的地走在城市中。