2017-06-12 1 views
0

ich eine Abfrage in Redis zu schreiben versuche, die ersten 2 Feldwerte meines Hash-Schlüssel zu bekommen ..Erste Top-Ergebnisse von Redis Hash

Grundsätzlich, wenn ich HVALS hashname tun, möchte ich die Werte der bekommen erste 2 Felder hinzugefügt (die ältesten 2). Das ist ungefähr so, als ob man die TOP 2-Tupel in einer SQL-Datenbank bekommen würde.

Ist das in redis möglich?

+0

Da es sich um einen Hash handelt, sind die Elemente ohne Reihenfolge, d. H. Es gibt keinen ältesten oder obersten. Vielleicht möchten Sie die Struktur "LIST" oder "SORTED SET" ausprobieren. –

Antwort

3

Nein, das ist nicht möglich. Die Reihenfolge der Felder und Werte in einem Redis-Hash ist in jeder Hinsicht zufällig (trotz der empirischen Beweise, die durch das Experimentieren mit kleineren Hashes erhalten wurden). Informationen zum Bestellen von Elementen finden Sie in Redis 'Sortierte Sets.

Update: um die Frage im Kommentar zu beantworten, IIUC sieht aus wie Sie es einfach mit nur Strings lösen können. Aufgrund der Natur von Redis wartet zu einem beliebigen Zeitpunkt entweder ein Benutzer auf eine bestimmte Übereinstimmung oder null. Sie können SET matchmaking:blue username1:token, wenn der Schlüssel nicht existiert (d. H. Null-Benutzer warten auf die Übereinstimmung) und GET und DEL es, wenn es existiert. Stellen Sie sicher, dass Sie den Unterbefehl "NX" SET, MULTI/EXEC und/oder Lua verwenden, um die Atomarität dieser beiden logischen Operationen zu gewährleisten.

+0

Vielen Dank für die Antwort. Wie würdest du dieses Problem organisieren? Ich erstelle einen Matchmaking-Algorithmus, bei dem ich Personen zuordnen möchte, die in meiner Anwendung eine bestimmte Zeichenfolge eingeben. Zum Beispiel, wenn ich "blau" eingib, würde ich "HSET-Matchmaking: blau username1 pushNotificationToken" machen. Dann würde ein anderer Benutzer, der "blau" eingibt, ebenfalls auf dieselbe Weise in diesen Hash eingegeben. Jede neue Eingabe in einem bestimmten Hash prüft auch, ob die Länge 2 oder mehr beträgt. Wenn dies der Fall ist, sollten die ersten zwei Personen, die "blau" eingegeben haben, diese zusammenführen und sie aus dem Hash entfernen. – Radu

+0

Meine Antwort mit einem Vorschlag aktualisiert. –

+0

Vielen Dank für Ihren Vorschlag. Leider kann nicht davon ausgegangen werden, dass nur 1 oder 0 Personen warten können. Außerdem kann ich die Operationen nicht atomar machen, da dies eine API für eine mobile App ist, bei der Hunderte von Benutzern gleichzeitig dieselbe Eingabe anfordern können. Nehmen wir an, dass 10 Benutzer fast gleichzeitig "blau" eingegeben haben, mit nachlässigen Zeitunterschieden. Ich muss sie immer noch 2 mal 2 paaren. – Radu

0

Aus was ich experimentiert habe, gibt HVALS Werte für Schlüssel in der Reihenfolge zurück, die Sie suchen, d. H. Ältester Schlüssel zuerst. Nun liegt es an Ihnen, nur die ersten zwei Werte unter Verwendung des Client-Programms, z. HSET myhmap name "abhi", HSET myhmap email "[email protected]", HSET myhmap planet "earth", . HVALS myhmap wird zurückgegeben "abhi","[email protected]", "earth", "andromeda"

+1

Trotz der Experimente können Sie sich nicht darauf verlassen. Sobald die Codierung des Hashs aus der ziplist (für kleinere Werte verwendet) geändert wird, gilt dies nicht mehr. –

+0

Als Workaround (das klingt vielleicht übertrieben) - Sie können 'Hash'-Felder in einer Liste speichern (anfangs mit' RPUSH') und zum Abrufen von Werten können Sie 'HMGET' auf bestimmten Schlüsseln aufrufen, die Sie aus der Liste erhalten mit 'LINDEX' 0 und 1 (erste zwei Elemente) – Abhishek