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:
- Abrufen von Schlüsseln, die in der Schnittmenge sekundärer Indizes enthalten sind, mit
SINTER
- 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.