对于最新的稳定版本,请使用 Spring Framework 6.2.0spring-doc.cn

了解缓存抽象

缓存与缓冲区

术语 “buffer” 和 “cache” 往往可以互换使用。但是请注意, 他们代表不同的事物。传统上,缓冲区用作中间体 快速实体和慢速实体之间的数据的临时存储。因为一方必须等待 对于另一个(影响性能),缓冲区通过允许整个 一次移动的数据块,而不是小块移动。数据被写入和读取 仅从 buffer 中获取一次。此外,缓冲区至少对一方可见 那是知道的。spring-doc.cn

另一方面,根据定义,缓存是隐藏的,任何一方都不知道 发生缓存。它还提高了性能,但这样做是为了让相同的数据 快速阅读多次。spring-doc.cn

您可以在此处找到缓冲区和缓存之间差异的进一步说明。spring-doc.cn

从本质上讲,缓存抽象将缓存应用于 Java 方法,从而减少 基于缓存中可用信息的执行次数。也就是说,每次 调用 targeted 方法时,抽象会应用一个缓存行为,该行为会检查 是否已为给定参数调用该方法。如果已经 调用,则返回缓存的结果,而不必调用实际方法。 如果尚未调用该方法,则调用该方法,并缓存结果并 返回给用户,以便下次调用该方法时,缓存的结果是 返回。这样,只能调用昂贵的方法 (无论是 CPU 绑定还是 IO 绑定) 一次,结果被重用,而无需实际 再次调用该方法。缓存逻辑以透明方式应用,没有任何 干扰调用者。spring-doc.cn

此方法仅适用于保证返回相同 output (result) 的 input (或参数) 的 intent 值,无论它们被调用了多少次。

缓存抽象提供了其他与缓存相关的操作,例如具有 以更新缓存的内容或删除一个或所有条目。这些 API 在以下情况下非常有用 缓存处理在应用程序过程中可能更改的数据。spring-doc.cn

与 Spring 框架中的其他服务一样,缓存服务是一个抽象 (不是 cache 实现),并且需要使用实际的 storage 来存储 cache 数据 — 也就是说,抽象使您不必编写 cache logic,但不需要 提供实际数据存储。这种抽象由 和 接口实现。org.springframework.cache.Cacheorg.springframework.cache.CacheManagerspring-doc.cn

Spring 提供了该抽象的一些实现: 基于 JDK 的缓存、Gemfire 缓存、Caffeine 和 JSR-107 兼容缓存(例如 作为 Ehcache 3.x)。有关插入其他缓存的更多信息,请参阅 Plugging-in Different Back-end Caches 商店和提供商。java.util.concurrent.ConcurrentMapspring-doc.cn

缓存抽象对多线程和 多进程环境,因为此类功能由 Cache 实现处理。

如果您有一个多进程环境(即部署在多个节点上的应用程序), 您需要相应地配置缓存提供程序。根据您的使用案例,副本 多个节点上的相同数据就足够了。但是,如果您在 在应用程序过程中,您可能需要启用其他传播机制。spring-doc.cn

缓存特定项目直接等同于典型的 get-if-not-found-then-proceed-and-put-finally 代码块 通过编程缓存交互找到。 不应用锁,并且多个线程可能会尝试同时加载同一项。 这同样适用于驱逐。如果多个线程正在尝试更新或逐出数据 同时,您可以使用过时的数据。某些缓存提供程序提供高级功能 在那个地区。有关更多详细信息,请参阅缓存提供程序的文档。spring-doc.cn

要使用缓存抽象,您需要注意两个方面:spring-doc.cn

  • 缓存声明:确定需要缓存的方法及其策略。spring-doc.cn

  • 缓存配置:存储数据并从中读取数据的后备缓存。spring-doc.cn