缓存失效是在数据不再有效或不再有用时,通过从系统缓存中删除数据来使缓存失效的过程。换句话说,你正在摆脱存储在缓存中旧的或过时的缓存内容。这确保了缓存仅包含相关且最新的信息,可以改进 缓存一致性 并防止错误。
保持缓存一致性对缓存失效至关重要。当对原始数据(例如更新个人资料信息)进行更改时,应使内容失效的缓存文件失效以确保更新的数据得以反映。如果缓存未失效,则存在向用户显示过时信息的风险,这可能会造成困惑,甚至引发隐私问题。缓存失效涉及跨多个系统层(如 Web 或应用程序服务器和数据库)来同步多个数据副本,以确保缓存内容与真理来源保持一致。此同步过程可能很复杂,并且需要对各个系统组件进行仔细协调。
>了解如何使用 Redis 进行缓存。
缓存是临时存储应用程序、服务器和浏览器使用的数据的硬件或软件组件。
在网站中,缓存允许您从服务器加载特定的资源,例如字体、图像或图标,而不必在每次访问页面时下载它们。缓存被用来在请求时获取数据,而不是从真实存储或来源获取数据。
由于主存储经常无法满足客户端需求,因此缓存被用作经常访问的数据的临时存储,从而加快了检索速度,减少了延迟,并提高了输入/输出 (I/O)。
当应用程序需要数据时,它首先检查缓存中是否有该数据。如果存在,该应用程序将直接从缓存中访问它。但是,如果它不存在于缓存中,则数据将从主存储中获取或由服务生成。一旦获取到数据,它将存储在缓存中以便将来更快地访问。这种从缓存存储和检索数据的过程称为缓存。因此,当后续用户访问同一网站或服务器时,缓存数据允许更快的加载时间,因为缓存本质上“召回了”数据。
缓存能够满足的请求内容越多,则缓存命中率就越高。
例如,一种流行的缓存策略是 cache-aside 模式。在此模式中,应用程序首先在缓存中查找请求的数据。如果在缓存中找不到数据(缓存未命中),则应用程序从主存储中获取数据,将其存储在缓存中以供将来使用,然后将其返回给用户。可以从缓存中满足对相同数据的后续请求,从而提高性能。为了实现 cache-aside,通常使用缓存键在缓存中唯一标识数据。
>在我们的 企业级缓存:大规模缓存策略 论文中了解更多信息。
假设您进入一个使用缓存机制存储网页的网站。如果您更改了个人资料信息,并且该页面的缓存尚未失效,则仍会显示旧信息。这可能会造成混乱,甚至隐私问题。缓存失效会将应用缓存中存储的数据与服务器上存储的数据进行比较。如果两者不同,则缓存会被标记为无效,并用服务器的最新数据更新。
缓存失效涉及跨多个系统层同步多个数据副本,如 Web 或应用程序服务器和数据库。此同步过程可能很复杂,需要跨多个系统组件进行仔细协调。对一层进行的更改可能需要传播到其他多层,并且更新的发生顺序对于维护系统一致性至关重要。
一旦一个输入发生更改,缓存中就会出现无效的结果。此外,程序可能会继续工作,这使得很难确定问题出在哪里,以便修复缓存失效逻辑。
想象一下它就像一个可以借书的图书馆。您无需每次需要书时都去原来的书店,您可以先查看图书馆是否有副本。如果书可在图书馆借阅,则您可以直接借阅,而无需去书店。图书馆有越多满足您要求的书籍,在无需额外去书店的情况下找到您需要的书的几率就越大。类似地,缓存存储了经常访问的数据,从而让检索数据变得更快,并减轻原始存储或来源的负担。
当应用程序需要数据时,它首先会检查缓存中是否存在该数据。如果存在该数据,则应用程序可以直接从缓存中检索该数据。但是,如果缓存中不存在该数据,则应用程序需要从主存储中提取该数据或通过服务生成该数据。获取数据后,它会被存储在缓存中,以便将来可以更快地访问。这种从缓存中存储和检索数据的过程称为缓存。因此,访问同一网站或服务器的后续用户可以受益于更快的加载时间,因为缓存本质上会“召回”数据。
值得注意的是,缓存失效会受到多种因素的影响,其中包括 cookie 的使用。Cookie 是存储在用户设备上的小块数据,可以用于通过将特定缓存条目与特定用户数据关联起来来管理缓存失效。例如,如果用户的个人资料信息已更新,则可以使用 cookie 来使与该用户关联的缓存条目失效。
如上所述,不使缓存失效会导致问题,如不准确和安全问题。以下是缓存失效的一些好处以及不使缓存失效的风险
缓存失效会从缓存中清除旧数据,从而释放空间并提高缓存命中率。这反过来会更快地检索经常访问的数据。另一方面,如果缓存未失效,它可能会继续存储旧数据,从而导致性能和效率下降。
清除不必要的数据可降低服务器或数据库的负载。由此一来,这可以帮助提高系统的可靠性和可扩展性。
持续从真实来源获取数据的需要会占用大量的系统资源、时间或对大量数据的独占访问。缓存失效减少了对这些资源密集型任务的需求。这可以帮助节省服务器资源并降低系统的总体成本。
当敏感数据保存在缓存中且未失效时,它可能会面临未经授权的访问和数据泄露。缓存失效可确保敏感数据不会在缓存中保留过长时间,从而降低此类风险和其他安全漏洞。
用户几乎总是渴望拥有更快的体验。谷歌的研究表明,移动设备上的页面加载时间为 10 秒时,跳出率会上升 123%。
此外,向用户提供所请求的同一数据不同版本会引发隐私问题和造成不一致的体验。所以,正确地使缓存失效可以最大限度地缩短延迟并向用户提供最新数据,从而改善用户体验。
许多应用程序、软件和网站都受制于监管要求。这些政府颁布的法规要求会根据软件或位置而有所不同。不能使缓存数据失效可能会造成不合规。
通过仅在缓存中存储经过授权且正确的数据,失效可以帮助您遵守政府法规 CCPA、GDPR 和 HIPAA。
有若干类型的缓存失效技术。每种类型的实施都取决于应用程序的具体要求。在我们继续之前,我们先解释一下依赖项 ID 是什么,因为我们在以下段落中会频繁提及它。
依赖项 ID 是一个标签,用于标识哪些缓存条目将被失效。相同的标签可以附加到一个或多个缓存条目,创建一个用于失效规则的组来失效一整个组的条目。
现在,我们来看看最常见的缓存失效类型
基于时间的失效是一种最简单的缓存失效类型,但它也有一些缺点。它会根据预定的时间间隔使数据失效。尽管有多种方法可以实现基于时间的失效,但通常通过在 cache-spec.xml 等缓存配置文件中的 缓存条目 中添加 <<timeout> 值来完成。此值表示保留条目的秒数。但是,超时时间可以根据应用程序的具体需要及其显示的数据进行定制。可以按小时使缓存失效,以确保使用的不是过时的数据。
可以采用基于时间的失效的一些场景示例包括按小时显示最新新闻的新闻网站或按小时更新预报的天气预报应用程序。其他场景包括每隔几分钟更新股价的股票交易应用程序以及每隔几小时显示航班可用性和价格变动的旅行计划应用程序。
当系统中触发一个特定事件时,基于事件的缓存失效会发生。当缓存数据与特定的事件或状态改变相关并且必须正确更新时,这种类型的失效是很有用的。举例来说,基于事件的失效可能在博文更新时发生。必须使前一个缓存数据失效,以确保用户在博文中看到更新的信息。
基于命令的缓存失效发生在用户触发一个具体的已定义命令或动作,生成一个失效 ID。一个依赖项 ID 通常会生成并与一个缓存对象相关联。所以,当一个带失效 ID 的命令被执行时,任何在缓存中带匹配依赖项和失效 ID 的对象都会失效。一个示例是当一个用户从存储中删除一个文件时。必须使该文件的缓存失效,以确保用户不会再次看到文件被列出来。
在缓存根据组或分类失效时,基于组的失效会发生。当缓存数据与更大的缓存条目组相关联时,这是特别有用的,从而单独使每个条目失效是低效的。简单地说,当必须一下子使一组较大的数据失效时,基于组的失效是必需的。我们仍然使用之前相同的新闻网站示例。但是这一次,如果网站的一部分(例如,政治)正在更新,那么该部分中的所有文章都应该在缓存中失效。这确保用户看到政治方面的最新新闻。对于电子商务网站,当产品类别更新时可以触发基于组的失效。根据具体的需要,以上所有类型的缓存失效都能一起使用。这有助于创建一个有效且高效的缓存战略。
可以使用多种策略来确保有效地进行缓存失效。以下列出了一些常见的策略
当缓存已满时,LRU 算法定义了从缓存中失效元素以创建新元素空间的策略。这意味着它首先丢弃最近最少使用的项。LRU 假设这些最近最少使用的项将来不太可能被需要,因此首先清除它们。例如,当计算机的 RAM 已满时,操作系统可能会首先使最近最少使用的内存页失效,以腾出空间用于新数据。
(LFU) 是一种缓存算法,当缓存已满时,它将移除最不常使用的缓存块。也就是说,访问次数最少的缓存条目将被驱逐。此策略意味着不定期访问的项将来使用的可能性最低。因此,这些缓存条目将首先被驱逐。搜索引擎使用此缓存策略使查询缓存失效。一方面,查询会存储经常执行查询的搜索结果。但是,最不常用的查询将首先失效。
顾名思义,随机替换算法是一种失效策略,它会随机选取任何缓存条目并替换它。此算法不需要数据结构,并且不监控数据内容的历史记录。随机替换模型假定每个缓存的数据在以后使用具有相同的可能性。因此,清除和替换哪一个都无所谓。负载平衡器使用随机替换缓存失效使它们的会话缓存失效。会话缓存会保存用户的会话数据,当缓存溢出时,LRU 或 LFU 会话将被随机失效。
当计算机系统的物理内存已满时,也可能发生随机替换。操作系统可能会选择将一些内存页替换到硬盘中。如果某个内存页必须换回物理内存,但没有空间,则操作系统可能会随机使一个内存页失效。
先进先出是一种除了缓存以外,在许多行业和业务中应用的策略。这里的逻辑是,最旧的数据或库存项目应首先清除。在缓存失效的背景下,FIFO 是指首先使第一个缓存条目失效。这是因为它们更有可能在缓存中停留最长时间,这意味着它们将来不太可能被使用。例如,打印机使用 FIFO 来选择首先执行哪些打印作业。将数据发送进来的用户更有可能位于打印队列的前端。
此外,数据库系统使用事务日志来跟踪数据库更改。当事务日志已满时,最旧的日志条目将首先失效。最终,你的缓存无效化策略很大程度上将取决于系统要求,如缓存大小、数据访问频率和数据类型。在某些情况下,可以使用不同的缓存无效化策略。这可以优化缓存性能并提高系统效率。
尽管缓存无效化是一种节省服务器资源、提高速度和减少延迟的出色方式,但正确地进行十分重要。
缓存对于提高系统性能和速度很有用。但是,过度缓存可能会损害性能,因为它可能消耗宝贵的内存资源并增加服务器负载。这意味着服务器被迫持续更新和管理缓存,从而可能导致定期停机。如果你的网站或在线平台接受用户生成的内容 (UGC),长时间缓存内容可能会导致网站声誉受损的不一致性。因此,你必须在缓存经常访问的数据和允许不经常使用的数据失效之间取得平衡。
设置正确的缓存过期时间对于网站优化至关重要。它有助于减少服务器上的负载,也改善了用户体验。在设置缓存过期时间时,你必须考虑页面上的内容类型。
例如,如果页面包含像电子商务产品或 UGC 之类的动态内容,这些内容会定期更新,则缓存过期时间应该更短。而如果页面显示不经常更新的静态内容,则缓存过期时间可以延长。谷歌建议静态资产(如 CSS 文件、图像或 JavaScript 文件)的缓存时间最少为一年。对于像股价、新闻文章、天气预报和社交媒体订阅源之类经常更新的内容,缓存过期时间应为几分钟到一小时。这可以确保用户收到最新信息。
缓存的数据有时取决于其他数据或资源,这意味着对依赖数据进行更改可能需要使缓存中的数据无效。确保缓存的数据与事实来源一致至关重要。如果更改依赖数据,则缓存的数据可能变得陈旧,导致用户看到的将是过时的数据。