Я создал приложение REST, используя Spring Boot 2.2, Spring Data REST, Hibernate, Spring Redis.
Я настроил сервер 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.
Есть ли у вас какие-либо подсказки, чтобы показать мне правильный путь?