【问题标题】:Is it possible to use the cache I want with @Cacheable spring?是否可以在@Cacheable spring 中使用我想要的缓存?
【发布时间】:2018-06-20 18:02:51
【问题描述】:

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

我想用它来缓存远程服务调用,可以用@Cacheable 做同样的事情吗?

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

【问题讨论】:

    标签: spring caching spring-annotations spring-cache


    【解决方案1】:

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

    例如:

    1. 您的意思是您已经构建了自己的缓存解决方案,或者您正在使用第 3 方缓存解决方案,但核心 Spring Framework @ 没有提供开箱即用的缓存提供程序实现。 987654321@ 或 Spring Boots 中的 1 个 supported caching providers?如果是这样,那么您会看到here。简而言之,您必须提供 Spring 的 CacheManagerCache 接口的实现,以“调整”您的“自定义”缓存解决方案以适应 Spring 的缓存抽象

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

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

    如果您有自建或第三方“自定义”缓存解决方案,那么您当然必须调整缓存提供程序的类型,以便将其插入 Spring 框架的缓存基础设施并使用 declarative annotation-based caching(例如 @ 987654343@).

    期望 Spring 知道如何与任何可能的可用缓存实现交互,或者尚未被构思出来,这是不合理的。

    因此,CacheManagerCache 接口允许您调整您选择的缓存解决方案/提供者,即使您自己烘焙它,并且仍然使用 Spring 的缓存基础架构,例如 declarative annotation-based caching(即使用 @ 987654346@、@CachePut 等等,甚至是JCache (JSR-107) annotations,如果你愿意的话)。

    这是在 Spring 的缓存抽象本身中插入和使用不同缓存提供程序的基本基础。

    例如,查看Redis implementation,特别是RedisCacheManagerRedisCache 类,它们分别实现了Spring 的CacheManagerCache 接口,或者Pivotal GemFire implementation,特别是@ 987654334@ 和 GemfireCache 类,它们又分别实现了 Spring 的 CacheManagerCache 接口。

    所有缓存解决方案都使用相同的模式,这些解决方案可以插入到 Spring 的缓存抽象中。

    每个缓存提供程序将使用不同的概念来说明该特定提供程序的“缓存”实际上是什么。在 Pivotal GemFire 中,缓存是 Region。因此,必须通过实现 Spring 的 Cache 接口来调整 GemFire 的 Region 类型,以便区域可以充当 Spring 缓存抽象中的“缓存”。对于任何提供者都是如此,即使是像java.util.concurrent.ConcurrentHashMap 这样简单的东西,请参阅here,然后是here

    所以,如果你有自己的缓存实现...

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

    2. 然后提供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();
      }
    }
    

    就是这样;你都准备好了!

    无论如何,我希望这有助于您了解必须做什么。

    干杯! -约翰

    【讨论】:

      【解决方案2】:

      来自 Spring 文档,

      自定义缓存分辨率:默认缓存分辨率非常适合 使用单个 CacheManager 并且没有复杂的应用程序 缓存分辨率要求。

      对于使用多个缓存管理器的应用程序,可以 将 cacheManager 设置为每次操作使用:

      参考spring文档here

      【讨论】:

      • 缓存管理器只允许我返回一个 org.springframework.cache.CacheManager 类型..但是我的自定义缓存不是那种类型...即使使用缓存管理器我也只能使用弹簧似乎是特定的缓存..
      猜你喜欢
      • 2021-02-21
      • 1970-01-01
      • 2012-08-20
      • 1970-01-01
      • 2018-02-07
      • 1970-01-01
      • 2012-07-01
      • 2016-12-05
      • 2015-05-02
      相关资源
      最近更新 更多