Redis
 sql >> база данни >  >> NoSQL >> Redis

Redis - Сортиран набор, намиране на елемент по стойност на свойството

Мисля, че е много просто.

Решение 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-сървъра и са атомарни и супер бързи!

Отговорете, ако има нещо, което не знаете




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Сравнение на memcache, redis и ehcache като разпределена рамка за кеширане

  2. Как работи при отказ на ServiceStack PooledRedisClientManager?

  3. По-бързият метод за преместване на Redis данни в MySQL

  4. Използване на StackExchange.Redis в ASP.NET Core контролер

  5. Laravel 5.1 Session и Socket.IO + Redis - Изпращане на известия до влезли (известни) потребители и група потребители