我创建了一个自定义缓存来适合我的应用程序。
我想使用相同的方法来缓存远程服务调用,是否可以使用@Cacheable进行相同的操作?
据我探索,我没有发现任何允许@Cacheable使用自定义缓存的东西。
答案 0 :(得分:1)
您对“自定义”缓存的描述非常模糊,根据上下文的不同可能会有不同的含义。
例如:
您是说您已经构建了自己的缓存解决方案,或者您正在使用的第三方缓存解决方案,其核心Spring Framework { {3}}还是Spring Boots cache storage providers之一?如果是这样,那么您会看到supported caching providers。简而言之,您必须提供Spring的here和CacheManager
接口的实现,以“适应”您的“自定义”缓存解决方案以适合 Spring的缓存抽象。
或者,也许您的意思是您需要一些复杂的,基于规则的“缓存解析逻辑”来确定要在运行时使用的适当缓存?在这种情况下,请参见Cache
。
让我们在上面的#1上进行扩展,因为这很可能是您的用例。
如果您有一个自建的或第三方的“自定义”缓存解决方案,那么您当然必须调整缓存提供程序的类型,以便将其插入Spring Framework的缓存基础结构并使用here(例如@Cacheable
)。
期望Spring知道如何与可能的可用缓存实现接口,或者尚待构思。
因此,CacheManager
和Cache
界面使您能够调整自己选择的缓存解决方案/提供程序,即使您自己烘焙了它,也仍然使用Spring的缓存基础架构,例如{{3 }}(例如,使用@Cacheable
,@CachePut
,依此类推,甚至可以使用declarative annotation-based caching)。
这是在Spring的Cache Abstraction本身内部插入和使用不同的缓存提供程序的基本基础。
例如,检出declarative annotation-based caching,特别是JCache (JSR-107) annotations和Redis implementation类,它们分别实现了Spring的CacheManager
和Cache
接口,或者Pivotal GemFire RedisCacheManager
,特别是RedisCache
和implementation类,它们又分别实现了Spring的CacheManager
和Cache
接口。
所有缓存解决方案都使用相同的模式,可以将其插入Spring的Cache Abstraction。
每个缓存提供程序将使用不同的概念来表示该特定提供程序的实际“缓存”。在Pivotal GemFire中,缓存为GemfireCacheManager
。因此,必须通过实现Spring的Region
接口来适应GemFire的Cache
类型,以便Region可以用作Spring的Cache Abstraction中的“缓存”。对于任何提供程序来说都是如此,甚至是像GemfireCache
这样简单的内容,请参见Region
然后是java.util.concurrent.ConcurrentHashMap
。
因此,如果您有自己的缓存实现...
首先通过实现here接口中的方法(提供一个CustomCache
类)来调整“自定义”缓存。 Cache
界面中的方法将委托给您实际的缓存解决方案。
然后提供CacheManager
的实现,例如CustomCacheManager
知道如何a)配置缓存解决方案,以及b)为Spring缓存注释中标识的所有缓存创建CustomCache
的实例。
假设您有一个CustomerService
方法,该方法知道如何通过其Accounts
查找客户...
@Service
class CustomerService {
@Cacheable("Customers")
Customer findBy(Account account) {
...
}
}
然后,您的CustomCacheManager
将需要为上述CustomCache
方法的@Cacheable
注释中标识的“客户”缓存提供一个CustomerService.findBy(:Account)
实例。
要在您的Spring应用程序中使用您的CustomCacheManager
实现,只需声明一个“名称”为“ cacheManager”的bean,即可返回您的CustomCacheManager
类的实例并“启用” Spring的缓存基础结构...
@Configuration
@EnableCaching
class MyCachingConfiguration {
@Bean
CustomCacheManager cacheManager() {
return new CustomCacheManager();
}
}
就是这样;一切都准备好了!
无论如何,我希望这可以帮助您了解必须执行的操作。
干杯! -约翰
答案 1 :(得分:0)
从Spring文档中,
自定义缓存分辨率:默认缓存分辨率非常适合 单个CacheManager且不复杂的应用程序 缓存分辨率要求。
对于使用多个缓存管理器的应用程序,可能 设置每个操作要使用的cacheManager:
请参阅spring doc here