Se Spring Data Redis - 8.5. Sekundära index och:
- 8.6. Fråga efter exempel
- 8.10. Frågor och frågemetoder
Anteckningen @Indexed
instruerar Spring Data Redis (SDR) att skapa en sekundär indexerad som en uppsättning för att indexera hashens fält.
Detta innebär att när du infogar data kommer SDR att köra sju kommandon till 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"
Använda fråga efter exempel:
Du vill skapa ett arkiv:
interface OrgWorkRepository extends QueryByExampleExecutor<OrgWork> {
}
Och implementera sedan frågan som i exempeltjänsten nedan:
class OrgWorkService {
@Autowired OrgWorkRepository orgWorkRepository;
List<OrgWork> findOrgWorks(OrgWork probe) {
return orgWorkRepository.findAll(Example.of(probe));
}
}
Och använd som:
OrgWork orgWorkExample = new OrgWork();
orgWorkExample.setCorpDetails("CorpDetailsValueHere");
orgWorkExample.setContractType("ContractTypeValueHere");
...
List<OrgWork> results = orgWorkService.findOrgWorks(orgWorkExample);
Bakom kulisserna kommer SDR att ta hand om att konvertera detta till Redis-kommandon för att få din data, med en kombination av SINTER och HGETALL:
SINTER …:CorpDetails:CorpDetailsValueHere …:ContractType:ContractTypeValueHere ...
HGETALL "OrgWork:d70091b5-0b9a-4c0a-9551-519e61bc9ef3"
HGETALL ...
Detta är en process i två steg:
- Hämta nycklar som finns i skärningspunkten mellan sekundära index, med
SINTER
- Hämta varje nyckel som returneras av <1> individuellt med
HGETALL
En arbetsbelastning på 100 000 per minut bör vara hanterbar för Redis förutsatt att du har en kvalitetsserver, en rimlig datauppsättningsstorlek och att frågorna i genomsnitt är något specifika.
SINTER
har en tidskomplexitet av O(N*M) i värsta fall där N är kardinaliteten för den minsta mängden och M är antalet set. Du har en uppsättning för varje dimension i din fråga.
HGETALL
är O(N) där N är storleken på hashen, 7 i ditt fall.
Som alltid rekommenderas det att du gör några benchmarking för att testa om du får önskad prestanda och justera om det behövs.