Мисля, че е много просто.
Решение 1 (По-ниско, не се препоръчва)
Вашият начин за ZSCAN MySet 0 MATCH Id:92 count 1
не се получи, защото съхраненият низ е "{\"Id\":\"92\"...
не "{\"Id:92\"...
. Низът е променен в друг формат. Затова опитайте да използвате MATCH Id\":\"64
или нещо подобно, за да съответства на сериализираните json данни в redis. Не съм запознат с json.net, така че действителният низ остава за вас да откриете.
Между другото, трябва да те попитам дали ZSCAN MySet 0 MATCH Id:92 count 1
върне курсор? Подозирам, че сте използвали ZSCAN
по грешен начин.
Решение 2 (По-добро, силно препоръчително)
ZSCAN
е добре, когато вашият сортиран набор не е голям и знаете как да спестите време за двупосочно пътуване на мрежата чрез Lua транзакция на Redis. Това все още прави операция "търсене по ID" O(n). Следователно, по-доброто решение е да промените модела си на данни по следния начин:
промяна на сортирания набор от
# 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"}
до
# Score Value
0 1443476076 Id:92
1 1443482969 Id:11
Преместете останалите подробни данни в друг набор от ключове тип хешове:
# Key field-value field-value ...
0 Id:92 Ref-7ADT DTime-1443476076 ...
1 Id:11 Ref-7ADT DTime-1443476076 ...
След това намирате по идентификатор, като направите hgetall id:92
. Що се отнася до заявката с диапазон по дата, трябва да направите ZRANGEBYSCORE sortedset mindate maxdate
след това hgetall
всеки идентификатор един по един. По-добре използвайте lua, за да обвиете тези команди в една и пак ще бъде супер бързо!
Данните в базата данни NoSql трябва да бъдат организирани по излишен начин, както по-горе. Това може да накара някои обичайни операции да включват повече от една команди и двупосочно пътуване, но може да се справи с функцията lua на redis. Силно препоръчвам lua функцията на redis, тъй като тя обвива командите в една мрежа за двупосочно пътуване, които всички се изпълняват от страната на redis-сървъра и са атомарни и супер бързи!
Отговорете, ако има нещо, което не знаете