春@Cacheable标注为不同的服务同样的方法
我已经在Spring启动应用程序实现的标准Redis的缓存模板按照以下article:春@Cacheable标注为不同的服务同样的方法
我那是什么让对象的列表两种不同的服务:
@RequestMapping("/admin/test/list")
public String testCache() {
List<Cocktail> cocktails = cocktailsService.list();
List<Ingredient> ingredients = ingredientsService.list();
return "index";
}
注:该方法名称和签名是相同的(即list()
),但它们都具有不同的缓存名称为这样:
// CocktailService
@Cacheable(value = “COCKTAILS”)
public List<Cocktail> list() {
return repository.findAll();
}
// IngredientsService
@Cacheable(value = “INGREDIENTS”)
public List<Ingredient> list() {
return repository.findAll();
}
的问题
即使你的缓存名称是不同的方法总是从缓存中返回列表,生成密钥时,有在方法层面没有区别。
可能的解决方案
我知道三种解决方案可能是:
- 更改方法名
- 编写自定义的KeyGenerator
-
一套高速缓存规划环境地政司利用#root的。目标如:
@Cacheable(value =“COCKTAILS”,key =“{ #root.targetClass}“) @Cacheable(值=”配料”,关键= ”{#root.targetClass}“)
问题
但切切实实的,必须有一个更好的办法或不?
您所遵循的文章中存在问题。在创建的CacheManager豆,你需要调用cacheManager.setUsePrefix(true);
,才缓存名COCKTAILS和成分将用作Redis的缓存键鉴别。
这里是你应该如何申报缓存管理器bean:与`@ Cacheable`注解,即它们将属于`COCKTAILS指定
@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;
}
显然,在处理其他缓存解决方案时,Spring的CacheManger通常包含一个由独立缓存支持的缓存(每个实现类似功能的地图)实现的映射。使用默认的RedisCacheManager配置,情况并非如此。基于对RedisCacheManager的javadoc评论,它不清楚这是一个错误还是仅仅是不完整的文档。 “...默认情况下,通过追加前缀(作为名称空间)来保存键值。”https://www.javacodegeeks.com/2013/02/caching-with-spring-data-redis.html – Ithar
缓存的数据,在你的服务,将属于不同的缓存区'和'INGREDIENTS'区域,因此即使它们的密钥相同,它们也会缓存在不同的缓存区域中。由于其他原因,您似乎没有按预期得到结果。尝试启用Spring Cache的日志记录以查看发生了什么:**具有** TRACE **级别的org.springframework.cache **。 – Igor