Domyślna wartość to 10
. Oznacza to, że polecenie przywróci mniej więcej 10 klawiszy , może być mniejsza, jeśli klucze są rzadko zapełnione w polach skrótu lub odfiltrowane przez MATCH
wzór. Mogłoby być więcej, gdyby niektóre klucze współdzieliły slot skrótu. W każdym razie wykonana praca jest proporcjonalna do COUNT
parametr.
Redis jest jednowątkowy. Jeden z powodów SCAN
został wprowadzony ma umożliwić przejście przez wszystkie klucze bez blokowania serwera przez długi czas, wykonując kilka kroków na raz.
I to jest właśnie kryteria, które decydują o tym, jaka jest dobra liczba. Na jak długo chcesz blokować serwer Redis, uruchamiając SCAN
Komenda. Im wyższa wartość COUNT
, tym dłuższy blok.
Użyjmy skryptu Lua, aby zrozumieć COUNT
uderzenie. Użyj go w swoim środowisku, aby uzyskać wyniki oparte na zasobach serwera.
Skrypt 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
Tutaj używamy Redisa TIME
Komenda. Polecenie zwraca:
- czas uniksowy w sekundach
- mikrosekundy
Kilka przebiegów w moim komputerze z 1 milionem kluczy:
COUNT TIME IN MICROSECONDS
10 37
100 257
1000 1685
10000 14438
Zauważ, że te czasy nie obejmują czasu używanego do odczytu z gniazda oraz do buforowania i wysyłania odpowiedzi. Rzeczywiste czasy będą większe. Czas, jaki zajmuje raz, jest poza Redis, w tym czas podróży w sieci, nie jest jednak czasem, w którym serwer Redis jest zablokowany.
Tak nazwałem skrypt Lua i wyniki:
> 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"