Penso che sia molto semplice.
Soluzione 1 (inferiore, non consigliata)
Il tuo modo di ZSCAN MySet 0 MATCH Id:92 count 1
non ha funzionato perché la stringa memorizzata è "{\"Id\":\"92\"...
non "{\"Id:92\"...
. La stringa è stata modificata in un altro formato. Quindi prova a usare MATCH Id\":\"64
o qualcosa del genere per abbinare i dati serializzati json in redis. Non ho familiarità con json.net, quindi la stringa effettiva lascia che te la scopra.
A proposito, devo chiederti se ZSCAN MySet 0 MATCH Id:92 count 1
restituire un cursore? Sospetto che tu abbia usato ZSCAN
in modo sbagliato.
Soluzione 2 (migliore, fortemente consigliata)
ZSCAN
va bene quando il tuo set ordinato non è grande e sai come risparmiare tempo di andata e ritorno della rete tramite la transazione Lua di Redis. Ciò rende ancora l'operazione "cerca per ID" O(n). Pertanto, una soluzione migliore è modificare il modello di dati nel modo seguente:
cambia il set ordinato da
# 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"}
a
# Score Value
0 1443476076 Id:92
1 1443482969 Id:11
Sposta gli altri dati dettagliati in un altro set di chiavi di tipo hash:
# Key field-value field-value ...
0 Id:92 Ref-7ADT DTime-1443476076 ...
1 Id:11 Ref-7ADT DTime-1443476076 ...
Quindi, individua per id eseguendo hgetall id:92
. Per quanto riguarda la query a intervalli per data, devi fare ZRANGEBYSCORE sortedset mindate maxdate
quindi hgetall
ogni ID uno per uno. Faresti meglio a usare lua per racchiudere questi comandi in uno e sarà comunque super veloce!
I dati nel database NoSql devono essere organizzati in modo ridondante come sopra. Ciò potrebbe comportare alcune normali operazioni che coinvolgono più di un comando e andata e ritorno, ma può essere affrontato dalla funzione lua di redis. Consiglio vivamente la funzione lua di redis, perché racchiude i comandi in un roundtrip di rete, che sono tutti eseguiti sul lato redis-server ed è atomico e super veloce!
Rispondi se c'è qualcosa che non sai