Jeg tror, det er meget enkelt.
Løsning 1(Inferiør, anbefales ikke)
Din måde ZSCAN MySet 0 MATCH Id:92 count 1
fungerede ikke, fordi den lagrede streng er "{\"Id\":\"92\"...
ikke "{\"Id:92\"...
. Strengen er blevet ændret til et andet format. Så prøv at bruge MATCH Id\":\"64
eller noget lignende for at matche de json-serialiserede data i redis. Jeg er ikke bekendt med json.net, så den faktiske streng efterlader dig til at opdage.
Forresten, jeg er nødt til at spørge, at du gjorde ZSCAN MySet 0 MATCH Id:92 count 1
returnere en markør? Jeg formoder, at du brugte ZSCAN
på en forkert måde.
Løsning 2(Bedre, anbefales kraftigt)
ZSCAN
er godt, når dit sorterede sæt ikke er stort, og du ved, hvordan du sparer netværket rundturstid ved Redis' Lua-transaktion. Dette gør stadig "slå op efter ID" operation O(n). Derfor er en bedre løsning at ændre din datamodel på følgende måde:
ændre sorteret sæt fra
# 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"}
til
# Score Value
0 1443476076 Id:92
1 1443482969 Id:11
Flyt resten af de detaljerede data i et andet sæt hashe-taster:
# Key field-value field-value ...
0 Id:92 Ref-7ADT DTime-1443476076 ...
1 Id:11 Ref-7ADT DTime-1443476076 ...
Derefter finder du efter id ved at gøre hgetall id:92
. Med hensyn til intervalforespørgsel efter dato skal du gøre ZRANGEBYSCORE sortedset mindate maxdate
derefter hgetall
hver id en efter en. Du må hellere bruge lua til at pakke disse kommandoer ind i én, og det vil stadig være superhurtigt!
Data i NoSql-databasen skal organiseres på en redundant måde som ovenfor. Dette kan få nogle sædvanlige handlinger til at involvere mere end én kommando og rundtur, men det kan tackles af redis's lua-funktion. Jeg anbefaler stærkt lua-funktionen i redis, fordi den samler kommandoer ind i én netværksrundtur, som alle udføres på redis-serversiden og er atomiske og superhurtige!
Svar, hvis der er noget, du ikke ved