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:
- Hent nøgler indeholdt i skæringspunktet mellem sekundære indekser ved hjælp af
SINTER
- 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.