sql >> Database >  >> NoSQL >> Redis

Multi-Field Query's op Redis met Redis Spring

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:

  1. Haal sleutels op die zijn opgenomen in het snijpunt van secundaire indexen, met behulp van SINTER
  2. 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.




  1. Wat zijn de onderliggende verschillen tussen select, epoll, kqueue en evport?

  2. Airflow CROSSSLOT Sleutels in verzoek hashen niet naar dezelfde slotfout met AWS ElastiCache

  3. Een eenvoudige tagging-implementatie met MongoDB

  4. Groeperen en tellen met voorwaarde