Redis
 sql >> Datenbank >  >> NoSQL >> Redis

Mehrfeldabfrage auf Redis mit Redis Spring

Siehe Spring Data Redis – 8.5. Sekundärindizes und:

  • 8.6. Abfrage nach Beispiel
  • 8.10. Abfragen und Abfragemethoden

Die Anmerkung @Indexed weist Spring Data Redis (SDR) an, einen sekundären Index als Satz zu erstellen, um das Feld des Hashs zu indizieren.

Das bedeutet, wenn Sie Daten einfügen, führt SDR sieben Befehle an Redis aus:

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"

Suche nach Beispiel verwenden:

Sie möchten ein Repository erstellen:

interface OrgWorkRepository extends QueryByExampleExecutor<OrgWork> {
}

Implementieren Sie dann die Abfrage wie im Beispieldienst unten:

class OrgWorkService {

  @Autowired OrgWorkRepository orgWorkRepository;

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

Und verwenden als:

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

Hinter den Kulissen kümmert sich SDR darum, dies mithilfe einer Kombination aus SINTER und HGETALL in Redis-Befehle umzuwandeln, um Ihre Daten abzurufen:

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

Dies ist ein zweistufiger Prozess:

  1. Abrufen von Schlüsseln, die in der Schnittmenge sekundärer Indizes enthalten sind, mit SINTER
  2. Holen Sie jeden von <1> zurückgegebenen Schlüssel einzeln mit HGETALL

Eine Arbeitslast von 100.000 pro Minute sollte für Redis zu bewältigen sein, vorausgesetzt, Sie haben einen Qualitätsserver, eine angemessene Datensatzgröße und die Abfragen sind im Durchschnitt etwas spezifisch.

SINTER hat eine Zeitkomplexität von O(N*M) im ungünstigsten Fall, wobei N die Kardinalität der kleinsten Menge und M die Anzahl der Mengen ist. Sie haben einen Satz für jede Dimension in Ihrer Abfrage.

HGETALL ist O(N), wobei N die Größe des Hashs ist, in Ihrem Fall 7.

Wie immer wird empfohlen, dass Sie ein Benchmarking durchführen, um zu testen, ob Sie die gewünschte Leistung erzielen, und bei Bedarf Anpassungen vornehmen.