我已根据以下article在Spring启动应用程序中实现了标准redis缓存模板:
我所拥有的是获得对象列表的两种不同服务:
@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();
}
问题
即使缓存名称不同,方法总是从缓存返回列表,因为在生成密钥时方法级别没有区别。
可能的解决方案
我知道有三种解决方案可以:
设置Cache SpEL以使用#root.target,例如:
@Cacheable(value =“COCKTAILS”,key =&#34; {#root.targetClass}&#34;) @Cacheable(value =“INGREDIENTS”,key =&#34; {#root.targetClass}&#34;)
问题
但是,必须有更好的方法吗?
答案 0 :(得分:1)
您遵循的文章中存在问题。创建 CacheManager bean时,需要调用cacheManager.setUsePrefix(true);
,只有缓存名称 COCKTAILS 和 INGREDIENTS 才会被用作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;
}