dot Redis 8 已发布,而且是开源的

了解更多

缓存失效

返回术语表

什么是缓存失效?

缓存失效是通过从系统缓存中移除不再有效或有用的数据来使缓存失效的过程。换句话说,您是在清除存储在缓存中的旧的或过时的缓存内容。这确保了缓存仅包含相关和最新的信息,从而可以提高缓存一致性并防止错误发生。

缓存失效对于维护缓存一致性至关重要。当对原始数据进行更改时,例如更新个人资料信息,应使相应的缓存文件失效,以确保反映更新后的数据。如果缓存未失效,则存在向用户显示过时信息的风险,这可能导致混淆甚至隐私问题。缓存失效涉及跨多个系统层(例如 Web 或应用服务器以及数据库)同步多个数据副本,以确保缓存内容与真实数据源保持一致。这种同步过程可能很复杂,需要跨各种系统组件进行仔细协调。

>了解如何使用 Redis 进行缓存

什么是缓存以及缓存的含义是什么?

缓存是一种硬件或软件组件,用于临时存储应用、服务器和浏览器使用的数据。 

在网站中,缓存允许您从服务器加载特定资源,例如字体、图像或图标,而无需在每次访问页面时都下载它们。请求数据时,不是从实际存储或真实数据源中检索数据,而是访问缓存来检索数据。

由于主存储通常无法跟上客户端的需求,因此缓存被用作频繁访问数据的临时存储,从而加快检索速度,减少延迟,并提高输入/输出 (I/O)。 

当应用需要数据时,它首先检查缓存中是否存在数据。如果存在,应用直接从缓存中访问数据。然而,如果缓存中不存在数据,则数据将从主存储中获取或由服务生成。数据获取后,会存储在缓存中以便将来更快地访问。这种从缓存中存储和检索数据的过程称为缓存。因此,当后续用户访问同一站点或服务器时,缓存数据可以加快加载时间,因为缓存实质上“回忆”了数据。

缓存能够满足的内容请求越多,缓存命中率就越高。

举例来说,一种流行的缓存策略是 Cache-Aside 模式。在这种模式下,应用首先检查缓存中是否存在请求的数据。如果在缓存中找不到数据(缓存未命中),应用会从主存储中获取数据,将其存储到缓存中以备将来使用,然后将数据返回给用户。后续对相同数据的请求可以从缓存中提供,从而提高性能。为了实现 Cache-Aside,通常使用缓存键来唯一标识缓存中的数据。

>在我们的企业缓存:大规模缓存策略白皮书中了解更多信息。

缓存失效是如何工作的?

假设您访问一个使用缓存机制存储网页的网站。如果您更改了您的个人资料信息,但该页面的缓存未失效,则仍然会显示旧信息。这可能会导致混淆甚至隐私问题。缓存失效会将应用缓存中存储的数据与服务器上存储的数据进行比较。如果两者不同,则缓存会被标记为无效,并更新为服务器上的最新数据。

缓存失效涉及跨多个系统层(例如 Web 或应用服务器以及数据库)同步多个数据副本。这种同步过程可能很复杂,需要跨各种系统组件进行仔细协调。对一层进行的更改可能需要传播到其他几层,并且更新发生的顺序对于维护系统一致性至关重要。

一旦一个输入发生变化,缓存中就会出现无效结果。此外,程序可能会继续工作,这使得很难确定问题所在以修复缓存失效逻辑。 

可以将其想象成一个可以借书的图书馆。您无需每次需要书时都去原始书店,而是可以检查图书馆是否有副本。如果图书馆有这本书,您可以直接借阅,而无需去书店。图书馆满足您要求的图书越多,您找到所需图书而无需额外去书店的机会就越高。同样,缓存存储频繁访问的数据,从而加快检索速度并减轻原始存储或来源的负担。

当应用需要数据时,它首先检查缓存中是否存在数据。如果存在,应用可以直接从缓存中检索数据。然而,如果缓存中不存在数据,应用需要从主存储中获取数据或通过服务生成数据。数据获取后,会存储在缓存中,以便将来更快地访问。这种从缓存中存储和检索数据的过程称为缓存。因此,后续用户访问同一站点或服务器可以受益于更快的加载时间,因为缓存实质上“回忆”了数据。

值得注意的是,缓存失效可能受到多种因素的影响,包括 Cookie 的使用。Cookie 是存储在用户设备上的小数据块,可以通过将特定的缓存条目与用户特定数据关联来管理缓存失效。例如,如果用户个人资料信息更新,可以使用 Cookie 使与该用户关联的缓存条目失效。

缓存失效的好处

如上所述,不使缓存失效可能导致问题,例如不准确和安全问题。以下是缓存失效的一些好处以及不使缓存失效的风险

更好的性能

缓存失效会从缓存中移除旧数据,从而释放空间并提高缓存命中率。反过来,这会更快地检索频繁访问的数据。另一方面,如果缓存未失效,它可能会继续存储旧数据,导致性能和效率下降。

    提高系统可扩展性

    清除不必要的数据可以减少服务器或数据库的负载。因此,这有助于提高系统的可靠性和可扩展性。 

      更低的成本

      不断需要从真实数据源中获取数据需要大量的系统资源、时间或对大量数据的独占访问权。缓存失效减少了对这些资源密集型任务的需求。这有助于节省服务器资源并降低总体系统成本。

        提高安全性

        当敏感数据留在缓存中且未失效时,它可能暴露给未经授权的访问和数据泄露。缓存失效通过确保敏感数据不会在缓存中停留超出必要的时间来降低此风险和其他安全漏洞。

          增强用户体验

          用户几乎总是渴望更快的体验。根据 Google 的研究,移动端页面加载时间长达 10 秒可以将跳出率提高 123%。 

            此外,向用户提供相同请求数据的不同版本可能导致隐私问题和不一致的体验。因此,正确地使缓存失效可以最大限度地减少延迟,并为用户提供最新数据,从而改善用户体验。

            合规性

            许多应用、软件和网站都受到监管要求的约束。这些政府强制的合规法规因软件或位置而异。未能使缓存数据失效可能导致不合规。 

              通过仅在缓存中存储授权和正确的数据,失效可以帮助您遵守政府法规 CCPA、GDPR 和 HIPAA。

              缓存失效的类型

              有几种类型的缓存失效技术。每种类型的实现将取决于应用的具体要求。在继续之前,让我们解释一下什么是依赖 ID,因为我们将在后续段落中经常提到它。

              依赖 ID 是一个标签,用于标识要失效的缓存条目。同一个标签可以附加到一个或多个缓存条目,创建一个组,该组用于失效规则以使整个条目组失效。

              现在,让我们看看最常见的缓存失效类型

              基于时间的失效

              基于时间的失效是缓存失效最简单的类型之一,但它也有缺点。它根据预设的时间间隔使数据失效。 尽管实现基于时间的失效有不同的方法,但通常通过在 cache-spec.xml 等缓存配置文件中的缓存条目内添加一个 <timeout> 值来完成。该值表示条目保留的秒数。然而,超时期限可以根据应用的特定需求和其显示的数据进行定制。缓存可以每小时失效一次,以确保使用中的数据不过时。 

              基于时间的失效可能应用的场景示例包括每小时显示最新新闻的新闻网站,或每小时更新其预测的天气预报应用。其他场景包括股票交易应用,用于每隔几分钟更新股票价格;以及旅行计划应用,用于每隔几小时显示航班可用性和价格的变化。

              基于事件的失效

              基于事件的缓存失效发生在系统触发特定事件时使缓存失效。当缓存数据与特定事件或状态变化相关联且必须正确更新时,这种失效类型非常有用。例如,当博客文章更新时,可能会发生基于事件的失效。必须使先前的缓存数据失效,以确保用户看到更新后的文章信息。

              基于命令的失效

              基于命令的缓存失效发生在用户触发特定定义的命令或操作时,从而产生失效 ID。 通常会生成一个依赖 ID 并将其与缓存对象关联。因此,当执行带有失效 ID 的命令时,缓存中任何具有匹配的依赖 ID 和失效 ID 的对象都会失效。 一个例子是用户从存储中删除文件时。必须使该文件的缓存失效,以确保用户不会再次看到该文件被列出。

              基于组的失效

              基于组的失效发生在根据组或类别使缓存失效时。当缓存数据与较大的缓存条目组关联时,这特别有用,因此单独使每个条目失效效率低下。简单地说,当必须一次使较大组的数据失效时,基于组的失效是必要的。 我们将使用之前的新闻网站示例。但这次,如果网站的某个部分(例如政治)正在更新,则该部分的所有文章都应在缓存中失效。这确保用户看到政治下的最新新闻。 对于电子商务网站,当产品类别更新时,可以触发基于组的失效。以上所有类型的缓存失效都可以根据特定需求结合使用。这有助于创建有效和高效的缓存策略。

              缓存失效策略

              可以使用许多策略来确保有效地执行缓存失效。以下是一些策略

              最近最少使用 (LRU)

              当缓存已满时,LRU 算法定义了使缓存中元素失效以腾出空间存放新元素的策略。这意味着它首先丢弃最近最少使用的项。 LRU 假定这些最近最少使用的项将来不太可能被需要,因此它会先清除它们。 例如,当计算机的 RAM 已满时,操作系统可能会首先使最近最少使用的内存页失效,以便为新数据腾出空间。

              最不常用 (LFU)

              (LFU) 是一种缓存算法,当缓存已满时,它会移除最不常使用的缓存块。也就是说,访问次数最少的缓存条目会被驱逐。此策略意味着不经常访问的项将来被使用的可能性最低。因此,这些缓存条目是首先被驱逐的。 搜索引擎使用此缓存策略来使查询缓存失效。一方面,查询存储频繁执行的查询的搜索结果。然而,最不常用的查询会首先失效。

              随机替换

              顾名思义,随机替换算法是一种失效策略,它随机选择任何缓存条目并替换它。该算法不需要数据结构,也不监控数据内容的历史记录。随机替换模型假定每个缓存数据在以后被使用的可能性均等。因此,清除和替换哪个数据无关紧要。负载均衡器使用随机替换缓存失效来使它们的会话缓存失效。会话缓存保存用户的会话数据,当缓存溢出时,LRU 或 LFU 会话会被随机失效。

              当计算机系统的物理内存已满时,也可能发生随机替换。操作系统可能会选择将一些内存页替换到硬盘上。如果需要将内存页换回物理内存,但没有空间,操作系统可能会随机使一个内存页失效。

              先进先出 (FIFO)

              先进先出是一种除了缓存之外,还应用于许多行业和业务的策略。其逻辑是,最旧的数据或库存项应首先被清除。在缓存失效的背景下,FIFO 是指第一个缓存条目最先失效。这是因为它们在缓存中停留的时间最长,这意味着它们将来不太可能被使用。例如,打印机使用 FIFO 来选择首先执行哪些打印作业。发送数据进来的用户更有可能位于打印队列的前面。 

              此外,数据库系统使用事务日志来跟踪数据库更改。当事务日志已满时,最旧的日志条目会首先失效。最终,您的缓存失效策略将很大程度上取决于系统要求,例如缓存大小、数据访问频率和数据类型。 在某些情况下,可以使用不同的缓存失效策略。这可以优化缓存性能并提高系统效率。

              缓存失效的最佳实践

              尽管缓存失效是节省服务器资源、提高速度和减少延迟的绝佳方法,但正确地执行它至关重要。 

              避免过度缓存

              缓存有助于提高系统性能和速度。然而,过度缓存可能会损害性能,因为它可能消耗宝贵的内存资源并增加服务器负载。这意味着服务器被迫不断更新和管理缓存,这可能导致定期停机。如果您的网站或在线平台接受用户生成内容 (UGC),长时间缓存内容可能会导致不一致,从而损害您网站的声誉。因此,您必须平衡频繁访问数据的缓存和允许不太常用数据失效。

              设置适当的过期时间

              设置正确的缓存过期时间对于网站优化至关重要。它有助于减少服务器负载,同时提高用户体验。 设置缓存过期时间时,必须考虑页面上的内容类型。

              例如,如果页面包含动态内容,如电子商务产品或 UGC,这些内容会定期更新,则缓存过期时间应更短。另一方面,如果页面显示不经常更新的静态内容,则可以延长缓存过期时间。Google 建议对 CSS 文件、图像或 JavaScript 文件等静态资产的最小缓存时间最长为一年。 对于股票价格、新闻文章、天气预报和社交媒体源等频繁更新的内容,缓存过期时间应在几分钟到一小时之间。这确保用户收到最新信息。

              考虑数据依赖性

              缓存数据有时依赖于其他数据或资源,这意味着对依赖数据的更改可能需要使缓存中的数据失效。 确保缓存数据与真实数据源一致至关重要。如果依赖数据发生更改,缓存数据可能过时, 导致 向用户显示过时的数据。