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

Multiparameter-Matchfinder mit Redis

Was Sie hier versuchen, ist ein invertierter Index.

Lassen Sie jede Spalte einem "Set" zuordnen. Dann können Sie die Mengen schneiden, um das Ergebnis zu erhalten.

Also APPLE: RED ROUND FRUIT würde den folgenden Einfügungen zugeordnet werden:

SADD p1:RED APPLE
SADD p2:ROUND APPLE
SADD p3:FRUIT APPLE

Nehmen wir dann an, ich möchte * ROUND FRUIT abfragen , würde ich tun:

SINTER p2:ROUND p3:FRUIT

Dieser Befehl nimmt den Schnittpunkt der Elemente in p2:ROUND set und p3:FRUIT einstellen. Dadurch werden alle Elemente zurückgegeben, die ROUND sind und FRUIT , egal was p1 ist.

Einige andere Beispiele:

SMEMBERS p1:GREEN
SINTER p1:RED p2:ROUND p3:FRUIT
SUNION p1:RED p1:GREEN

Meine obige Antwort wird etwas Rechenleistung verbrauchen, da die Schnittoperation O(N*M) ist . Hier ist eine Methode, die speicherintensiver ist, aber schneller abgerufen werden kann, da die Indizes effektiv vorberechnet werden.

Erstellen Sie für jede Kombination von Eigenschaften einen Schlüssel, der einen Satz speichert:

Also APPLE: RED ROUND FRUIT würde den folgenden Einfügungen zugeordnet werden:

SADD RED:ROUND:FRUIT APPLE
SADD :ROUND:FRUIT APPLE
SADD RED::FRUIT APPLE
SADD RED:ROUND: APPLE
SADD RED:: APPLE
SADD :ROUND: APPLE
SADD ::FRUIT APPLE
SADD ::: APPLE

Dann greifen Sie zur Abfrage einfach auf den jeweiligen Schlüssel zu. Beispiel:* ROUND FRUIT wäre einfach

SMEMBERS :ROUND:FRUIT

Offensichtlich skaliert dies überhaupt nicht gut in Bezug auf den Speicher, wenn Sie viele Dimensionen haben, aber es wird extrem schnell sein, Ergebnisse abzurufen.