デフォルト値は10
です 。これは、コマンドが多かれ少なかれ10個のキーを戻すことを意味します 、キーがハッシュスロットにまばらに配置されているか、MATCH
によって除外されている場合は、少なくなる可能性があります。 パターン。一部のキーがハッシュスロットを共有している場合は、さらに多くなる可能性があります。とにかく、実行される作業はCOUNT
に比例します パラメータ。
Redisはシングルスレッドです。 SCAN
の理由の1つ 導入されたのは、一度にいくつかの手順を実行することで、サーバーを長時間ブロックすることなく、すべてのキーを通過できるようにすることです。
そして、それはまさに、何が適切な数であるかを決定するための基準です。どのくらいの期間ブロックしますか SCAN
を実行してRedisサーバーを実行します 指図。 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時間(秒)
- マイクロ秒
100万個のキーを使用して、私のマシンでいくつか実行します:
COUNT TIME IN MICROSECONDS
10 37
100 257
1000 1685
10000 14438
これらの時間には、ソケットからの読み取り、および応答のバッファリングと送信に使用される時間は含まれないことに注意してください。実際の時間は大きくなります。ネットワークを移動する時間は、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"