引言
数据库是应用程序性能的关键组成部分。性能良好和性能不佳的数据库之间的差异,可能是影响整体应用程序性能的最重要因素。查询处理速度、扩展成本和数据访问的便捷性等数据库挑战使得寻找优化的平衡变得困难。在诸多考虑因素中,要同时兼顾这三者是很困难的。
在本文中,我们讨论数据库缓存,这是一种为数据库实施的技术,旨在缓解上述部分挑战。我们将介绍什么是数据库缓存,实施数据库缓存对数据存储的好处,以及不同的数据库缓存策略。
访问 Prisma 数据平台,在一个地方管理所有应用程序数据。
什么是数据库缓存?
数据库缓存是一种缓冲技术,它将频繁查询的数据存储在临时内存中。缓存是一种高速数据存储层,用于存储经常读取请求的数据子集。这种瞬态存储层使得未来对这些数据的请求能够比访问主数据库更快地得到服务。
数据库缓存策略通过减轻主数据库可能承担的负担来协助它。这最常见于将频繁读取数据的查询重定向到缓存本身,而不是主数据库。缓存本身可以位于数据库、应用程序中,甚至作为独立的访问层。
例如,您的应用程序首次从数据库请求用户信息时,此请求从应用程序服务器发送到数据库服务器并返回所请求的信息。通过缓存,此用户配置文件在首次读取后存储在更靠近请求者的地方,并且对于该数据的所有后续读取请求,查询处理时间和数据库工作负载都将显著减少。
数据库缓存有哪些好处?
数据检索速度极大地影响应用程序的用户体验。在数据库上实施缓存策略可以改善数据库性能、可用性和可伸缩性,并且根据策略不同,成本可能最低,所有这些因素都有助于提供整体积极的应用程序体验。
性能
如前所述,数据库缓存通过使数据更容易访问来提高数据库的性能。缓存就像应用程序访问频繁调用的数据的“键盘快捷方式”或“热键”。
这种更快的请求可以最大限度地减少数据库的工作负载,使其避免花费低效的时间进行重复任务。相反,它使这些任务更高效并简化数据访问。
可用性
虽然不是 100% 的故障转移策略,但缓存也为主数据库的整体可用性带来了好处。根据缓存的存储位置,在主数据库服务器因任何原因不可用的情况下,缓存仍能为应用程序提供数据调用点。
尽管数据库性能通常是采用缓存策略的主要原因,但您还额外获得了在任何后端故障情况下的一些额外弹性。
可伸缩性
与增加高可用性类似,数据库缓存对可伸缩性具有积极影响。尽管它不应成为数据库扩展策略的主要考虑因素,但实施缓存以提高数据库性能可以减少数据库工作负载,从而将后端查询分发到各个实体。
这种分发减轻了主数据库的负载,可以降低成本,并为数据处理提供更大的灵活性。这种结果减轻了扩展的需求,并利用了您已有的资源,可能将扩展的需求推迟到未来。
不同的数据库缓存策略有哪些?
在将数据库缓存引入数据访问流程之前,考虑哪种缓存策略最适合这项工作至关重要。对于任何场景,数据库与缓存之间的关系都可能对性能和系统结构产生不同的影响。提前规划并考虑所有选项将减少未来的麻烦。
要考虑的五种最流行策略是旁路缓存(cache-aside)、读取直达(read-through)、写入直达(write-through)、回写(write-back)和写入环绕(write-around)。我们将介绍每种策略的数据源到缓存关系以及处理过程。
旁路缓存 (Cache-aside)
在旁路缓存设置中,数据库缓存位于数据库旁边。当应用程序请求数据时,它会首先检查缓存。如果缓存中有数据(缓存命中),则返回该数据。如果缓存中没有数据(缓存未命中),则应用程序将查询数据库。然后应用程序将该数据存储在缓存中,以供后续查询使用。
旁路缓存设计是一种通用的缓存策略。此策略对于读密集型工作负载的应用程序特别有用。这使得频繁读取的数据触手可及,以应对大量传入的读取请求。另有两个额外的好处源于缓存与数据库的分离。在缓存故障的情况下,依赖缓存数据的系统仍然可以直接访问数据库。这提供了一些弹性。其次,由于缓存是分离的,它可以使用与数据库不同的数据模型。
另一方面,旁路缓存策略的主要缺点是存在数据库数据不一致的风险。通常,任何写入的数据将直接进入数据库。因此,缓存可能在一段时间内与主数据库存在不一致。根据您的需求,有不同的缓存策略可以解决这个问题。
读取直达 (Read-through)
在读取直达缓存配置中,缓存位于应用程序和数据库之间。可以将其想象成一条从应用程序到数据库的直线,缓存位于中间。在这种策略中,应用程序总是与缓存通信进行读取,当发生缓存命中时,数据会立即返回。如果发生缓存未命中,缓存将从数据库填充缺失的数据,然后将其返回给应用程序。对于任何数据写入,应用程序仍将直接访问数据库。
读取直达缓存也适用于读密集型工作负载。读取直达和旁路缓存之间的主要区别在于,在旁路缓存策略中,应用程序负责获取数据并填充缓存,而在读取直达设置中,逻辑由库或某个独立的缓存提供商完成。读取直达设置在缓存和数据库之间潜在的数据不一致方面与旁路缓存相似。
读取直达缓存策略还有一个缺点,即每当有新的读取请求进来时,都需要访问数据库来获取数据。由于这些数据从未被缓存过,因此需要加载数据。开发者通常通过手动发出可能发生的查询来“预热”缓存,以缓解这种延迟。
写入直达 (Write-through)
写入直达缓存策略与前两种不同,因为它不是直接将数据写入数据库,而是先写入缓存,然后缓存立即写入数据库。这种安排仍然可以像读取直达策略一样被可视化,即应用程序位于中间的一条直线上。
写入直达策略的优点是缓存能确保拥有任何写入的数据,并且新的读取不会因为缓存从主数据库请求数据而产生延迟。如果仅采用这种安排,则存在额外的写入延迟的巨大缺点,因为操作必须先到缓存,然后再到数据库。这应该会立即发生,但仍然会连续发生两次写入。
真正的好处来自于将写入直达与读取直达缓存结合使用。这种策略将采用上述读取直达缓存策略的所有好处,并额外消除了数据不一致的潜在问题。
回写 (Write-back)
回写的工作方式几乎与写入直达策略完全相同,除了一个关键细节。在回写策略中,应用程序再次直接写入缓存。然而,缓存不会立即写入数据库,而是延迟一段时间后再写入。
通过延迟而非立即写入数据库,在写密集型工作负载下可以减少缓存的压力。这使得回写与读取直达的组合非常适合混合工作负载。这种配对确保了最近写入和访问的数据始终存在并通过缓存可访问。
缓存到数据库写入的延迟可以提高整体写入性能,如果支持批处理,还可以减少总写入次数。这为节省成本和减少整体工作负载带来了潜力。然而,在缓存故障的情况下,这种延迟为可能的数据丢失打开了大门,如果批处理或延迟写入数据库尚未发生。
写入环绕 (Write-around)
写入环绕缓存策略将与旁路缓存或读取直达缓存结合使用。在这种安排中,数据总是写入数据库,而读取的数据则进入缓存。如果缓存未命中,则应用程序将读取数据库,然后更新缓存以备下次使用。
这种特定策略在数据只写入一次且不更新的情况下表现最佳。数据读取频率非常低或根本不读取。
结论
在本指南中,我们介绍了数据库缓存的概念。我们涵盖了配置缓存策略对数据库和应用程序性能的主要好处。我们还讨论了各种缓存策略的基础知识以及如何可视化和优化这些安排以协同工作。
配置能够优化缓存和数据库工作负载的缓存策略,可以对应用程序的性能、可用性和可伸缩性产生重大的积极影响。了解从何开始以及有哪些选项至关重要。
访问 Prisma 数据平台,在一个地方管理所有应用程序数据。