Redis
 sql >> база данни >  >> NoSQL >> Redis

Има ли препоръчителна стойност на COUNT за команда SCAN / HSCAN в REDIS?

Стойността по подразбиране е 10 . Това означава, че командата ще върне повече или по-малко 10 клавиша , може да бъде по-малко, ако ключовете са рядко попълнени в хеш слотовете или филтрирани от MATCH модел. Може да е повече, ако някои ключове споделят хеш слот. Както и да е, извършената работа е пропорционална на COUNT параметър.

Redis е еднонишков. Една от причините SCAN беше въведено е да позволи преминаване през всички ключове без блокиране на сървъра за дълго време, като се извършват няколко стъпки наведнъж.

И точно това е критериите, за да се реши кое е добро число. За колко време сте готови да блокирате вашия Redis сървър, като стартирате SCAN команда. Колкото по-висок е 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 време в секунди
  • микросекунди

Няколко стартирания в моята машина, с 1 милион клавиша:

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

Обърнете внимание, че тези времена не включват времето, използвано за четене от сокета и за буфериране и изпращане на отговора. Реалните времена ще бъдат по-големи. Времето, което отнема веднъж, е извън Redis, включително времето за пътуване в мрежата, обаче не е време, когато вашият 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"



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. RDBTools е придобит от RedisLabs!

  2. Redis/Jedis - Изтриване по шаблон?

  3. Състояние на сесията с Azure Redis Cache не работи на множество екземпляри

  4. Как да търсите стойност на съдържанието в redis от BookSleeve

  5. Как да се свържете с клъстер ElastiCache с помощта на node.js