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