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();
}

问题

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

可能的解决方案

我知道三种解决方案可能是:

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

    @Cacheable(value=”COCKTAILS”, key="{#root.targetClass}") @Cacheable(value=”成分”, key="{#root.targetClass}")

问题

但是肯定有更好的方法吗?

您关注的文章存在问题。创建 CacheManager bean 时,您需要调用 cacheManager.setUsePrefix(true);,然后才需要调用缓存名称 COCKTAILSINGREDIENTS 将用作 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;
}