sql >> Databáze >  >> NoSQL >> Redis

Existuje nějaká doporučená hodnota COUNT pro příkaz SCAN / HSCAN v REDIS?

Výchozí hodnota je 10 . Znamená to, že příkaz vrátí více či méně 10 kláves , může být menší, pokud jsou klíče v hash slotech řídce osazeny nebo odfiltrovány pomocí MATCH vzor. Mohlo by to být více, pokud některé klíče sdílejí hash slot. V každém případě je vykonaná práce úměrná COUNT parametr.

Redis je jednovláknový. Jeden z důvodů SCAN byl představen, je umožnit procházení všech klíčů bez blokování serveru na dlouhou dobu tím, že půjdete po několika krocích.

A to jsou přesně kritéria pro rozhodnutí, co je dobré číslo. Na jak dlouho jste ochotni blokovat váš server Redis spuštěním SCAN příkaz. Čím vyšší je COUNT , tím delší je blok.

Použijme skript Lua, abychom získali představu o COUNT dopad. Použijte jej ve svém prostředí, abyste získali výsledky založené na zdrojích vašeho serveru.

Skript 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

Zde používáme Redis TIME příkaz. Příkaz vrátí:

  • čas unixu v sekundách
  • mikrosekundy

Několik běhů v mém počítači s 1 milionem klíčů:

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

Všimněte si, že tyto časy nezahrnují čas použitý ke čtení ze soketu a k ukládání do vyrovnávací paměti a odesílání odpovědi. Skutečné časy budou větší. Čas, který jednou zabere, je mimo Redis, včetně času cestování sítí však není dobou, kdy je váš server Redis zablokován.

Takto jsem nazval skript Lua a výsledky:

> 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. vložit novou hodnotu do vnitřního pole mongodb - mongodb/php

  2. Redis je jednovláknový, jak tedy dělá souběžné I/O?

  3. Nastavte výchozí datum při vkládání dokumentu s polem time.Time

  4. Jak implementovat MongoDB vnořený $elemMatch Query v C#