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 的值是多少,因为它对隔离缓存没有任何作用
我有一个简单的 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 的值是多少,因为它对隔离缓存没有任何作用