Redis
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> Redis

Có bất kỳ giá trị đề xuất nào của COUNT cho lệnh SCAN / HSCAN trong REDIS không?

Giá trị mặc định là 10 . Điều đó có nghĩa là lệnh sẽ trả về nhiều hơn hoặc ít hơn 10 phím , có thể ít hơn nếu các khóa được điền thưa thớt trong các vị trí băm hoặc được lọc ra bởi MATCH họa tiết. Nó có thể nhiều hơn nếu một số khóa đang chia sẻ một khe cắm băm. Nhưng dù sao, công việc được thực hiện tỷ lệ với COUNT tham số.

Redis là một luồng. Một trong những lý do SCAN được giới thiệu là cho phép xem qua tất cả các khóa mà không cần chặn máy chủ trong thời gian dài, bằng cách thực hiện một vài bước tại một thời điểm.

Và đó chính xác là tiêu chí để quyết định đâu là một con số đẹp. Bạn sẵn sàng chặn trong bao lâu máy chủ Redis của bạn bằng cách chạy SCAN yêu cầu. COUNT càng cao , khối càng dài.

Hãy sử dụng tập lệnh Lua để hiểu về COUNT va chạm. Sử dụng nó trên môi trường của bạn để nhận kết quả dựa trên tài nguyên máy chủ của bạn.

Tập lệnh 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

Ở đây chúng tôi sử dụng Redis TIME yêu cầu. Lệnh trả về:

  • thời gian unix tính bằng giây
  • micro giây

Một vài lần chạy trong máy của tôi, với 1 triệu phím:

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

Lưu ý rằng những thời gian này không bao gồm thời gian được sử dụng để đọc từ ổ cắm và để đệm và gửi phản hồi. Thời gian thực tế sẽ lớn hơn. Thời gian Redis mất một lần, bao gồm cả thời gian di chuyển mạng không phải là lúc máy chủ Redis của bạn bị chặn.

Đây là cách tôi gọi tập lệnh Lua và kết quả:

> 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. lấy ngày và giờ hiện tại trong lua trong redis

  2. sử dụng bản đồ để lưu vào bộ nhớ cache cho khoảng 5000 mục nhập trong Javascript apllication VS Redis

  3. Làm thế nào để xóa Heroku Redis?

  4. Redis đang ghi vào .ssh / allow_keys

  5. Sử dụng Celery cho Thời gian thực, Truy vấn API bên ngoài đồng bộ với Gevent