Redis
 sql >> Baza danych >  >> NoSQL >> Redis

Redis — posortowany zestaw, znajdź przedmiot według wartości właściwości

Myślę, że to bardzo proste.

Rozwiązanie 1 (gorsze, niezalecane)

Twój sposób na ZSCAN MySet 0 MATCH Id:92 count 1 nie zadziałało, ponieważ przechowywany ciąg to "{\"Id\":\"92\"... nie "{\"Id:92\"... . Ciąg został zmieniony na inny format. Spróbuj więc użyć MATCH Id\":\"64 lub coś takiego, aby dopasować dane serializowane json w redis. Nie jestem zaznajomiony z json.net, więc właściwy ciąg pozostawia do odkrycia.

Przy okazji muszę zapytać, czy zrobiłeś ZSCAN MySet 0 MATCH Id:92 count 1 zwrócić kursor? Podejrzewam, że użyłeś ZSCAN w zły sposób.

Rozwiązanie 2 (lepsze, zdecydowanie zalecane)

ZSCAN jest dobre, gdy posortowany zestaw nie jest duży i wiesz, jak zaoszczędzić czas podróży w sieci dzięki transakcji Lua firmy Redis. To nadal powoduje, że operacja wyszukiwania według identyfikatora jest O(n). Dlatego lepszym rozwiązaniem jest zmiana modelu danych w następujący sposób:

zmień posortowany zestaw z

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

do

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

Przenieś pozostałe szczegółowe dane do innego zestawu kluczy typu hash:

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

Następnie lokalizujesz według id, wykonując hgetall id:92 . Jeśli chodzi o zapytanie z zakresem według daty, musisz wykonać ZRANGEBYSCORE sortedset mindate maxdate następnie hgetall każdy identyfikator jeden po drugim. Lepiej użyj lua, aby połączyć te polecenia w jedno i nadal będzie to superszybkie!

Dane w bazie NoSql muszą być zorganizowane w sposób redundantny, jak powyżej. Może to spowodować, że niektóre zwykłe operacje będą wymagały więcej niż jednego polecenia i podróży w obie strony, ale można to rozwiązać za pomocą funkcji lua w redis. Zdecydowanie polecam funkcję lua w redis, ponieważ łączy ona polecenia w jedną sieć w obie strony, z których wszystkie są wykonywane po stronie serwera redis i są atomowe i superszybkie!

Odpowiedz, jeśli jest coś, czego nie wiesz




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Usługa .NET Core wstrzykiwać singleton w innej usłudze singleton

  2. Współbieżność Redis INCR

  3. Redis Vs RabbitMQ jako broker danych/system przesyłania wiadomości pomiędzy Logstash a elasticsearch

  4. Jak *prawidłowo* odpytać Redis z Tornado?

  5. Jak wstrzymać lub wznowić zadanie z selerem?