缓存与缓冲区

术语“缓冲区”和“缓存”往往可以互换使用。但是请注意, 它们代表不同的事物。传统上,缓冲液用作中间体 快速和慢速实体之间的数据临时存储。因为一方将不得不等待 对于另一个(影响性能),缓冲区通过允许整个 数据块可以立即移动,而不是成小块移动。写入和读取数据 缓冲区仅一次。此外,缓冲区至少对一方可见 这是意识到的。

另一方面,根据定义,缓存是隐藏的,任何一方都不知道 发生缓存。它还提高了性能,但通过让相同的数据 快速阅读多遍。

您可以在此处找到有关缓冲区和缓存之间差异的进一步说明。

缓存抽象的核心是将缓存应用于 Java 方法,从而减少 基于缓存中可用信息的执行次数。也就是说,每次 调用目标方法,抽象应用缓存行为,该行为检查 是否已针对给定参数调用该方法。如果已经 调用时,将返回缓存的结果,而无需调用实际方法。 如果尚未调用该方法,则调用该方法,并缓存结果并缓存 返回给用户,以便下次调用该方法时,缓存的结果为 返回。这样,只能调用昂贵的方法(无论是受 CPU 还是 IO 限制) 对于一组给定的参数,结果会重复使用,而不必实际使用 再次调用该方法。缓存逻辑是透明的,没有任何 对调用程序的干扰。

此方法仅适用于保证返回相同的方法 给定输入(或参数)的输出(结果),无论它们被调用多少次。

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

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

Spring 提供了该抽象的一些实现: 基于 JDK 的缓存、Gemfire 缓存、Caffeine 和 JSR-107 兼容缓存(例如 作为 Ehcache 3.x)。有关插入其他缓存的更多信息,请参阅插入不同的后端缓存 商店和供应商。java.util.concurrent.ConcurrentMap

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

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

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

要使用缓存抽象,您需要注意两个方面:

  • 缓存声明:确定需要缓存的方法及其策略。

  • 缓存配置:存储数据并从中读取数据的后备缓存。