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

Query multicampo su Redis utilizzando Redis Spring

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:

  1. Recupera le chiavi contenute nell'intersezione degli indici secondari, utilizzando SINTER
  2. 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.