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