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