了解缓存抽象
从本质上讲,缓存抽象将缓存应用于 Java 方法,从而减少了基于缓存中可用信息的执行次数。也就是说,每次调用目标方法时,抽象都会应用缓存行为,检查该方法是否已经针对给定的参数被调用。如果已经调用过,则返回缓存的结果,而无需调用实际方法。如果该方法尚未被调用,则调用该方法,并将结果缓存并返回给用户,以便下次调用该方法时,返回缓存的结果。这样,昂贵的(无论是 CPU 绑定还是 IO 绑定)方法只需针对给定的参数集调用一次,并且可以重复使用结果,而无需再次实际调用该方法。缓存逻辑以透明的方式应用,不会对调用者造成任何干扰。
这种方法仅适用于保证无论调用多少次,对于给定的输入(或参数)都返回相同输出(结果)的方法。 |
缓存抽象提供其他与缓存相关的操作,例如更新缓存内容或删除一个或所有条目。如果缓存处理在应用程序运行过程中可能发生变化的数据,这些操作非常有用。
与 Spring 框架中的其他服务一样,缓存服务是一个抽象(而不是缓存实现),需要使用实际存储来存储缓存数据,也就是说,抽象使您无需编写缓存逻辑,但不会提供实际的数据存储。该抽象由 org.springframework.cache.Cache
和 org.springframework.cache.CacheManager
接口实现。
Spring 提供了 几种实现 该抽象:基于 JDK java.util.concurrent.ConcurrentMap
的缓存、Gemfire 缓存、Caffeine 和符合 JSR-107 的缓存(例如 Ehcache 3.x)。有关插入其他缓存存储和提供程序的更多信息,请参阅 插入不同的后端缓存。
缓存抽象没有针对多线程和多进程环境进行特殊处理,因为这些功能由缓存实现来处理。 |
如果您拥有多进程环境(即部署在多个节点上的应用程序),则需要相应地配置您的缓存提供程序。根据您的用例,在多个节点上复制相同的数据可能就足够了。但是,如果您在应用程序运行过程中更改了数据,则可能需要启用其他传播机制。
缓存特定项目与使用编程缓存交互时常见的“如果未找到则获取,然后继续并最终放入”代码块直接等效。不会应用任何锁,并且多个线程可能尝试同时加载相同的项目。这同样适用于驱逐。如果多个线程尝试同时更新或驱逐数据,您可能会使用陈旧数据。某些缓存提供程序在该领域提供高级功能。有关更多详细信息,请参阅您的缓存提供程序的文档。
要使用缓存抽象,您需要处理两个方面
-
缓存声明:识别需要缓存的方法及其策略。
-
缓存配置:存储和读取数据的后端缓存。