Стойността по подразбиране е 10
. Това означава, че командата ще върне повече или по-малко 10 клавиша , може да бъде по-малко, ако ключовете са рядко попълнени в хеш слотовете или филтрирани от MATCH
модел. Може да е повече, ако някои ключове споделят хеш слот. Както и да е, извършената работа е пропорционална на COUNT
параметър.
Redis е еднонишков. Една от причините SCAN
беше въведено е да позволи преминаване през всички ключове без блокиране на сървъра за дълго време, като се извършват няколко стъпки наведнъж.
И точно това е критериите, за да се реши кое е добро число. За колко време сте готови да блокирате вашия Redis сървър, като стартирате SCAN
команда. Колкото по-висок е COUNT
, толкова по-дълъг е блокът.
Нека използваме Lua скрипт, за да добием представа за COUNT
въздействие. Използвайте го във вашата среда, за да получите резултатите въз основа на ресурсите на вашия сървър.
Скриптът на 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
Тук използваме Redis TIME
команда. Командата връща:
- unix време в секунди
- микросекунди
Няколко стартирания в моята машина, с 1 милион клавиша:
COUNT TIME IN MICROSECONDS
10 37
100 257
1000 1685
10000 14438
Обърнете внимание, че тези времена не включват времето, използвано за четене от сокета и за буфериране и изпращане на отговора. Реалните времена ще бъдат по-големи. Времето, което отнема веднъж, е извън Redis, включително времето за пътуване в мрежата, обаче не е време, когато вашият Redis сървър е блокиран.
Ето как нарекох Lua скрипта и резултатите:
> 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"