Java 不同服务中相同方法的Spring@Cacheable注释
我在Spring boot应用程序中实现了标准redis缓存模板,如下所示: 我拥有两个不同的服务,它们可以获取对象列表:Java 不同服务中相同方法的Spring@Cacheable注释,java,spring-boot,spring-cache,Java,Spring Boot,Spring Cache,我在Spring boot应用程序中实现了标准redis缓存模板,如下所示: 我拥有两个不同的服务,它们可以获取对象列表: @RequestMapping("/admin/test/list") public String testCache() { List<Cocktail> cocktails = cocktailsService.list(); List<Ingredient> ingredients = ingredientsService.l
@RequestMapping("/admin/test/list")
public String testCache() {
List<Cocktail> cocktails = cocktailsService.list();
List<Ingredient> ingredients = ingredientsService.list();
return "index";
}
问题
即使缓存名称不同,该方法也总是从缓存返回列表,因为在生成键时在方法级别没有区别
可能的解决方案
我知道有三种解决方案:
但是肯定有更好的方法吗?你所关注的文章中有一个问题。创建CacheManagerbean时,需要调用
CacheManager.setUsePrefix(true)代码>,只有缓存名称鸡尾酒和配料才会用作Redis缓存密钥鉴别器
下面是您应该如何声明缓存管理器bean:
@Bean
public CacheManager cacheManager(RedisTemplate redisTemplate) {
RedisCacheManager cacheManager = new RedisCacheManager(redisTemplate);
// Number of seconds before expiration. Defaults to unlimited (0)
cacheManager.setDefaultExpiration(300);
cacheManager.setUsePrefix(true);
return cacheManager;
}
在您的服务中,缓存的数据将属于@Cacheable
注释指定的不同缓存区域,即它们将属于鸡尾酒
和配料
区域,因此,即使它们的密钥相同,它们也将缓存在不同的缓存区域。由于其他原因,您似乎没有得到预期的结果。尝试启用Spring缓存的日志记录以查看发生了什么:org.springframework.Cache with TRACE level。显然,在处理其他缓存解决方案时,Spring的CacheManager通常包含一个缓存映射(每个实现类似映射的功能)实现,这些实现由单独的缓存支持。使用默认的RedisCacheManager配置,情况并非如此。根据RedisCacheManager上的javadoc注释,不清楚这是一个bug还是不完整的文档。“…默认情况下,通过附加前缀(充当命名空间)来保存键。”
@Bean
public CacheManager cacheManager(RedisTemplate redisTemplate) {
RedisCacheManager cacheManager = new RedisCacheManager(redisTemplate);
// Number of seconds before expiration. Defaults to unlimited (0)
cacheManager.setDefaultExpiration(300);
cacheManager.setUsePrefix(true);
return cacheManager;
}