【发布时间】:2020-03-27 15:48:10
【问题描述】:
我使用 Spring Boot 2.2、Spring Data REST、Hibernate、Spring Redis 创建了一个 REST 应用程序。
我配置了一个 Redis 服务器,我想在其中缓存我所做的一些查询。我已经做了我能做的所有优化,但这是一个分布式应用程序,我需要通过集中缓存来提高性能。 一切正常,但是当我使用 Spring 存储库的方法时,我看不到如何创建方便的密钥
@Cacheable(cacheNames = "contacts")
@Override
Page findAll(Specification specification, Pageable pageable);
这是我的 Redis 配置:
@Configuration
@EnableCaching
public class RedisCacheConfig extends CachingConfigurerSupport implements CachingConfigurer {
@Override
public CacheErrorHandler errorHandler() {
return new RedisCacheErrorHandler();
}
@Override
@Bean("customKeyGenerator")
public KeyGenerator keyGenerator() {
return new CustomKeyGenerator();
}
}
和我的密钥生成器:
public class CustomKeyGenerator implements KeyGenerator {
public CustomKeyGenerator() {
}
@Override
public Object generate(Object target, Method method, Object... params) {
List<Object> listParams = new ArrayList<>(Arrays.asList(params));
listParams.add(TenantContext.getCurrentTenantId());//Add tenantId as parameter
if (StoreContext.getCurrentStoreId() != null)
listParams.add(StoreContext.getCurrentStoreId());//Add storeId as parameter
return generateKey(listParams.toArray());
}
public static Object generateKey(Object... params) {
if (params.length == 0) {
return SimpleKey.EMPTY;
} else {
if (params.length == 1) {
Object param = params[0];
if (param != null && !param.getClass().isArray()) {
return param;
}
}
return new SimpleKey(params);
}
}
}
当我调用Page findAll(Specification specification, Pageable pageable); 时,在我的CustomKeyGenerator 中,我得到了参数,但我收到了SpecificationComposition(它是一个Spring 辅助类)来代替Specification。每次我调用该方法时,它的哈希码都不一样,即使“它的内容相同”。
就像每次都以相同方式散列的 Pageable(PageRequest 类)一样,我想对 Specification 做同样的事情,以便获得 Spring 缓存机制的优势。
你有什么提示可以告诉我正确的方法吗?
【问题讨论】:
-
谢谢@MevlütÖzdemir,这很清楚。我正在寻找一个具体的解决方案:实际上 SpecificationComposition 在 spring 包之外是不可见的。不确定是否有简单的解决方案。
标签: java spring spring-boot spring-data-rest spring-cache