См. Spring Data Redis - 8.5. Вторичные индексы и:
- 8.6. Запрос по примеру
- 8.10. Запросы и методы запросов
Аннотация @Indexed
инструктирует Spring Data Redis (SDR) создать вторичный индекс, индексированный как set , для индексации поля ha sh.
Это означает, что при вставке данных SDR будет запускать для Redis семь команд:
HMSET "OrgWork:19315449-cda2-4f5c-b696-9cb8018fa1f9" "_class" "OrgWork"
"id" "19315449-cda2-4f5c-b696-9cb8018fa1f9"
"CorpDetails" "CorpDetailsValueHere" "ContractType" "ContractTypeValueHere"
... "Country" "Costa Rica"
SADD "OrgWork" "19315449-cda2-4f5c-b696-9cb8018fa1f9"
SADD "OrgWork:CorpDetails:CorpDetailsValueHere" "19315449-cda2-4f5c-b696-9cb8018fa1f9"
SADD "OrgWork:ContractType:ContractTypeValueHere" "19315449-cda2-4f5c-b696-9cb8018fa1f9"
...
SADD "OrgWork:Country:Costa Rica" "19315449-cda2-4f5c-b696-9cb8018fa1f9"
Использование запроса по примеру:
Вы хотите создайте хранилище :
interface OrgWorkRepository extends QueryByExampleExecutor<OrgWork> {
}
и затем выполните запрос, как показано в примере службы ниже:
class OrgWorkService {
@Autowired OrgWorkRepository orgWorkRepository;
List<OrgWork> findOrgWorks(OrgWork probe) {
return orgWorkRepository.findAll(Example.of(probe));
}
}
И используйте как:
OrgWork orgWorkExample = new OrgWork();
orgWorkExample.setCorpDetails("CorpDetailsValueHere");
orgWorkExample.setContractType("ContractTypeValueHere");
...
List<OrgWork> results = orgWorkService.findOrgWorks(orgWorkExample);
За кулисами SDR позаботится о преобразовании этого в команды Redis для получения ваших данных, используя комбинацию SINTER и HGETALL :
SINTER …:CorpDetails:CorpDetailsValueHere …:ContractType:ContractTypeValueHere ...
HGETALL "OrgWork:d70091b5-0b9a-4c0a-9551-519e61bc9ef3"
HGETALL ...
Это двухэтапный процесс:
- Извлечение ключей, содержащихся на пересечении вторичных индексов, с использованием
SINTER
- Извлечение каждого ключа, возвращенного <1> в отдельности, с использованием
HGETALL
Рабочая нагрузка 100 000 в минуту должна быть управляемой для Redis при условии, что у вас есть качественный сервис ver, разумный размер набора данных и запросы в среднем несколько определены c.
SINTER
имеет временную сложность O (N * M), наихудший случай, где N - количество элементов наименьшего набор и М это количество наборов. У вас есть один набор для каждого измерения в вашем запросе.
HGETALL
- это O (N), где N - размер га sh, 7 в вашем случае.
Как всегда Рекомендуется провести сравнительный анализ, чтобы проверить, получаете ли вы желаемую производительность, и отрегулировать при необходимости.