gpt4 book ai didi

java - Spring Cache - 创建自定义 CacheManager

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:24:32 27 4
gpt4 key购买 nike

我正在使用 Spring Boot 和 EhCache 开发日历应用程序。我正在尝试缓存以下方法:

@Override
@Cacheable(value = "concerts")
public List<Event> getEvents(String eventsForUser, Date startDate, Date endDate) throws Exception {
return fetchEventsFromTheServer(eventsForUser, startDate, endDate);
}

挑战是我想操纵返回的缓存结果。例如,检查是否有给定日期但不同用户的缓存,然后返回它(只要两个用户都满足特定条件)。

所以,在返回结果之前我想:

  • 获取所有缓存条目的列表
  • 遍历所有这些并检查所需的日期/用户
  • 如果找到合适的 - 返回
  • 如果未找到 - 缓存不可用,请运行该方法。

我认为最好的办法是创建一个自定义缓存管理器,它将使用缓存的 Concert 进行所有操作,并为所有其他方法使用默认的自动配置缓存,但我无法让我的自定义管理器工作并且没有找到任何关于如何实现自定义 CacheManager 的好例子。

这是我的:

应用程序.java:

@SpringBootApplication
@ComponentScan
@EnableCaching
@EnableScheduling
public class SpringBootWebApplication extends SpringBootServletInitializer {

public static void main(String[] args) {
SpringApplication.run(SpringBootWebApplication.class, args);
}

@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(applicationClass);
}

private static Class<SpringBootWebApplication> applicationClass = SpringBootWebApplication.class;


@Bean(name = "eventsCacheManager")
public EventsCacheManager eventsCacheManager() {

return new EventsCacheManager();
}

@Primary
@Bean(name = "cacheManager")
public CacheManager cacheManager() {
return new EhCacheCacheManager(ehCacheCacheManager().getObject());
}

@Bean
public EhCacheManagerFactoryBean ehCacheCacheManager() {
EhCacheManagerFactoryBean cmfb = new EhCacheManagerFactoryBean();
cmfb.setConfigLocation(new ClassPathResource("ehcache.xml"));
cmfb.setShared(true);
return cmfb;
}


}

EventsCacheManager.java

@Component
public class EventsCacheManager implements CacheManager {

@Override
public Cache getCache(String s) {
return null;
}

@Override
public Collection<String> getCacheNames() {
return null;
}
}

EventsCacheManager.java - 如何实现?

@Component
public class EventsCacheManager implements CacheManager {

@Override
public Cache getCache(String s) {
return null;
}

@Override
public Collection<String> getCacheNames() {
return null;
}
}

如果有人能给我一个关于如何实现自定义 CacheManager 的示例,我将不胜感激

最佳答案

我没有花太多时间考虑您的需求/用例,但我确实认为自定义 CacheManager 可以在这种情况下工作,假设是“自定义” CacheManager逻辑正确。

因此,默认情况下,Spring 在上下文中查找名为“cacheManager”的 bean,并将其用于所有缓存操作。在您的配置中,您显然定义了 2 个“CacheManagers”...

@Bean(name = "eventsCacheManager")
public EventsCacheManager eventsCacheManager() {

return new EventsCacheManager();
}

@Primary
@Bean(name = "cacheManager")
public CacheManager cacheManager() {
return new EhCacheCacheManager(ehCacheCacheManager().getObject());
}

即“eventsCacheManager”(自定义)和“cacheManager”(标准)。实际上,您甚至将“cacheManager”标记为主要(使用 @Primary 注释)。当然,如果您不这样做,Spring 肯定会提示,因为在执行自动-接线(默认为按类型自动接线)。

因此,为了调用特定服务调用在运行时使用哪种缓存管理策略(即 CacheManager),您还需要告诉 Spring CacheManager(又名策略)使用,就像这样......

@Override
@Cacheable(value = "concerts", cacheManager="eventsCacheManager")
public List<Event> getEvents(String eventsForUser, Date startDate, Date endDate) throws Exception {
return fetchEventsFromTheServer(eventsForUser, startDate, endDate);
}

即在 @Cacheable 注释中使用 cacheManager 属性来指示要使用的缓存策略。

请参阅 Custom cache resolution 上的 Spring 引用文档了解更多详情。

希望这对您有所帮助。

关于java - Spring Cache - 创建自定义 CacheManager,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37784371/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com