De standaardwaarde is 10
. Het betekent dat het commando min of meer 10 sleutels terugbrengt , kan minder zijn als de sleutels dun bevolkt zijn in de hash-slots, of worden uitgefilterd door de MATCH
patroon. Het kan meer zijn als sommige sleutels een hash-slot delen. Hoe dan ook, het uitgevoerde werk is evenredig met de COUNT
parameter.
Redis is single-threaded. Een van de redenen SCAN
werd geïntroduceerd, is om alle sleutels te doorlopen zonder de server voor een lange tijd te blokkeren, door een paar stappen tegelijk te doen.
En dat zijn precies de criteria om te beslissen wat een goed aantal is. Hoe lang ben je bereid te blokkeren uw Redis-server door een SCAN
. uit te voeren opdracht. Hoe hoger de COUNT
, hoe langer het blok.
Laten we een Lua-script gebruiken om een idee te krijgen van de COUNT
gevolg. Gebruik het in uw omgeving om de resultaten te krijgen op basis van uw serverbronnen.
Het Lua-script:
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
Hier gebruiken we Redis TIME
opdracht. Het commando geeft terug:
- unix-tijd in seconden
- microseconden
Een paar runs in mijn machine, met 1 miljoen sleutels:
COUNT TIME IN MICROSECONDS
10 37
100 257
1000 1685
10000 14438
Merk op dat deze tijden niet de tijd omvatten die wordt gebruikt om uit de socket te lezen en om het antwoord te bufferen en te verzenden. De werkelijke tijden zullen groter zijn. De tijd die het eenmaal kost, is buiten Redis, inclusief tijdreizen door het netwerk, is echter niet de tijd dat je Redis-server wordt geblokkeerd.
Dit is hoe ik het Lua-script en de resultaten noemde:
> 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"