Výchozí hodnota je 10
. Znamená to, že příkaz vrátí více či méně 10 kláves , může být menší, pokud jsou klíče v hash slotech řídce osazeny nebo odfiltrovány pomocí MATCH
vzor. Mohlo by to být více, pokud některé klíče sdílejí hash slot. V každém případě je vykonaná práce úměrná COUNT
parametr.
Redis je jednovláknový. Jeden z důvodů SCAN
byl představen, je umožnit procházení všech klíčů bez blokování serveru na dlouhou dobu tím, že půjdete po několika krocích.
A to jsou přesně kritéria pro rozhodnutí, co je dobré číslo. Na jak dlouho jste ochotni blokovat váš server Redis spuštěním SCAN
příkaz. Čím vyšší je COUNT
, tím delší je blok.
Použijme skript Lua, abychom získali představu o COUNT
dopad. Použijte jej ve svém prostředí, abyste získali výsledky založené na zdrojích vašeho serveru.
Skript Lua:
local t0 = redis.call('TIME')
local res = redis.call('SCAN', ARGV[1], 'COUNT', ARGV[2])
local t1 = redis.call('TIME')
local micros = (t1[1]-t0[1])*1000000 + t1[2]-t0[2]
table.insert(res,'Time taken: '..micros..' microseconds')
table.insert(res,'T0: '..t0[1]..string.format('%06d', t0[2]))
table.insert(res,'T1: '..t1[1]..string.format('%06d', t1[2]))
return res
Zde používáme Redis TIME
příkaz. Příkaz vrátí:
- čas unixu v sekundách
- mikrosekundy
Několik běhů v mém počítači s 1 milionem klíčů:
COUNT TIME IN MICROSECONDS
10 37
100 257
1000 1685
10000 14438
Všimněte si, že tyto časy nezahrnují čas použitý ke čtení ze soketu a k ukládání do vyrovnávací paměti a odesílání odpovědi. Skutečné časy budou větší. Čas, který jednou zabere, je mimo Redis, včetně času cestování sítí však není dobou, kdy je váš server Redis zablokován.
Takto jsem nazval skript Lua a výsledky:
> EVAL "local t0 = redis.call('TIME') \n local res = redis.call('SCAN', ARGV[1], 'COUNT', ARGV[2]) \n local t1 = redis.call('TIME') \n local micros = (t1[1]-t0[1])*1000000 + t1[2]-t0[2] \n table.insert(res,'Time taken: '..micros..' microseconds') \n table.insert(res,'T0: '..t0[1]..string.format('%06d', t0[2])) \n table.insert(res,'T1: '..t1[1]..string.format('%06d', t1[2])) \n return res" 0 0 5
1) "851968"
2) 1) "key:560785"
2) "key:114611"
3) "key:970983"
4) "key:626494"
5) "key:23865"
3) "Time taken: 36 microseconds"
4) "T0: 1580816056349600"
5) "T1: 1580816056349636"