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
相关产品推荐
相关产品推荐

