Redis
 sql >> Baza danych >  >> NoSQL >> Redis

Zapytania wielopolowe na Redis przy użyciu Redis Spring

Zobacz Spring Data Redis - 8.5. Indeksy dodatkowe i:

  • 8.6. Zapytanie według przykładu
  • 8.10. Zapytania i metody zapytań

Adnotacja @Indexed instruuje Spring Data Redis (SDR), aby utworzyć dodatkowy indeksowany jako zestaw do indeksowania pola skrótu.

Oznacza to, że po wstawieniu danych SDR uruchomi siedem poleceń w 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"

Korzystanie z zapytania według przykładu:

Chcesz utworzyć repozytorium:

interface OrgWorkRepository extends QueryByExampleExecutor<OrgWork> {
}

A następnie zaimplementuj zapytanie jak w przykładowej usłudze poniżej:

class OrgWorkService {

  @Autowired OrgWorkRepository orgWorkRepository;

  List<OrgWork> findOrgWorks(OrgWork probe) {
    return orgWorkRepository.findAll(Example.of(probe));
  }
}

I użyj jako:

OrgWork orgWorkExample = new OrgWork();                          
orgWorkExample.setCorpDetails("CorpDetailsValueHere"); 
orgWorkExample.setContractType("ContractTypeValueHere");
...
List<OrgWork> results = orgWorkService.findOrgWorks(orgWorkExample);

Za kulisami SDR zajmie się przekonwertowaniem tego na polecenia Redis, aby uzyskać dane, używając kombinacji SINTER i HGETALL:

SINTER   …:CorpDetails:CorpDetailsValueHere   …:ContractType:ContractTypeValueHere   ...
HGETALL "OrgWork:d70091b5-0b9a-4c0a-9551-519e61bc9ef3" 
HGETALL ...

Jest to proces dwuetapowy:

  1. Pobierz klucze zawarte w przecięciu indeksów wtórnych za pomocą SINTER
  2. Pobierz każdy klucz zwrócony przez <1> indywidualnie, używając HGETALL

Obciążenie 100 000 na minutę powinno być możliwe do zarządzania dla Redis, zakładając, że masz serwer wysokiej jakości, rozsądny rozmiar zestawu danych, a zapytania są średnio dość specyficzne.

SINTER ma złożoność czasową najgorszego przypadku O(N*M), gdzie N jest licznością najmniejszego zbioru, a M jest liczbą zbiorów. Masz jeden zestaw dla każdego wymiaru w zapytaniu.

HGETALL to O(N), gdzie N jest rozmiarem skrótu, w twoim przypadku 7.

Jak zawsze, zaleca się wykonanie testów porównawczych, aby sprawdzić, czy uzyskujesz pożądaną wydajność i w razie potrzeby dostosować.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Główne różnice/cechy wśród najbardziej znanych systemów NoSQL

  2. Jak zbiorczo usunąć setki tysięcy kluczy ze znakami specjalnymi w Redis?

  3. Jak mogę uruchomić redis na jednym serwerze na różnych portach?

  4. Jak powinienem używać Booksleeve z protobuf-net?

  5. Redis jest jednowątkowy, więc jak wykonuje współbieżne operacje we/wy?