Redis
 sql >> Base de Dados >  >> NoSQL >> Redis

Consulta de vários campos no Redis usando o Redis Spring


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:
  1. Busque as chaves contidas na interseção de índices secundários, usando SINTER
  2. 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.