2011-02-11 14 views
8

मैं Node.js और redis के साथ चारों ओर खेल रहा हूँ और यह आदेशNode.js, (हाय) Redis और बहु ​​आदेश

npm install hiredis redis 

मैं यहाँ बहु उदाहरण को देखा के माध्यम से hiredis पुस्तकालय स्थापित:

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

लाइन पर 17 यह कहते

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

जो कि पूर्णांक का तात्पर्य कमांड निष्पादित होने के बाद ernal multi.queue ऑब्जेक्ट को कभी भी साफ़ नहीं किया जाता है।

मेरा प्रश्न है: आप एक HTTP वातावरण में स्थिति को कैसे संभालेंगे? उदाहरण के लिए, पिछले जुड़ा उपयोगकर्ता ट्रैकिंग (यह वास्तव में बहु की जरूरत नहीं है के रूप में यह सिर्फ एक आदेश निष्पादित करता है, लेकिन यह पालन करने के लिए आसान है)

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); 
    }); 
}); 

इस मामले में, multi.exec पहले जुड़ा के लिए 1 लेन-देन पर अमल होगा उपयोगकर्ता, और 100 वें उपयोगकर्ता के लिए 100 लेनदेन (क्योंकि आंतरिक बहु.क्यू वस्तु कभी साफ़ नहीं होती है)।

विकल्प 1: मैं http.createServer कॉलबैक फ़ंक्शन, जो effectivly समारोह के निष्पादन के अंत में यह मार डालेंगे अंदर बहु ​​वस्तु बनाना चाहिए? सीपीयू चक्र के मामले में कितना महंगा होगा इस वस्तु को बनाना और नष्ट करना?

विकल्प 2:(), multi.execAndClear की तरह कुछ() जो कतार पल redis साफ हो जाएगा निष्पादित आदेशों की कि गुच्छा अन्य विकल्प multi.exec का एक नया संस्करण बनाने के लिए किया जाएगा।

आप कौन सा विकल्प ले लेंगे? मुझे लगता है कि विकल्प 1 बेहतर है - हम चेरी चुनने के बजाय एक वस्तु को मार रहे हैं - मैं बस यह सुनिश्चित करना चाहता हूं क्योंकि मैं नोड और जावास्क्रिप्ट दोनों के लिए नया ब्रांड हूं।

उत्तर

13

नोड_रेडिस में बहु वस्तुएं बनाने के लिए बहुत सस्ती हैं। एक साइड इफेक्ट के रूप में, मैंने सोचा कि यह आपको फिर से उपयोग करने के लिए मजेदार होगा, लेकिन यह कुछ परिस्थितियों में स्पष्ट रूप से केवल उपयोगी है। हर बार जब आपको एक नया लेनदेन की आवश्यकता होती है तो आगे बढ़ें और एक नई बहु वस्तु बनाएं।

ध्यान में रखना एक बात यह है कि आपको केवल मल्टी का उपयोग करना चाहिए यदि आपको वास्तव में रेडिस सर्वर पर परमाणु रूप से निष्पादित करने के लिए सभी परिचालनों की आवश्यकता होती है। यदि आप नेटवर्क बैंडविड्थ को बचाने के लिए कुशलता से कमांड की श्रृंखला को बैच करना चाहते हैं और आपके द्वारा प्रबंधित कॉलबैक की संख्या को कम करना चाहते हैं, तो केवल व्यक्तिगत आदेश भेजें, एक के बाद एक। node_redis सर्वर पर इन अनुरोधों को स्वचालित रूप से "पाइपलाइन" करेगा, और व्यक्तिगत कमांड कॉलबैक, यदि कोई हो, तो क्रमशः लागू किया जाएगा।

+2

क्या आप इसे एक उदाहरण के साथ समझा सकते हैं? स्पष्टीकरण पर –

+0

डिट्टो। प्रलेखन का कहना है कि यह कतार को हटा देता है। यह देखते हुए कि आप निष्पादन को दोबारा शुरू कर सकते हैं और इसे दोहराना चाहते हैं कमांड बहुत भ्रमित है। – maletor

संबंधित मुद्दे