Redis
 sql >> Teknologi Basis Data >  >> NoSQL >> Redis

Apakah ada nilai COUNT yang direkomendasikan untuk perintah SCAN / HSCAN di REDIS?

Nilai defaultnya adalah 10 . Artinya perintah akan mengembalikan kurang lebih 10 kunci , bisa lebih sedikit jika kunci jarang diisi di slot hash, atau difilter oleh MATCH pola. Bisa lebih jika beberapa kunci berbagi slot hash. Bagaimanapun, pekerjaan yang dilakukan sebanding dengan COUNT parameter.

Redis adalah utas tunggal. Salah satu alasan SCAN diperkenalkan adalah untuk memungkinkan melewati semua kunci tanpa memblokir server untuk waktu yang lama, dengan melakukan beberapa langkah pada satu waktu.

Dan itulah tepatnya kriteria untuk memutuskan angka yang bagus. Berapa lama Anda bersedia memblokir server Redis Anda dengan menjalankan SCAN memerintah. Semakin tinggi COUNT , semakin panjang bloknya.

Mari gunakan skrip Lua untuk memahami COUNT dampak. Gunakan di lingkungan Anda untuk mendapatkan hasil berdasarkan sumber daya server Anda.

Skrip 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

Di sini kita menggunakan Redis TIME memerintah. Perintah mengembalikan:

  • unix waktu dalam detik
  • mikrodetik

Beberapa berjalan di mesin saya, dengan 1 juta kunci:

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

Perhatikan waktu ini tidak termasuk waktu yang digunakan untuk membaca dari soket dan untuk buffer dan mengirim respons. Waktu yang sebenarnya akan lebih besar. Waktu yang diperlukan satu kali adalah di luar Redis, termasuk waktu perjalanan jaringan, bukan waktu server Redis Anda diblokir.

Ini adalah bagaimana saya memanggil skrip Lua dan hasilnya:

> 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. Bagaimana socket.io mengirim pesan ke beberapa server?

  2. Bagaimana cara membuat serial peta di Jawa untuk disimpan di Redis?

  3. Redis sebagai cache tingkat kedua Hibernate

  4. Dukungan Redis pada indeks Sekunder

  5. Cara menganalisis dan mengoptimalkan penggunaan memori di Redis