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

Java 不同服务中相同方法的Spring@Cacheable注释,java,spring-boot,spring-cache,Java,Spring Boot,Spring Cache,我在Spring boot应用程序中实现了标准redis缓存模板,如下所示: 我拥有两个不同的服务,它们可以获取对象列表: @RequestMapping("/admin/test/list") public String testCache() { List<Cocktail> cocktails = cocktailsService.list(); List<Ingredient> ingredients = ingredientsService.l

我在Spring boot应用程序中实现了标准redis缓存模板,如下所示:

我拥有两个不同的服务,它们可以获取对象列表:

@RequestMapping("/admin/test/list")
public String testCache() {

    List<Cocktail> cocktails = cocktailsService.list();
    List<Ingredient> ingredients = ingredientsService.list();

    return "index";
}
问题

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

可能的解决方案

我知道有三种解决方案:

  • 更改方法名称
  • 编写自定义密钥生成器
  • 将缓存SpEL设置为使用#root.target,例如:

    @可缓存(value=“COCKTAILS”,key=“{root.targetClass}”) @可缓存(value=“components”,key=“{#root.targetClass}”)

  • 问题


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

    你所关注的文章中有一个问题。创建CacheManagerbean时,需要调用
    CacheManager.setUsePrefix(true),只有缓存名称鸡尾酒和配料才会用作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;
    }
    

    在您的服务中,缓存的数据将属于
    @Cacheable
    注释指定的不同缓存区域,即它们将属于
    鸡尾酒
    配料
    区域,因此,即使它们的密钥相同,它们也将缓存在不同的缓存区域。由于其他原因,您似乎没有得到预期的结果。尝试启用Spring缓存的日志记录以查看发生了什么:org.springframework.Cache with TRACE level。显然,在处理其他缓存解决方案时,Spring的CacheManager通常包含一个缓存映射(每个实现类似映射的功能)实现,这些实现由单独的缓存支持。使用默认的RedisCacheManager配置,情况并非如此。根据RedisCacheManager上的javadoc注释,不清楚这是一个bug还是不完整的文档。“…默认情况下,通过附加前缀(充当命名空间)来保存键。”
    @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;
    }