2011-02-11 32 views
8

Tôi đang chơi xung quanh với Node.js và redis và cài đặt thư viện hiredis qua lệnh nàyNode.js, (Hi) Redis và lệnh đa

npm install hiredis redis 

tôi nhìn vào ví dụ đa ở đây:

https://github.com/mranney/node_redis/blob/master/examples/multi2.js

Tại dòng 17 nó nói

// you can re-run the same transaction if you like 

mà ngụ ý rằng int Đối tượng ernal multi.queue không bao giờ bị xóa khi các lệnh đã hoàn thành thực thi.

Câu hỏi của tôi là: Bạn xử lý tình huống trong môi trường http như thế nào? Ví dụ, theo dõi người sử dụng kết nối cuối cùng (điều này không thực sự cần điều khiển nhiều vì nó chỉ thực thi một lệnh nhưng rất dễ dàng để làm theo)

var http = require('http'); 
redis = require('redis'); 

client = redis.createClient() 
multi = client.multi(); 

http.createServer(function (request, response) { 
    multi.set('lastconnected', request.ip); // won't work, just an example 
    multi.exec(function(err, replies) { 
     console.log(replies); 
    }); 
}); 

Trong trường hợp này, multi.exec sẽ thực hiện 1 giao dịch cho người đầu tiên kết nối người dùng và 100 giao dịch cho người dùng thứ 100 (vì đối tượng multi.queue nội bộ sẽ không bao giờ bị xóa).

Tùy chọn 1: Tôi có nên tạo đối tượng đa bên trong hàm gọi lại http.createServer, điều này có hiệu quả sẽ giết nó khi kết thúc quá trình thực thi của hàm không? Làm thế nào đắt tiền về chu kỳ CPU sẽ tạo ra và phá hủy của đối tượng này được?

Phương án 2: Các tùy chọn khác sẽ là để tạo ra một phiên bản mới của multi.exec(), một cái gì đó giống như multi.execAndClear() mà sẽ xóa hàng đợi redis thời điểm thực hiện rằng loạt các lệnh.

Bạn sẽ chọn tùy chọn nào? Tôi cho rằng tùy chọn 1 là tốt hơn - chúng tôi đang giết chết một đối tượng thay vì chọn các phần của anh đào - tôi chỉ muốn chắc chắn rằng tôi là thương hiệu mới cho cả nút và javascript.

Trả lời

13

Nhiều đối tượng trong node_redis rất rẻ để tạo. Như một tác dụng phụ, tôi nghĩ sẽ rất thú vị nếu bạn sử dụng lại chúng, nhưng điều này rõ ràng chỉ hữu ích trong một số trường hợp. Hãy tiếp tục và tạo một đối tượng đa mới mỗi khi bạn cần một giao dịch mới.

Một điều cần ghi nhớ là bạn chỉ nên sử dụng đa nếu bạn thực sự cần tất cả các thao tác để thực thi nguyên tử trong máy chủ Redis. Nếu bạn chỉ muốn sắp xếp hàng loạt các lệnh hiệu quả để tiết kiệm băng thông mạng và giảm số lượng cuộc gọi lại mà bạn phải quản lý, chỉ cần gửi các lệnh riêng lẻ, sau lệnh kia. node_redis sẽ tự động "chuyển" các yêu cầu này tới máy chủ theo thứ tự, và các lệnh gọi lại riêng lẻ, nếu có, sẽ được gọi theo thứ tự.

+2

bạn có thể giải thích điều này bằng ví dụ không? –

+0

Ditto về giải thích. Tài liệu nói rằng nó thoát hàng đợi. Cho rằng bạn có thể chạy lại các exec và có nó lặp lại các lệnh là rất khó hiểu. – maletor

Các vấn đề liên quan