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

如何创建一个辅助CacheManager没有覆盖默认的Spring缓存

武晨
2023-03-14

我有一个默认的redis缓存配置在我的application.yml:

cache:
    type: redis
    redis:
      time-to-live: 7200000 # 2 hour TTL - Tune this if needed later
  redis:
    host: myHost
    port: myPort
    password: myPass
    ssl: true
    cluster:
      nodes: clusterNodes
    timeout: 10000

它工作得很好,我不想为它创建任何自定义缓存管理器。

然而,在我的代码中有一些缓存不需要使用redis。因此,我想制作第二个CacheManager,它是一个简单的ConcurrentHashMap,并用@Cacheable指定它

为此,我创建了一个新的CacheManager Bean:


@Configuration
@EnableCaching
@Slf4j
class CachingConfiguration {

    @Bean(name = "inMemoryCache")
    public CacheManager inMemoryCache() {
        SimpleCacheManager cache = new SimpleCacheManager();
        cache.setCaches(Arrays.asList(new ConcurrentMapCache("CACHE"));
        return cache;
    }

}

这将导致inMemoryCache成为我的默认缓存,而我的所有其他@Cacheable()都试图使用inMemoryCache。我不希望我创建的CacheManager bean成为默认值。我是否可以指定它是次要的,而不是阻止SpringCache发挥其魔力?

谢谢

共有1个答案

曾珂
2023-03-14

我能够从yml中保留默认的Redis配置,并使用以下代码添加一个新的inMemory CacheManager(我使用的是群集Redis):

    @Bean
    @Primary
    public RedisCacheManager redisCacheManager(LettuceConnectionFactory lettuceConnectionFactory) {
        RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig();
        redisCacheConfiguration.usePrefix();


        return RedisCacheManager.RedisCacheManagerBuilder.fromConnectionFactory(lettuceConnectionFactory)
                .cacheDefaults(redisCacheConfiguration).build();
    }

    @Bean
    public LettuceClusterConnection getConnection(LettuceConnectionFactory lettuceConnectionFactory) {
        LettuceClusterConnection clusterConnection = (LettuceClusterConnection) lettuceConnectionFactory.getClusterConnection();
        return clusterConnection;
    }


    @Bean(name = "inMemoryCache")
    public CaffeineCacheManager inMemoryCache() {
        CaffeineCacheManager cacheManager =  new CaffeineCacheManager();
        cacheManager.setCaffeine(caffeineCacheBuilder());
        return cacheManager;
    }

    Caffeine< Object, Object > caffeineCacheBuilder() {
        return Caffeine.newBuilder()
                .initialCapacity(3000)
                .maximumSize(40000)
                .expireAfterAccess(30, TimeUnit.MINUTES);
    }
 类似资料:
  • 本文向大家介绍如何覆盖Spring Boot项目的默认属性?相关面试题,主要包含被问及如何覆盖Spring Boot项目的默认属性?时的应答技巧和注意事项,需要的朋友参考一下 这可以通过在application.properties文件中指定属性来完成。 例如,在Spring MVC应用程序中,您必须指定后缀和前缀。这可以通过在application.properties文件中输入下面提到的属性来

  • 我有一个RESTAPI,我不想强迫客户端发送请求参数。我有将近400个api方法,我不想将所有参数设置为“required=false” 我想覆盖Spring RequestParam的默认行为。我想将RequestParam接口的“required”属性的默认值设置为“false”。 有什么方法可以覆盖它吗?如果我不能或这不是最佳实践,有什么方法可以解决上述问题。

  • 我经常使用助手,我只是向用户返回带有消息的数据。现在我必须包括超文本传输协议状态代码,但我不想更改每个响应(这很可能是坏的)。 因此,我试图通过创建自己的

  • 有没有纯注解为Spring留档?我看到的90%的文档都是为xml实现编写的。 我正在尝试覆盖默认的JobLauncher以能够传递JobParameters,但我添加到下面代码中的任何JobLauncher函数都被忽略,而是运行默认的SimpleJobLauncher。 我想用4个不同的作业参数启动同一作业的4个并发实例。这些参数应该告诉读取器从哪个目录读取。 我可以使用@Value注释为目录传递

  • 问题内容: 我已经能够覆盖所有名称以“ android:”为前缀的主题,但是Android themes.xml还定义了似乎无法被覆盖的属性。例如: colorTheground是在Theme.Light xml中定义的,但是在此处添加它可以使我 错误。如何为整个应用程序覆盖该样式? 问题答案: 您可以用修改属性(如)的方式覆盖标准属性,只是不要忘记添加如下前缀:

  • 问题内容: 我想覆盖Java外观。我只想显示不同的按钮。 我想要Windows Look and Feel的所有功能,但仅按钮有所不同。希望你明白我的意思。 还告诉我如何制作圆形的JtabbedPane ??? 问题答案: 自定义GUI类 调用您的自定义GUI类