Redis
 sql >> Baza danych >  >> NoSQL >> Redis

Czy jest jakaś zalecana wartość COUNT dla polecenia SCAN / HSCAN w REDIS?

Domyślna wartość to 10 . Oznacza to, że polecenie przywróci mniej więcej 10 klawiszy , może być mniejsza, jeśli klucze są rzadko zapełnione w polach skrótu lub odfiltrowane przez MATCH wzór. Mogłoby być więcej, gdyby niektóre klucze współdzieliły slot skrótu. W każdym razie wykonana praca jest proporcjonalna do COUNT parametr.

Redis jest jednowątkowy. Jeden z powodów SCAN został wprowadzony ma umożliwić przejście przez wszystkie klucze bez blokowania serwera przez długi czas, wykonując kilka kroków na raz.

I to jest właśnie kryteria, które decydują o tym, jaka jest dobra liczba. Na jak długo chcesz blokować serwer Redis, uruchamiając SCAN Komenda. Im wyższa wartość COUNT , tym dłuższy blok.

Użyjmy skryptu Lua, aby zrozumieć COUNT uderzenie. Użyj go w swoim środowisku, aby uzyskać wyniki oparte na zasobach serwera.

Skrypt 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

Tutaj używamy Redisa TIME Komenda. Polecenie zwraca:

  • czas uniksowy w sekundach
  • mikrosekundy

Kilka przebiegów w moim komputerze z 1 milionem kluczy:

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

Zauważ, że te czasy nie obejmują czasu używanego do odczytu z gniazda oraz do buforowania i wysyłania odpowiedzi. Rzeczywiste czasy będą większe. Czas, jaki zajmuje raz, jest poza Redis, w tym czas podróży w sieci, nie jest jednak czasem, w którym serwer Redis jest zablokowany.

Tak nazwałem skrypt Lua i wyniki:

> 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. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Jak uruchomić Redis w 32-bitowym systemie Windows?

  2. Rozwiązywanie problemów

  3. Automatyczne ponowne próby

  4. Redis, jak zwiększyć wszystkie wyniki zset za pomocą ZINCRBY?

  5. Podejścia do przechowywania danych geoprzestrzennych w Redis