Standardværdien er 10
. Det betyder, at kommandoen vil bringe mere eller mindre 10 nøgler tilbage , kunne være mindre, hvis nøglerne er tyndt befolket i hash-pladserne eller filtreret ud af MATCH
mønster. Det kunne være mere, hvis nogle nøgler deler en hash-slot. Under alle omstændigheder er det udførte arbejde proportionalt med COUNT
parameter.
Redis er enkelt-trådet. En af grundene til SCAN
blev introduceret er at tillade at gå gennem alle nøglerne uden at blokere serveren i lang tid, ved at gå et par trin ad gangen.
Og det er netop kriterierne for at afgøre, hvad der er et godt tal. Hvor længe er du villig til at blokere din Redis-server ved at køre en SCAN
kommando. Jo højere COUNT
er , jo længere blok.
Lad os bruge et Lua-script til at få en fornemmelse af COUNT
indvirkning. Brug det på dit miljø for at få resultater baseret på dine serverressourcer.
Lua-scriptet:
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
Her bruger vi Redis TIME
kommando. Kommandoen returnerer:
- unix-tid i sekunder
- mikrosekunder
Et par kørsler i min maskine med 1 million nøgler:
COUNT TIME IN MICROSECONDS
10 37
100 257
1000 1685
10000 14438
Bemærk, at disse tider ikke inkluderer den tid, der bruges til at læse fra soklen og til at buffere og sende svaret. Faktiske tider vil være større. Den tid, det tager én gang, er ude af Redis, inklusive tidsrejser på netværket, er det dog ikke tid, din Redis-server blokeres.
Sådan kaldte jeg Lua-scriptet og resultaterne:
> 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"