Redis
 sql >> Database >  >> NoSQL >> Redis

Redis - Insieme ordinato, trova l'elemento in base al valore della proprietà

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