Spring @Cacheable注释用于不同服务中的相同方法

时间:2017-12-27 14:15:22

标签: java spring-boot spring-cache

我已根据以下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();
}

问题

即使缓存名称不同,方法总是从缓存返回列表,因为在生成密钥时方法级别没有区别。

可能的解决方案

我知道有三种解决方案可以:

  1. 更改方法名称
  2. 编写自定义KeyGenerator
  3. 设置Cache SpEL以使用#root.target,例如:

    @Cacheable(value =“COCKTAILS”,key =&#34; {#root.targetClass}&#34;) @Cacheable(value =“INGREDIENTS”,key =&#34; {#root.targetClass}&#34;)

  4. 问题

    但是,必须有更好的方法吗?

1 个答案:

答案 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;
}