Standardvärdet är 10
. Det betyder att kommandot kommer tillbaka mer eller mindre 10 nycklar , kan vara mindre om nycklarna är glest befolkade i hashplatserna eller filtreras bort av MATCH
mönster. Det kan vara mer om några nycklar delar en hash-slot. Hur som helst är det utförda arbetet proportionellt mot COUNT
parameter.
Redis är entrådig. En av anledningarna till SCAN
introducerades är att tillåta att gå igenom alla nycklar utan att blockera servern under en lång tid, genom att gå några steg åt gången.
Och det är just kriterierna för att avgöra vad som är ett bra nummer. Hur länge är du villig att blockera din Redis-server genom att köra en SCAN
kommando. Ju högre COUNT
är , ju längre blocket.
Låt oss använda ett Lua-skript för att få en känsla av COUNT
påverkan. Använd den på din miljö för att få resultaten baserat på dina serverresurser.
Lua-manuset:
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
Här använder vi Redis TIME
kommando. Kommandot returnerar:
- Unix-tid i sekunder
- mikrosekunder
Några körningar i min maskin, med 1 miljon nycklar:
COUNT TIME IN MICROSECONDS
10 37
100 257
1000 1685
10000 14438
Observera att dessa tider inte inkluderar den tid som används för att läsa från sockeln och för att buffra och skicka svaret. De faktiska tiderna blir längre. Tiden det tar en gång är borta från Redis, inklusive tid att resa i nätverket är dock inte tiden att din Redis-server blockeras.
Så här kallade jag Lua-skriptet och resultatet:
> 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"