sql >> Databáze >  >> NoSQL >> Redis

Redis:rozprostřít zpravodajské kanály v seznamu nebo seřazené sadě?

Ano, tříděné sady jsou velmi rychlé a výkonné. Zdá se, že mnohem lépe odpovídají vašim požadavkům než SORT operace. Časová složitost je často nepochopena. O(log(N)) je velmi rychlý a měří se v pohodě. Používáme to pro desítky milionů členů v jedné tříděné sadě. Načítání a vkládání je pod milisekundou.

Použijte ZRANGEBYSCORE key min max WITHSCORES [LIMIT offset count] abyste získali své výsledky.

V závislosti na tom, jak ukládáte časová razítka jako „skóre“, může být ZREVRANGEBYSCORE lepší.

Malá poznámka k časovým razítkům:Seřazená sada SCORES které nepotřebují desetinnou část, by měly používat 15 číslic nebo méně. Takže SCORE musí zůstat v rozsahu -999999999999999 až 999999999999999. Poznámka:Tyto limity existují, protože server Redis ve skutečnosti interně ukládá skóre (float) jako reprezentaci redis-řetězce.

Proto doporučuji tento formát převedený na Zulu Time:-20140313122802 pro druhou přesnost. Můžete přidat 1 číslici pro přesnost 100 ms, ale ne více pokud nechcete žádnou ztrátu přesnosti. Mimochodem, stále je to float64, takže ztráta přesnosti může být v některých scénářích v pořádku, ale váš případ se hodí do rozsahu „dokonalé přesnosti“, takže to doporučuji.

Pokud platnost vašich dat vyprší do 10 let, můžete také přeskočit první tři číslice (CCY z CCYY), abyste dosáhli přesnosti 0,0001 sekundy.

Zde navrhuji záporné skóre, takže můžete použít jednodušší ZRANGEBYSCORE místo REV jeden. Můžete použít -inf jako počáteční skóre (minus nekonečno) a LIMIT 0 100 získat 100 nejlepších výsledků.

Dva seřazení members (nebo 'keys' ale to je nejednoznačné, protože setříděná sada je také sama o sobě klíčem) může sdílet score , to není problém, výsledky v rámci identického score jsou abecední.

Doufám, že to pomůže, TW

Upravit po chatu

OP chtěl shromáždit data (pomocí ZSET ) z různých klíčů (GET /SET nebo HGET /HSET klíče). JOIN může to udělat za vás, ZRANGEBYSCORE can't. Preferovaným způsobem, jak toho dosáhnout, je jednoduchý skript Lua. Skript Lua se spustí na serveru. V níže uvedeném příkladu používám EVAL pro jednoduchost byste ve výrobě použili SCRIPT EXISTS , SCRIPT LOAD a EVALSHA . Většina klientských knihoven má nějakou vestavěnou účetní logiku, takže skript nenahráváte pokaždé.

Zde je 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

Použijete jej takto (neupravený příklad, nekódovaný pro výkon) :

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

Výsledek:

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



  1. MongoDB $pop

  2. jak lze uložit Json v redis pomocí hashmap (HSET)

  3. Připojovací řetězec v MongoDB (s příklady)

  4. Mongodb $ kde dotaz vždy platí s nodejs