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

Redis - Sortierter Satz, Artikel nach Eigenschaftswert finden

Ich denke, es ist sehr einfach.

Lösung 1 (minderwertig, nicht empfohlen)

Ihr Weg zu ZSCAN MySet 0 MATCH Id:92 count 1 hat nicht geklappt, da der gespeicherte String "{\"Id\":\"92\"... ist nicht "{\"Id:92\"... . Die Zeichenfolge wurde in ein anderes Format geändert. Versuchen Sie also, MATCH Id\":\"64 zu verwenden oder so ähnlich, um die json-serialisierten Daten in redis abzugleichen. Ich bin mit json.net nicht vertraut, also müssen Sie den eigentlichen String entdecken.

Übrigens muss ich dich fragen, ob du ZSCAN MySet 0 MATCH Id:92 count 1 gemacht hast einen Cursor zurückgeben? Ich vermute, Sie haben ZSCAN verwendet falsch.

Lösung 2 (Besser, dringend empfohlen)

ZSCAN ist gut, wenn Ihr sortierter Satz nicht groß ist und Sie wissen, wie Sie Netzwerk-Roundtrip-Zeit durch die Lua-Transaktion von Redis sparen können. Dies macht immer noch die "Suche nach ID"-Operation O(n). Daher ist es eine bessere Lösung, Ihr Datenmodell wie folgt zu ändern:

sortierten Satz ändernvon

#   Score   Value
0   1443476076 {"Id":"92","Ref":"7ADT","DTime":1443476076,"ATime":1443901554,"ExTime":0,"SPName":"7ADT33CFSAU6","StPName":"7ADT33CFSAU6"}
1   1443482969 {"Id":"11","Ref":"DAJT","DTime":1443482969,"ATime":1443901326,"ExTime":0,"SPName":"DAJTJTT4T02O","StPName":"DAJTJTT4T02O"}

zu

#   Score   Value
0   1443476076 Id:92
1   1443482969 Id:11

Verschieben Sie die restlichen detaillierten Daten in einen anderen Satz von Hash-Typ-Schlüsseln:

#   Key   field-value field-value ...
0   Id:92 Ref-7ADT DTime-1443476076 ...
1   Id:11 Ref-7ADT DTime-1443476076 ...

Dann suchen Sie anhand der ID, indem Sie hgetall id:92 ausführen . Was die Bereichsabfrage nach Datum betrifft, müssen Sie ZRANGEBYSCORE sortedset mindate maxdate ausführen dann hgetall jede ID einzeln. Verwenden Sie besser lua, um diese Befehle in einen zu packen, und es wird immer noch superschnell sein!

Daten in der NoSql-Datenbank müssen wie oben redundant organisiert werden. Dies kann dazu führen, dass einige übliche Vorgänge mehr als einen Befehl und einen Roundtrip umfassen, aber dies kann mit der Lua-Funktion von redis angegangen werden. Ich empfehle dringend die Lua-Funktion von Redis, da sie Befehle in einen Netzwerk-Roundtrip verpackt, die alle auf der Seite des Redis-Servers ausgeführt werden und atomar und superschnell sind!

Antworten Sie, wenn Sie etwas nicht wissen