sql >> Database teknologi >  >> NoSQL >> Redis

Multi-Field Querying på Redis ved hjælp af Redis Spring

Se Spring Data Redis - 8.5. Sekundære indekser og:

  • 8.6. Forespørgsel efter eksempel
  • 8.10. Forespørgsler og forespørgselsmetoder

Annotationen @Indexed instruerer Spring Data Redis (SDR) om at oprette en sekundær indekseret som et sæt for at indeksere hashens felt.

Det betyder, at når du indsætter data, vil SDR køre syv kommandoer til 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"

Brug af forespørgsel efter eksempel:

Du vil oprette et lager:

interface OrgWorkRepository extends QueryByExampleExecutor<OrgWork> {
}

Og implementer derefter forespørgslen som i eksempeltjenesten nedenfor:

class OrgWorkService {

  @Autowired OrgWorkRepository orgWorkRepository;

  List<OrgWork> findOrgWorks(OrgWork probe) {
    return orgWorkRepository.findAll(Example.of(probe));
  }
}

Og brug som:

OrgWork orgWorkExample = new OrgWork();                          
orgWorkExample.setCorpDetails("CorpDetailsValueHere"); 
orgWorkExample.setContractType("ContractTypeValueHere");
...
List<OrgWork> results = orgWorkService.findOrgWorks(orgWorkExample);

Bag kulisserne vil SDR sørge for at konvertere dette til Redis-kommandoer for at få dine data ved hjælp af en kombination af SINTER og HGETALL:

SINTER   …:CorpDetails:CorpDetailsValueHere   …:ContractType:ContractTypeValueHere   ...
HGETALL "OrgWork:d70091b5-0b9a-4c0a-9551-519e61bc9ef3" 
HGETALL ...

Dette er en to-trins proces:

  1. Hent nøgler indeholdt i skæringspunktet mellem sekundære indekser ved hjælp af SINTER
  2. Hent hver nøgle returneret af <1> individuelt ved hjælp af HGETALL

En arbejdsbyrde på 100.000 i minuttet burde være overskuelig for Redis, forudsat at du har en kvalitetsserver, en rimelig datasætstørrelse, og forespørgslerne er noget specifikke i gennemsnit.

SINTER har en tidskompleksitet på O(N*M) worst-case, hvor N er kardinalitet af det mindste sæt og M er antallet af sæt. Du har ét sæt for hver dimension på din forespørgsel.

HGETALL er O(N), hvor N er størrelsen af ​​hashen, 7 i dit tilfælde.

Som altid anbefales det, at du foretager nogle benchmarking for at teste, om du får den ønskede ydeevne og justere, hvis det er nødvendigt.




  1. Adgang til meteorproduktionsdatabase i 2016

  2. MongoDB $mul

  3. Mongoexport ved hjælp af $gt- og $lt-begrænsninger på et datointerval

  4. Spekulativ udførelse i Hadoop MapReduce