sql >> Database >  >> NoSQL >> Redis

Redis - Gesorteerde set, zoek item op eigenschapswaarde

Ik denk dat het heel eenvoudig is.

Oplossing 1 (inferieur, niet aanbevolen)

Jouw manier van ZSCAN MySet 0 MATCH Id:92 count 1 werkte niet omdat de opgeslagen string "{\"Id\":\"92\"... is niet "{\"Id:92\"... . De string is gewijzigd in een ander formaat. Dus probeer MATCH Id\":\"64 . te gebruiken of iets dergelijks om overeen te komen met de json geserialiseerde gegevens in redis. Ik ben niet bekend met json.net, dus de eigenlijke string moet je zelf ontdekken.

Trouwens, ik moet je vragen dat je ZSCAN MySet 0 MATCH Id:92 count 1 hebt gedaan een cursor teruggeven? Ik vermoed dat je ZSCAN hebt gebruikt op een verkeerde manier.

Oplossing 2 (Beter, sterk aanbevolen)

ZSCAN is goed als je gesorteerde set niet groot is en je weet hoe je netwerk-roundtrip-tijd kunt besparen door de Lua-transactie van Redis. Dit maakt nog steeds "opzoeken op ID" operatie O(n). Daarom is een betere oplossing om uw gegevensmodel op de volgende manier te wijzigen:

verander gesorteerde setvan

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

naar

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

Verplaats de overige gedetailleerde gegevens naar een andere set hashes-typesleutels:

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

Vervolgens zoekt u op id door hgetall id:92 . te doen . Wat betreft zoekopdrachten op datum, moet u ZRANGEBYSCORE sortedset mindate maxdate doen dan hgetall elke id één voor één. Je kunt beter lua gebruiken om deze commando's in één te verpakken en het zal nog steeds supersnel zijn!

Gegevens in de NoSql-database moeten op een redundante manier worden georganiseerd, zoals hierboven. Dit kan ertoe leiden dat een normale bewerking meer dan één commando en een retourvlucht omvat, maar het kan worden aangepakt met de lua-functie van redis. Ik raad de lua-functie van redis ten zeerste aan, omdat het commando's in één netwerkrondreis verpakt, die allemaal worden uitgevoerd aan de redis-serverzijde en atomair en supersnel is!

Reageer als je iets niet weet




  1. Hoe Elasticsearch gebruiken met MongoDB?

  2. php mongodb zoeken en sorteren in volledige tekst

  3. Spring data mongo gebruik OR in Query

  4. Hoe Redis Hashes te gebruiken