Spring 不同服务中相同方法的@Cacheable 注解
Spring @Cacheable annotation for same method in different service
我已经按照以下 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();
}
问题
即使缓存名称不同,该方法也总是从缓存中返回列表,因为在生成键时在方法级别没有区别。
可能的解决方案
我知道三种解决方案可能是:
- 更改方法名称
- 编写自定义 KeyGenerator
设置Cache SpEL使用#root.target如:
@Cacheable(value=”COCKTAILS”, key="{#root.targetClass}")
@Cacheable(value=”成分”, key="{#root.targetClass}")
问题
但是肯定有更好的方法吗?
您关注的文章存在问题。创建 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;
}
我已经按照以下 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();
}
问题
即使缓存名称不同,该方法也总是从缓存中返回列表,因为在生成键时在方法级别没有区别。
可能的解决方案
我知道三种解决方案可能是:
- 更改方法名称
- 编写自定义 KeyGenerator
设置Cache SpEL使用#root.target如:
@Cacheable(value=”COCKTAILS”, key="{#root.targetClass}") @Cacheable(value=”成分”, key="{#root.targetClass}")
问题
但是肯定有更好的方法吗?
您关注的文章存在问题。创建 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;
}