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

Node redis nhà xuất bản chiếm quá nhiều bộ nhớ

Có hai câu hỏi ở đây.

Tại sao chương trình yêu cầu quá nhiều bộ nhớ?

Tôi nghĩ đó là do thiếu áp lực trở lại.

Tập lệnh của bạn chỉ gửi 1 triệu lệnh xuất bản tới Redis, nhưng nó không xử lý bất kỳ phản hồi nào đối với các lệnh này (do đó chỉ bị node_redis loại bỏ). Bởi vì nó không bao giờ đợi bất kỳ phản hồi nào, tập lệnh sẽ tích lũy rất nhiều ngữ cảnh trong bộ nhớ cho tất cả các lệnh này. node_redis cần giữ một ngữ cảnh để theo dõi các lệnh, đồng thời liên kết các lệnh và câu trả lời của Redis. Node.js sắp xếp các lệnh nhanh hơn so với việc hệ thống chuyển các lệnh đó tới Redis, xử lý chúng, xây dựng các câu trả lời và chuyển các câu trả lời trở lại node.js. Do đó, bối cảnh đang phát triển và nó thể hiện rất nhiều bộ nhớ.

Nếu bạn muốn duy trì mức tiêu thụ bộ nhớ ở mức có thể chấp nhận được, bạn cần giảm bớt mã của mình để tạo cơ hội cho node.js xử lý các câu trả lời của Redis. Ví dụ:tập lệnh sau cũng xử lý 1 triệu mục, nhưng nó xuất bản chúng dưới dạng lô 1000 mục và đợi phản hồi sau mỗi 1000 mục. Do đó, nó tiêu tốn rất ít bộ nhớ (ngữ cảnh chứa nhiều nhất 1000 lệnh đang chờ xử lý).

var redis = require("redis"),
    publisher = redis.createClient();

function loop( callback ) {
   var count = 0;
   for ( i=0 ; i < 1000; ++i ) {
        publisher.publish("rChat", i, function(err,rep) {
        if ( ++count == 1000 )
            callback();
        });
   }
}

function loop_rec( n, callback ) {
    if ( n == 0 ) {
        callback();
        return;
    }
    loop( function() {
        loop_rec( n-1, callback );
    });
}

function main() {
    console.log("Hello");
    loop_rec(1000, function() {
        console.log("stopped sending messages");
        setTimeout(function(){publisher.end();},1000);
        return;
    });
}

publisher.ping(main)

setTimeout(function() {
    console.log("Keeping console alive");
}, 1000000);

Có thể giải phóng bộ nhớ không?

Thông thường, nó không thể. Như tất cả các chương trình C / C ++, node.js sử dụng một trình cấp phát bộ nhớ. Khi bộ nhớ được giải phóng, nó không được giải phóng vào hệ thống mà là bộ cấp phát bộ nhớ. Nói chung, bộ cấp phát bộ nhớ không thể trả lại bộ nhớ không sử dụng cho hệ thống. Xin lưu ý rằng đây không phải là một rò rỉ, vì nếu chương trình thực hiện cấp phát mới, bộ nhớ sẽ được sử dụng lại.

Viết một chương trình C / C ++ thực sự có thể giải phóng bộ nhớ cho hệ thống thường liên quan đến việc thiết kế một bộ cấp phát bộ nhớ tùy chỉnh. Rất ít chương trình C / C ++ làm được điều đó. Trên hết, node.js bao gồm một trình thu gom rác với v8, vì vậy nó sẽ đặt thêm các ràng buộc đối với chính sách giải phóng bộ nhớ.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Gọi Redis zuniontore từ Lua bằng KEYS biến

  2. Làm thế nào để biết sidekiq được kết nối với máy chủ redis?

  3. resque-Scheduler không thành công khi xóa công việc

  4. Làm thế nào để chuyển đổi dự phòng sang nút Chính mới khi sử dụng Redis với Sentinel và redis-py?

  5. Làm cách nào tôi có thể nhận được Người dùng chính hiện đã được xác thực với bảo mật mùa xuân và Redis trong ứng dụng khởi động mùa xuân