sql >> Databasteknik >  >> NoSQL >> Redis

Redis - Sorterad uppsättning, hitta objekt efter egenskapsvärde

Jag tror att det är väldigt enkelt.

Lösning 1(Sämre, rekommenderas inte)

Ditt sätt att ZSCAN MySet 0 MATCH Id:92 count 1 fungerade inte eftersom den lagrade strängen är "{\"Id\":\"92\"... inte "{\"Id:92\"... . Strängen har ändrats till ett annat format. Så försök att använda MATCH Id\":\"64 eller något liknande för att matcha json serialiserade data i redis. Jag är inte bekant med json.net, så den faktiska strängen lämnar för dig att upptäcka.

Förresten, jag måste fråga att du gjorde ZSCAN MySet 0 MATCH Id:92 count 1 returnera en markör? Jag misstänker att du använde ZSCAN på ett felaktigt sätt.

Lösning 2(Bättre, rekommenderas starkt)

ZSCAN är bra när din sorterade uppsättning inte är stor och du vet hur du sparar nätverkstid genom Redis Lua-transaktion. Detta gör fortfarande "slå upp med ID" operation O(n). Därför är en bättre lösning att ändra din datamodell på följande sätt:

ändra sorterad uppsättning från

#   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"}

till

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

Flytta resten av detaljerad data i en annan uppsättning hashtypnycklar:

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

Sedan letar du efter id genom att göra hgetall id:92 . När det gäller intervallfråga efter datum måste du göra ZRANGEBYSCORE sortedset mindate maxdate sedan hgetall varje id en efter en. Du bör använda lua för att slå in dessa kommandon i ett och det kommer fortfarande att vara supersnabbt!

Data i NoSql-databasen måste organiseras på ett redundant sätt som ovan. Detta kan göra att en vanlig operation involverar mer än ett kommando och tur och retur, men det kan hanteras av redis lua-funktion. Jag rekommenderar starkt lua-funktionen i redis, eftersom den lindar in kommandon i en nätverksresa, som alla exekveras på redis-serversidan och är atomär och supersnabb!

Svara om det är något du inte vet




  1. Ta bort blanksteg (ledande och efterföljande) från strängvärde

  2. Azure Redis cache - timeouts på GET-samtal

  3. Hur kan jag bläddra/visa värdena lagrade i Redis

  4. Lagra Enums som strängar i MongoDB