Consulte Spring Data Redis - 8.5. Índices secundários e:
- 8.6. Consulta por exemplo
- 8.10. Consultas e métodos de consulta
A anotação
@Indexed
instrui o Spring Data Redis (SDR) a criar um secundário indexado como um conjunto para indexar o campo do hash. Isso significa que quando você insere dados, o SDR executará sete comandos para o 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"
Usando consulta por exemplo:
Você deseja criar um repositório:
interface OrgWorkRepository extends QueryByExampleExecutor<OrgWork> {
}
E então implemente a consulta como no serviço de exemplo abaixo:
class OrgWorkService {
@Autowired OrgWorkRepository orgWorkRepository;
List<OrgWork> findOrgWorks(OrgWork probe) {
return orgWorkRepository.findAll(Example.of(probe));
}
}
E use como:
OrgWork orgWorkExample = new OrgWork();
orgWorkExample.setCorpDetails("CorpDetailsValueHere");
orgWorkExample.setContractType("ContractTypeValueHere");
...
List<OrgWork> results = orgWorkService.findOrgWorks(orgWorkExample);
Nos bastidores, o SDR cuidará de converter isso em comandos Redis para obter seus dados, usando uma combinação de SINTER e HGETALL:
SINTER …:CorpDetails:CorpDetailsValueHere …:ContractType:ContractTypeValueHere ...
HGETALL "OrgWork:d70091b5-0b9a-4c0a-9551-519e61bc9ef3"
HGETALL ...
Este é um processo de duas etapas:
- Busque as chaves contidas na interseção de índices secundários, usando
SINTER
- Busque cada chave retornada por <1> individualmente, usando
HGETALL
Uma carga de trabalho de 100.000 por minuto deve ser gerenciável para o Redis, supondo que você tenha um servidor de qualidade, um tamanho de conjunto de dados razoável e as consultas sejam um pouco específicas em média.
SINTER
tem uma complexidade de tempo de O(N*M) no pior caso, onde N é a cardinalidade do menor conjunto e M é o número de conjuntos. Você tem um conjunto para cada dimensão em sua consulta. HGETALL
é O(N) onde N é o tamanho do hash, 7 no seu caso. Como sempre, é recomendável que você faça um benchmarking para testar se está obtendo o desempenho desejado e ajuste se necessário.