Nilai defaultnya adalah 10
. Artinya perintah akan mengembalikan kurang lebih 10 kunci , bisa lebih sedikit jika kunci jarang diisi di slot hash, atau difilter oleh MATCH
pola. Bisa lebih jika beberapa kunci berbagi slot hash. Bagaimanapun, pekerjaan yang dilakukan sebanding dengan COUNT
parameter.
Redis adalah utas tunggal. Salah satu alasan SCAN
diperkenalkan adalah untuk memungkinkan melewati semua kunci tanpa memblokir server untuk waktu yang lama, dengan melakukan beberapa langkah pada satu waktu.
Dan itulah tepatnya kriteria untuk memutuskan angka yang bagus. Berapa lama Anda bersedia memblokir server Redis Anda dengan menjalankan SCAN
memerintah. Semakin tinggi COUNT
, semakin panjang bloknya.
Mari gunakan skrip Lua untuk memahami COUNT
dampak. Gunakan di lingkungan Anda untuk mendapatkan hasil berdasarkan sumber daya server Anda.
Skrip 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
Di sini kita menggunakan Redis TIME
memerintah. Perintah mengembalikan:
- unix waktu dalam detik
- mikrodetik
Beberapa berjalan di mesin saya, dengan 1 juta kunci:
COUNT TIME IN MICROSECONDS
10 37
100 257
1000 1685
10000 14438
Perhatikan waktu ini tidak termasuk waktu yang digunakan untuk membaca dari soket dan untuk buffer dan mengirim respons. Waktu yang sebenarnya akan lebih besar. Waktu yang diperlukan satu kali adalah di luar Redis, termasuk waktu perjalanan jaringan, bukan waktu server Redis Anda diblokir.
Ini adalah bagaimana saya memanggil skrip Lua dan hasilnya:
> 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"