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

Redis:rozłożyć kanały informacyjne na liście lub posortowanym zestawie?

Tak, posortowane zestawy są bardzo szybkie i wydajne. Wydają się znacznie lepiej pasować do Twoich wymagań niż SORT operacje. Złożoność czasowa jest często źle rozumiana. O(log(N)) jest bardzo szybki i dobrze się skaluje. Używamy go dla dziesiątek milionów członków w jednym posortowanym zestawie. Pobieranie i wstawianie trwa poniżej milisekundy.

Użyj ZRANGEBYSCORE key min max WITHSCORES [LIMIT offset count] aby uzyskać swoje wyniki.

W zależności od tego, jak przechowujesz znaczniki czasu jako „wyniki”, ZREVRANGEBYSCORE może być lepszy.

Mała uwaga na temat znaczników czasu:Posortowany zestaw SCORES które nie wymagają części dziesiętnej, powinny zawierać 15 cyfr lub mniej. Tak więc SCORE musi pozostać w zakresie od -999999999999999 do 999999999999999. Uwaga:Te limity istnieją, ponieważ serwer Redis faktycznie przechowuje wynik (zmiennoprzecinkowy) jako reprezentację redis-string wewnętrznie.

Dlatego polecam ten format, przekonwertowany na czas Zulu:-20140313122802 dla drugiej precyzji. Możesz dodać 1 cyfrę dla precyzji 100 ms, ale nie więcej, jeśli nie chcesz tracić precyzji. Nawiasem mówiąc, wciąż jest to float64, więc utrata precyzji może być w niektórych sytuacjach w porządku, ale twój przypadek mieści się w zakresie „doskonałej precyzji”, więc to właśnie polecam.

Jeśli Twoje dane wygasną w ciągu 10 lat, możesz również pominąć trzy pierwsze cyfry (CCY lub CCYY), aby osiągnąć dokładność 0,0001 sekundy.

Sugeruję tutaj negatywne wyniki, więc możesz użyć prostszego ZRANGEBYSCORE zamiast REV jeden. Możesz użyć -inf jako wynik startowy (minus nieskończoność) i LIMIT 0 100 aby uzyskać 100 najlepszych wyników.

Dwa posortowane zestawy members (lub 'keys' ale to niejednoznaczne, ponieważ posortowany zestaw jest również kluczem samym w sobie) może udostępnić score , to żaden problem, wyniki w identycznym score są alfabetyczne.

Mam nadzieję, że to pomoże, TW

Edytuj po czacie

OP chciał zbierać dane (za pomocą ZSET ) z różnych kluczy (GET /SET lub HGET /HSET Klucze). JOIN może zrobić to za Ciebie, ZRANGEBYSCORE nie mogę. Preferowanym sposobem na zrobienie tego jest prosty skrypt Lua. Skrypt Lua jest wykonywany na serwerze. W poniższym przykładzie używam EVAL dla uproszczenia, w środowisku produkcyjnym użyjesz SCRIPT EXISTS , SCRIPT LOAD i EVALSHA . Większość bibliotek klienckich ma wbudowaną logikę księgową, więc nie należy przesyłać skryptu za każdym razem.

Oto example.lua :

local r={}
local zkey=KEYS[1]
local a=redis.call('zrangebyscore', zkey, KEYS[2], KEYS[3], 'withscores', 'limit', 0, KEYS[4])
for i=1,#a,2 do
  r[i]=a[i+1]
  r[i+1]=redis.call('get', a[i])
end
return r

Używasz go w ten sposób (surowy przykład, niekodowany pod kątem wydajności) :

redis-cli -p 14322 set activity:1 act1JSON
redis-cli -p 14322 set activity:2 act2JSON
redis-cli -p 14322 zadd feed 1 activity:1
redis-cli -p 14322 zadd feed 2 activity:2 

redis-cli -p 14322 eval '$(cat example.lua)' 4 feed '-inf' '+inf' 100

Wynik:

1) "1"
2) "act1JSON"
3) "2"
4) "act2JSON"



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. sesja wiosenna redis „Nie zdefiniowano fasoli o nazwie „springSessionRepositoryFilter””

  2. Express Node.JS — Odbieranie wywołania zwrotnego Redis, wykonywanie obietnic

  3. Jak czytać wiele zestawów przechowywanych na Redis za pomocą jakiegoś polecenia lub skryptu LUA?

  4. Redis — wykorzystanie wartości Incr w transakcji

  5. nodejs, redis. sprawdź, czy klucze istnieją i utwórz nowe, jeśli nie