缓存抽象的核心是将缓存应用于 Java 方法,从而减少 基于缓存中可用信息的执行次数。也就是说,每次 调用目标方法,抽象应用缓存行为,该行为检查 是否已针对给定参数调用该方法。如果已经 调用时,将返回缓存的结果,而无需调用实际方法。 如果尚未调用该方法,则调用该方法,并缓存结果并缓存 返回给用户,以便下次调用该方法时,缓存的结果为 返回。这样,只能调用昂贵的方法(无论是受 CPU 还是 IO 限制) 对于一组给定的参数,结果会重复使用,而不必实际使用 再次调用该方法。缓存逻辑是透明的,没有任何 对调用程序的干扰。
此方法仅适用于保证返回相同的方法 给定输入(或参数)的输出(结果),无论它们被调用多少次。 |
缓存抽象提供了其他与缓存相关的操作,例如 更新缓存的内容或删除一个或所有条目。如果出现以下情况,这些很有用 缓存处理在应用程序过程中可能更改的数据。
与 Spring Framework 中的其他服务一样,缓存服务是一个抽象
(不是缓存实现),并且需要使用实际存储来存储缓存数据——也就是说,抽象使您不必编写缓存逻辑,但不需要
提供实际数据存储。这种抽象是由 和 接口实现的。org.springframework.cache.Cache
org.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 代码块 通过编程缓存交互找到。 不应用任何锁,多个线程可能会尝试同时加载同一项目。 这同样适用于驱逐。如果多个线程尝试更新或逐出数据 同时,您可以使用过时的数据。某些缓存提供程序提供高级功能 在那个领域。有关更多详细信息,请参阅缓存提供程序的文档。
要使用缓存抽象,您需要注意两个方面:
-
缓存声明:确定需要缓存的方法及其策略。
-
缓存配置:存储数据并从中读取数据的后备缓存。