You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot缓存能否动态设置缓存名称?若可以该如何实现?

Spring Boot Cache 动态设置cacheNames并自动创建缓存

可以实现动态设置缓存名称,同时自动创建不存在的缓存,具体实现步骤如下:

1. 利用SpEL表达式动态指定cacheNames

Spring Cache的@Cacheable注解支持SpEL表达式,直接将请求参数绑定到cacheNames属性,即可实现根据参数动态生成缓存名称。修改你的Controller代码如下:

@RestController
public class TestController {
    
    @Cacheable(cacheNames = "#name", key = "#name")
    @GetMapping("/test/{name}")
    public String test(@PathVariable String name) {
        System.out.println("########Test Called ###### " + name);
        return HttpStatus.OK.toString();
    }
}

这里#name会直接取请求路径中的name参数值作为缓存名称。

2. 配置CacheManager自动创建缓存

默认情况下,Spring的缓存管理器(如ConcurrentMapCacheManager)在缓存不存在时会抛出IllegalStateException,因此需要配置缓存管理器允许动态创建不存在的缓存。

基于内存缓存(ConcurrentMapCacheManager)的配置

@Configuration
@EnableCaching
public class CacheConfig {

    @Bean
    public CacheManager cacheManager() {
        return new ConcurrentMapCacheManager() {
            @Override
            protected Cache createConcurrentMapCache(String cacheName) {
                // 自定义缓存创建逻辑,比如设置是否允许空值、缓存容量等
                return new ConcurrentMapCache(cacheName, CacheBuilder.newBuilder().build().asMap(), false);
            }
        };
    }
}

重写createConcurrentMapCache方法可以自定义缓存的创建规则,默认的ConcurrentMapCacheManager其实已经支持动态创建缓存,重写是为了更灵活地配置缓存属性。

基于Redis缓存(RedisCacheManager)的配置

如果使用Redis作为缓存介质,需要开启allowInFlightCacheCreation来允许动态创建缓存空间:

@Configuration
@EnableCaching
public class RedisCacheConfig {

    @Bean
    public CacheManager cacheManager(RedisConnectionFactory connectionFactory) {
        // 定义默认缓存配置
        RedisCacheConfiguration defaultConfig = RedisCacheConfiguration.defaultCacheConfig()
                .entryTtl(Duration.ofMinutes(10)) // 设置默认缓存过期时间
                .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer()))
                .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer()));

        return RedisCacheManager.builder(connectionFactory)
                .cacheDefaults(defaultConfig)
                .allowInFlightCacheCreation(true) // 允许动态创建缓存
                .build();
    }
}

关键说明

  • SpEL表达式可以灵活绑定请求参数、方法参数等,除了#name,还可以使用其他表达式如#request.param('xxx')获取请求参数。
  • 缓存管理器必须配置为允许动态创建缓存,否则首次访问未存在的缓存名称时会抛出异常。
  • 可以通过自定义缓存创建逻辑,为不同的缓存名称设置差异化配置(比如不同的过期时间)。

内容的提问来源于stack exchange,提问作者Uttam Pawar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 18:01:15