sql >> Database >  >> NoSQL >> Redis

Is er een aanbevolen waarde van COUNT voor de opdracht SCAN / HSCAN in REDIS?

De standaardwaarde is 10 . Het betekent dat het commando min of meer 10 sleutels terugbrengt , kan minder zijn als de sleutels dun bevolkt zijn in de hash-slots, of worden uitgefilterd door de MATCH patroon. Het kan meer zijn als sommige sleutels een hash-slot delen. Hoe dan ook, het uitgevoerde werk is evenredig met de COUNT parameter.

Redis is single-threaded. Een van de redenen SCAN werd geïntroduceerd, is om alle sleutels te doorlopen zonder de server voor een lange tijd te blokkeren, door een paar stappen tegelijk te doen.

En dat zijn precies de criteria om te beslissen wat een goed aantal is. Hoe lang ben je bereid te blokkeren uw Redis-server door een SCAN . uit te voeren opdracht. Hoe hoger de COUNT , hoe langer het blok.

Laten we een Lua-script gebruiken om een ​​idee te krijgen van de COUNT gevolg. Gebruik het in uw omgeving om de resultaten te krijgen op basis van uw serverbronnen.

Het Lua-script:

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

Hier gebruiken we Redis TIME opdracht. Het commando geeft terug:

  • unix-tijd in seconden
  • microseconden

Een paar runs in mijn machine, met 1 miljoen sleutels:

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

Merk op dat deze tijden niet de tijd omvatten die wordt gebruikt om uit de socket te lezen en om het antwoord te bufferen en te verzenden. De werkelijke tijden zullen groter zijn. De tijd die het eenmaal kost, is buiten Redis, inclusief tijdreizen door het netwerk, is echter niet de tijd dat je Redis-server wordt geblokkeerd.

Dit is hoe ik het Lua-script en de resultaten noemde:

> 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. Verkrijg array-subset in mongodb met behulp van een arraybron

  2. nginx lua redis cookie niet ingesteld

  3. Waarom is er slechts één verbinding met redis gemaakt in dit gevent-programma?

  4. Mongodb som de grootte van matrixvelden op