当前位置: 首页 > 知识库问答 >
问题:

Spring Cache-创建自定义CacheManager

孙阳旭
2023-03-14

我正在使用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执行所有操作,并使用默认的自动配置缓存用于所有其他方法,但我无法让我的自定义管理器工作,也没有找到任何关于如何实现自定义缓存管理器的好例子。

这是我所拥有的:

pplication.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;
    }


}

事件管理器。Java语言

@Component
public class EventsCacheManager implements CacheManager  {

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

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

事件管理器。java-如何实现它?

@Component
public class EventsCacheManager implements CacheManager  {

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

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

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

共有2个答案

方鸿羲
2023-03-14

从我对你问题的理解来看,我认为你对这个问题的看法是错误的。

您不必浏览缓存内容来提取派生信息,而应该在加载主数据时将派生信息插入缓存。

例如,在加载基于月份的信息时,立即将其分解为基于日期的信息并将其也放入缓存中。

这个描述还应该清楚地表明,您想要做的事情超出了Spring缓存抽象的能力,因为您需要自定义缓存加载逻辑。

因此,我不建议破解CacheManager来隐藏该逻辑,而是从数据加载逻辑中执行。

孔深
2023-03-14

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

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

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

    return new EventsCacheManager();
}

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

即“eventsCacheManager”(自定义)和“cacheManager”(标准)。事实上,您甚至将“cacheManager”标记为主节点(使用@主节点注释)。当然,如果您没有这样做,Spring肯定会抱怨,因为在执行自动连接(默认为按类型自动连接)时,在上下文中发现了超过1个给定类型的bean(即CacheManager)。

因此,为了在运行时调用特定服务调用要使用的缓存管理策略(即缓存管理器),您还需要告诉Spring要使用哪个缓存管理器(也称为策略),例如。。。

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

一、 e.使用注释中的cacheManager属性来指示要使用的缓存策略。

有关更多详细信息,请参阅Spring关于自定义缓存解析的参考文档。

希望这对你有帮助。

 类似资料:
  • 问题内容: 注释如何与Java一起使用?以及如何创建这样的自定义注释: 基本上,我需要保留的POJO在持久化时像这样进行序列化: 这样,实际的生成/持久对象是这样的: 任何想法如何实现这一点? 问题答案: 如果创建自定义注释,则必须使用此处的 API 示例进行处理。您可以参考如何声明注释。 这是Java中的示例注释声明的样子。 并被称为。 表示您想在运行时保留注释,并且可以在运行时访问它。 表示您

  • 问题内容: 我在Django中启用了用户身份验证模块,但是当我使用它时,它仅询问用户名和两个密码/密码确认字段。我还希望将电子邮件和全名字段全部设置为必填字段。 我已经做到了: 现在,该表单显示了新字段,但是没有将它们保存到数据库中。 我怎样才能解决这个问题? 问题答案: 用户模型中没有调用此字段。 如果要使用原始模型存储名称,则必须将其分别存储为名字和姓氏。 编辑: 如果您只希望表单中的一个字段

  • 我正在使用helm charts创建部署微服务,通过执行helm create创建包含部署、服务和入口的基本图表,但我没有其他配置,如水平pod自动缩放器、pod中断预算。

  • 我们不仅可以分配事件处理程序,还可以从 JavaScript 生成事件。 自定义事件可用于创建“图形组件”。例如,我们自己的基于 JavaScript 的菜单的根元素可能会触发 open(打开菜单),select(有一项被选中)等事件来告诉菜单发生了什么。另一个代码可能会监听事件,并观察菜单发生了什么。 我们不仅可以生成出于自身目的而创建的全新事件,还可以生成例如 click 和 mousedow

  • 默认情况下,Navicat Monitor 从受监控的实例收集一组预设的服务器指标。你可能想要添加自己的查询,以收集特定实例的一些自定义性能指标,并在指标值超过某些阈值和持续时间时接收有关自定义数据的警报。若要配置自定义指标,请前往“配置”->“自定义指标”。 创建自定义指标和警报 在自定义指标页面中,点击“+ 新建自定义指标”。 【步骤一】输入自定义指标的定义: 指标名 输入自定义指标的名。 描

  • 问题内容: 我正在http://www.cafeaulait.org/javafaq.html上阅读#6.10项,然后我开始怀疑大型企业如何创建自己的JVM实现。一个人会尝试(或可行)实验性的东西吗? 问题答案: 从技术上讲,创建该新JVM所需的所有信息都是该语言和目标平台的公共规范。即使字节码解释在很大程度上相同,JVM还是需要根据其是要在台式机还是手机上运行而有所不同。 一些开始寻找信息的地方