sql >> Database teknologi >  >> NoSQL >> Redis

Er der nogen anbefalet værdi af COUNT for SCAN / HSCAN kommando i REDIS?

Standardværdien er 10 . Det betyder, at kommandoen vil bringe mere eller mindre 10 nøgler tilbage , kunne være mindre, hvis nøglerne er tyndt befolket i hash-pladserne eller filtreret ud af MATCH mønster. Det kunne være mere, hvis nogle nøgler deler en hash-slot. Under alle omstændigheder er det udførte arbejde proportionalt med COUNT parameter.

Redis er enkelt-trådet. En af grundene til SCAN blev introduceret er at tillade at gå gennem alle nøglerne uden at blokere serveren i lang tid, ved at gå et par trin ad gangen.

Og det er netop kriterierne for at afgøre, hvad der er et godt tal. Hvor længe er du villig til at blokere din Redis-server ved at køre en SCAN kommando. Jo højere COUNT er , jo længere blok.

Lad os bruge et Lua-script til at få en fornemmelse af COUNT indvirkning. Brug det på dit miljø for at få resultater baseret på dine serverressourcer.

Lua-scriptet:

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

Her bruger vi Redis TIME kommando. Kommandoen returnerer:

  • unix-tid i sekunder
  • mikrosekunder

Et par kørsler i min maskine med 1 million nøgler:

COUNT    TIME IN MICROSECONDS
   10            37
  100           257
 1000          1685
10000         14438

Bemærk, at disse tider ikke inkluderer den tid, der bruges til at læse fra soklen og til at buffere og sende svaret. Faktiske tider vil være større. Den tid, det tager én gang, er ude af Redis, inklusive tidsrejser på netværket, er det dog ikke tid, din Redis-server blokeres.

Sådan kaldte jeg Lua-scriptet og resultaterne:

> 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"



  1. Hvordan får man ReferenceField-data i mongoengine?

  2. Fjern dubletter, når du bruger $unionWith i MongoDB

  3. Hvad er HBase-znoder?

  4. Hvordan kan jeg bruge LIKE-operatoren på mongoose?