sql >> Databasteknik >  >> NoSQL >> Redis

Flerfältsfrågor på Redis med Redis Spring

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:

  1. Hämta nycklar som finns i skärningspunkten mellan sekundära index, med SINTER
  2. 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.




  1. Hur installerar man php-redis-tillägget med den officiella PHP Docker-avbildningsmetoden?

  2. Kör Heroku bakgrundsuppgifter med endast 1 webbdyno och 0 arbetardyno

  3. Hur man får återuppringning när nyckeln går ut i REDIS

  4. python-rq worker stängs automatiskt