Spring 引导 Redis 多缓存问题

Spring Boot Redis Mutiple Cache Issue

我有一个简单的 spring boot with redis 应用程序,我正在构建它来缓存 3 个实体电子邮件、产品和国家/地区的主数据。 我使用了 spring 启动启动器依赖项

        <dependency>
              <groupId>org.springframework.boot</groupId>
              <artifactId>spring-boot-starter-data-redis</artifactId>
              <version>2.1.3.RELEASE</version>
           </dependency>

我也在 application.properties 文件中使用启动配置

  spring.cache.type=redis
  spring.redis.host=127.0.0.1
  spring.redis.port=6379
  spring.cache.redis.key-prefix=masterDataApp
  spring.cache.redis.use-key-prefix=true

可缓存的方法是

@Service
public class MasterDataService {
  @Cacheable(value="EMAILS")
    public List<Email> getEmails() {
        System.out.println(" Loading Data from getEmails");
        return  emails;
    }

    @Cacheable(value="PRODUCTS")
    public List<Product> getProducts() {
        System.out.println(" Loading Data from getProducts");
        return  products;
    }

    @Cacheable(value="COUNTRIES")
    public List<Country> getCountries() {
        System.out.println(" Loading Data from getCountries");
        return  countries;
    }
}

问题是一旦我从这个 class 加载了一个方法,其他 2 个方法 return 与第一个方法的数据相同,即使它们 return 不同的列表和具有不同的 Values Cacheable 注释。我做错了什么?

解决方案是使用密钥生成器。并将其添加到方法的注释中。

这有助于隔离缓存


    @Cacheable(value="PRODUCTS", keyGenerator = "customKeyGenerator")
    public List<Product> getProducts() {
        System.out.println(" Loading Data from getProducts");
        return  products;
    }

    @Cacheable(value="COUNTRIES", keyGenerator = "customKeyGenerator")
    public List<Country> getCountries() {
        System.out.println(" Loading Data from getCountries");
        return  countries;
    }

    @Bean("customKeyGenerator")
    public KeyGenerator keyGenerator() {
        return new CustomKeyGenerator();
    }

public class CustomKeyGenerator implements KeyGenerator {

    @Override
    public Object generate(Object target, Method method, Object... params) {
        String key = target.getClass().getSimpleName() + "_"
                + method.getName() + "_"
                + StringUtils.arrayToDelimitedString(params, "_");
        System.out.println(key);
        return key;
    }
}


但问题仍然是注释中 value 的值是多少,因为它对隔离缓存没有任何作用