是否可以在@Cacheable spring中使用我想要的缓存?

时间:2018-06-20 18:02:51

标签: spring caching spring-annotations spring-cache

我创建了一个自定义缓存来适合我的应用程序。

我想使用相同的方法来缓存远程服务调用,是否可以使用@Cacheable进行相同的操作?

据我探索,我没有发现任何允许@Cacheable使用自定义缓存的东西。

2 个答案:

答案 0 :(得分:1)

您对“自定义”缓存的描述非常模糊,根据上下文的不同可能会有不同的含义。

例如:

  1. 您是说您已经构建了自己的缓存解决方案,或者您正在使用的第三方缓存解决方案,其核心Spring Framework { {3}}还是Spring Boots cache storage providers之一?如果是这样,那么您会看到supported caching providers。简而言之,您必须提供Spring的hereCacheManager接口的实现,以“适应”您的“自定义”缓存解决方案以适合 Spring的缓存抽象

  2. 或者,也许您的意思是您需要一些复杂的,基于规则的“缓存解析逻辑”来确定要在运行时使用的适当缓存?在这种情况下,请参见Cache

让我们在上面的#1上进行扩展,因为这很可能是您的用例。

如果您有一个自建的或第三方的“自定义”缓存解决方案,那么您当然必须调整缓存提供程序的类型,以便将其插入Spring Framework的缓存基础结构并使用here(例如@Cacheable)。

期望Spring知道如何与可能的可用缓存实现接口,或者尚待构思。

因此,CacheManagerCache界面使您能够调整自己选择的缓存解决方案/提供程序,即使您自己烘焙了它,也仍然使用Spring的缓存基础架构,例如{{3 }}(例如,使用@Cacheable@CachePut,依此类推,甚至可以使用declarative annotation-based caching)。

这是在Spring的Cache Abstraction本身内部插入和使用不同的缓存提供程序的基本基础。

例如,检出declarative annotation-based caching,特别是JCache (JSR-107) annotationsRedis implementation类,它们分别实现了Spring的CacheManagerCache接口,或者Pivotal GemFire RedisCacheManager,特别是RedisCacheimplementation类,它们又分别实现了Spring的CacheManagerCache接口。

所有缓存解决方案都使用相同的模式,可以将其插入Spring的Cache Abstraction。

每个缓存提供程序将使用不同的概念来表示该特定提供程序的实际“缓存”。在Pivotal GemFire中,缓存为GemfireCacheManager。因此,必须通过实现Spring的Region接口来适应GemFire的Cache类型,以便Region可以用作Spring的Cache Abstraction中的“缓存”。对于任何提供程序来说都是如此,甚至是像GemfireCache这样简单的内容,请参见Region然后是java.util.concurrent.ConcurrentHashMap

因此,如果您有自己的缓存实现...

  1. 首先通过实现here接口中的方法(提供一个CustomCache类)来调整“自定义”缓存。 Cache界面中的方法将委托给您实际的缓存解决方案。

  2. 然后提供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