Zie Spring Data Redis - 8.5. Secundaire indexen en:
- 8.6. Zoekopdracht per voorbeeld
- 8.10. Query's en querymethoden
De annotatie @Indexed
geeft Spring Data Redis (SDR) de opdracht om een secundaire index te maken die is geïndexeerd als een set om het veld van de hash te indexeren.
Dit betekent dat wanneer u gegevens invoegt, SDR zeven opdrachten naar Redis zal uitvoeren:
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"
Een voorbeeldopdracht gebruiken:
U wilt een opslagplaats maken:
interface OrgWorkRepository extends QueryByExampleExecutor<OrgWork> {
}
En implementeer vervolgens de query zoals in de voorbeeldservice hieronder:
class OrgWorkService {
@Autowired OrgWorkRepository orgWorkRepository;
List<OrgWork> findOrgWorks(OrgWork probe) {
return orgWorkRepository.findAll(Example.of(probe));
}
}
En gebruik als:
OrgWork orgWorkExample = new OrgWork();
orgWorkExample.setCorpDetails("CorpDetailsValueHere");
orgWorkExample.setContractType("ContractTypeValueHere");
...
List<OrgWork> results = orgWorkService.findOrgWorks(orgWorkExample);
Achter de schermen zorgt SDR ervoor dat dit wordt omgezet in Redis-commando's om uw gegevens op te halen, met behulp van een combinatie van SINTER en HGETALL:
SINTER …:CorpDetails:CorpDetailsValueHere …:ContractType:ContractTypeValueHere ...
HGETALL "OrgWork:d70091b5-0b9a-4c0a-9551-519e61bc9ef3"
HGETALL ...
Dit is een proces in twee stappen:
- Haal sleutels op die zijn opgenomen in het snijpunt van secundaire indexen, met behulp van
SINTER
- Haal elke sleutel afzonderlijk op die door <1> wordt geretourneerd, met behulp van
HGETALL
Een werklast van 100.000 per minuut zou voor Redis beheersbaar moeten zijn, ervan uitgaande dat je een kwaliteitsserver hebt, een redelijke datasetgrootte en dat de zoekopdrachten gemiddeld enigszins specifiek zijn.
SINTER
heeft een tijdcomplexiteit van O(N*M) in het slechtste geval waarbij N de kardinaliteit is van de kleinste verzameling en M het aantal verzamelingen. U heeft één set voor elke dimensie van uw zoekopdracht.
HGETALL
is O(N) waarbij N de grootte van de hash is, 7 in jouw geval.
Zoals altijd is het aan te raden wat benchmarking te doen om te testen of u de gewenste prestaties krijgt en deze indien nodig aan te passen.