sql >> Databasteknik >  >> NoSQL >> Redis

Finns det något rekommenderat värde på COUNT för SCAN / HSCAN-kommandot i REDIS?

Standardvärdet är 10 . Det betyder att kommandot kommer tillbaka mer eller mindre 10 nycklar , kan vara mindre om nycklarna är glest befolkade i hashplatserna eller filtreras bort av MATCH mönster. Det kan vara mer om några nycklar delar en hash-slot. Hur som helst är det utförda arbetet proportionellt mot COUNT parameter.

Redis är entrådig. En av anledningarna till SCAN introducerades är att tillåta att gå igenom alla nycklar utan att blockera servern under en lång tid, genom att gå några steg åt gången.

Och det är just kriterierna för att avgöra vad som är ett bra nummer. Hur länge är du villig att blockera din Redis-server genom att köra en SCAN kommando. Ju högre COUNT är , ju längre blocket.

Låt oss använda ett Lua-skript för att få en känsla av COUNT påverkan. Använd den på din miljö för att få resultaten baserat på dina serverresurser.

Lua-manuset:

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

Här använder vi Redis TIME kommando. Kommandot returnerar:

  • Unix-tid i sekunder
  • mikrosekunder

Några körningar i min maskin, med 1 miljon nycklar:

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

Observera att dessa tider inte inkluderar den tid som används för att läsa från sockeln och för att buffra och skicka svaret. De faktiska tiderna blir längre. Tiden det tar en gång är borta från Redis, inklusive tid att resa i nätverket är dock inte tiden att din Redis-server blockeras.

Så här kallade jag Lua-skriptet och resultatet:

> 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. Det gick inte att starta docker mongo-bilden på Windows

  2. Åtkomst till MongoDB från Go

  3. Vad är ett TransientTransactionError i Mongoose (eller MongoDB)?

  4. Använda lagrade JavaScript-funktioner i Aggregation pipeline, MapReduce eller runCommand