Vedere Spring Data Redis - 8.5. Indici secondari e:
- 8.6. Interroga per esempio
- 8.10. Query e metodi di query
L'annotazione @Indexed
indica a Spring Data Redis (SDR) di creare un secondario indicizzato come set per indicizzare il campo dell'hash.
Ciò significa che quando inserisci i dati, SDR eseguirà sette comandi su 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"
Utilizzo di Query per esempio:
Vuoi creare un repository:
interface OrgWorkRepository extends QueryByExampleExecutor<OrgWork> {
}
E quindi implementa la query come nel servizio di esempio seguente:
class OrgWorkService {
@Autowired OrgWorkRepository orgWorkRepository;
List<OrgWork> findOrgWorks(OrgWork probe) {
return orgWorkRepository.findAll(Example.of(probe));
}
}
E usa come:
OrgWork orgWorkExample = new OrgWork();
orgWorkExample.setCorpDetails("CorpDetailsValueHere");
orgWorkExample.setContractType("ContractTypeValueHere");
...
List<OrgWork> results = orgWorkService.findOrgWorks(orgWorkExample);
Dietro le quinte, SDR si occuperà di convertirlo in comandi Redis per ottenere i tuoi dati, utilizzando una combinazione di SINTER e HGETALL:
SINTER …:CorpDetails:CorpDetailsValueHere …:ContractType:ContractTypeValueHere ...
HGETALL "OrgWork:d70091b5-0b9a-4c0a-9551-519e61bc9ef3"
HGETALL ...
Questo è un processo in due fasi:
- Recupera le chiavi contenute nell'intersezione degli indici secondari, utilizzando
SINTER
- Recupera ciascuna chiave restituita da <1> individualmente, utilizzando
HGETALL
Un carico di lavoro di 100.000 al minuto dovrebbe essere gestibile per Redis supponendo che tu abbia un server di qualità, una dimensione ragionevole del set di dati e che le query siano in media alquanto specifiche.
SINTER
ha una complessità temporale di O(N*M) nel caso peggiore dove N è la cardinalità dell'insieme più piccolo e M è il numero di insiemi. Hai un set per ogni dimensione della tua query.
HGETALL
è O(N) dove N è la dimensione dell'hash, 7 nel tuo caso.
Come sempre, ti consigliamo di fare un po' di benchmarking per verificare se stai ottenendo le prestazioni desiderate e, se necessario, aggiustarlo.