2011-10-28 15 views
5

Redis protocol documentation में यह कहा गया है:रेडिस क्लाइंट पाइपलाइनिंग कैसे कार्यान्वित करते हैं?

एक ग्राहक एकाधिक आदेश जारी करने के लिए एक ही कनेक्शन का उपयोग कर सकते हैं। पाइपलाइनिंग समर्थित है इसलिए क्लाइंट द्वारा एक ही लेखन ऑपरेशन के साथ एकाधिक आदेशों को भेजा जा सकता है, अगली कमांड जारी करने के लिए सर्वर उत्तर पढ़ने की आवश्यकता नहीं है। सभी उत्तरों अंत में पढ़ा जा सकता है।

हालांकि, मुझे यह वास्तव में लागू करने के तरीके का कोई उदाहरण नहीं मिल रहा है। रेडिस क्लाइंट पाइपलाइनिंग कैसे कार्यान्वित करता है?

उत्तर

4

जब तक आप आसानी से एक टीसीपी स्ट्रीम पर संदेशों को सीमित कर सकते हैं, सर्वर के लिए पाइपलाइनिंग का समर्थन करने के लिए वास्तव में बहुत कम समर्थन की आवश्यकता होती है, तो टीसीपी स्टैक आपके लिए डेटा बफर करेगा, और एक सर्वर के रूप में आप केवल अनुरोध/पढ़ सकते हैं एक-एक करके, और अनुरोधों को पूरा करते समय जवाब भेजें। जब ग्राहक इन बफर भरते हैं, तो डेडलॉक के रूप में क्लाइंट/सर्वर को केवल जागरूक होने और मामलों को संभालने की आवश्यकता होती है।

यह कहा गया है कि, redis के लिए networking.c में processInputBuffer()/processMultibulkBuffer() पर एक नज़र डालें, रेडिस का अपना आउटपुट बफरिंग भी है, उदाहरण के लिए देखें addReply()

4

एक जोड़े अच्छा, यह कैसे कार्यान्वित किया जाता है की सरल उदाहरण रूबी redis ग्राहक, redis-rb के लिए स्रोत में पाया जा सकता है, और अजगर की, redis-py में से एक में क्रमश: नीचे सूचीबद्ध।

वे अनिवार्य रूप से क्या TaylorOtwell ऊपर उल्लेख करते हैं, CONCATENATE क्लाइंट-साइड अनुरोध करता है कि एक नेटवर्क अनुरोध में एक पाइप लाइन में Redis का प्रयास किया जाएगा, जबकि लेनदेन redis आदेश MULTI/EXEC शुरू करते हैं और एक सौदे को समाप्त करने का प्रयोग करेंगे।

redis-rb (redis.rb और pipeline.rb से):

def pipelined(options = {}) 
    synchronize do 
    begin 
     original, @client = @client, Pipeline.new 
     yield 
     if @client.commands.empty? 
     [] 
     else 
     original.call_pipelined(@client.commands, options) 
     end 
    ensure 
     @client = original 
    end 
    end 
end 

def call_pipelined(commands, options = {}) 
    @commands.concat commands 
    nil 
end 

एक और अच्छा उदाहरण redis-py, एक अजगर redis ग्राहक के लिए स्रोत में पाया जा सकता। उम्मीद है की वो मदद करदे।

2

उपरोक्त उत्तरों के लिए बस कुछ और अंतर्दृष्टि में फेंकना। रेडिस पाइपलाइन को समझने का एक तरीका यह तथ्य समझना है कि रेडिस पाइपलाइन पूरी तरह क्लाइंट साइड कार्यान्वयन है और रेडिस सर्वर के पास इसके साथ कुछ लेना देना नहीं है। हालांकि यह विभिन्न क्लाइंट कार्यान्वयन के बीच अलग है, यहां सामान्यीकृत विचार है:

पाइपलाइनिंग का उद्देश्य उच्च नेटवर्क विलंबता वातावरण में प्रतिक्रिया विलंबता समस्याओं को हल करना है। तो, कमांड भेजने और प्रतिक्रिया पढ़ने में नेटवर्क पर बिताए गए समय की तुलना में कम समय। यह प्रभावी रूप से बफरिंग द्वारा हासिल किया जाता है। क्लाइंट सर्वर पर भेजे जाने से पहले टीसीपी स्टैक (जैसा कि अन्य उत्तरों में उल्लिखित) पर आदेशों को बफर कर सकता है (या नहीं)। एक बार जब वे सर्वर पर भेजे जाते हैं, तो सर्वर उन्हें निष्पादित करता है और सर्वर पक्ष पर उन्हें बफर करता है। सामान्य स्थिति के विपरीत जहां ग्राहक प्रतिक्रिया प्राप्त होने के तुरंत बाद प्रतिक्रिया पढ़ता है, पाइपलाइनिंग के मामले में, क्लाइंट प्रतिक्रियाओं को सर्वर-साइड बफर को भागों में या जब 'सिंक' निष्पादित करता है (पाइपलाइन बंद करता है) बनाता है। यह फायदेमंद है क्योंकि प्रतिक्रियाओं को पढ़ने में ग्राहक द्वारा नेटवर्क पर बिताए गए समय बहुत कम हैं। http://nachivpn.blogspot.in/2014/11/redis-pipeline-explained.html

:

यहाँ अपने ब्लॉग पर एक पोस्ट जो आपको एक बेहतर विचार प्राप्त करने उल्लेख कर सकते है

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