Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> Redis

मास्टर रेडिस लुआ स्क्रिप्टिंग:प्रदर्शन को बढ़ावा देने के लिए एक व्यावहारिक मार्गदर्शिका

मास्टर रेडिस लुआ स्क्रिप्टिंग:प्रदर्शन को बढ़ावा देने के लिए एक व्यावहारिक मार्गदर्शिका <पी> आंद्रेई चेर्निकोव

द्वारा <पी> रेडिस एक लोकप्रिय इन-मेमोरी ग्रिड है जिसका उपयोग इंटरप्रोसेस संचार और डेटा स्टोरेज के लिए किया जाता है। आपने सुना होगा कि यह आपको लुआ स्क्रिप्ट चलाने की सुविधा देता है, लेकिन आप अभी भी निश्चित नहीं हैं कि ऐसा क्यों है। यदि यह आपके जैसा लगता है, तो आगे पढ़ें।

<पी> मास्टर रेडिस लुआ स्क्रिप्टिंग:प्रदर्शन को बढ़ावा देने के लिए एक व्यावहारिक मार्गदर्शिका

आवश्यकताएँ

<पी> इस गाइड का पालन करने के लिए आपके सिस्टम पर Redis इंस्टॉल होना चाहिए। पढ़ते समय रेडिस कमांड संदर्भ की जाँच करना सहायक हो सकता है।

मुझे लुआ स्क्रिप्ट की आवश्यकता क्यों है?

<पी> संक्षेप में:प्रदर्शन लाभ. रेडिस में आपके द्वारा किए जाने वाले अधिकांश कार्यों में कई चरण शामिल होते हैं। इन चरणों को अपने एप्लिकेशन की भाषा में करने के बजाय, आप इसे Redis के अंदर Lua के साथ कर सकते हैं।

  • इसके परिणामस्वरूप बेहतर प्रदर्शन हो सकता है।
  • इसके अलावा, एक स्क्रिप्ट के सभी चरण परमाणु तरीके से निष्पादित होते हैं। स्क्रिप्ट निष्पादित होने के दौरान कोई अन्य Redis कमांड नहीं चल सकता।
<पी> उदाहरण के लिए, मैं रेडिस में संग्रहीत JSON स्ट्रिंग्स को बदलने के लिए लुआ स्क्रिप्ट का उपयोग करता हूं। मैं इस लेख के अंत में इसका विस्तार से वर्णन करूंगा।

लेकिन मैं किसी लुआ को नहीं जानता

<पी> मास्टर रेडिस लुआ स्क्रिप्टिंग:प्रदर्शन को बढ़ावा देने के लिए एक व्यावहारिक मार्गदर्शिका एक व्यक्ति जो कोई लुआ नहीं जानता <पी> चिंता न करें, लुआ को समझना बहुत कठिन नहीं है। यदि आप सी परिवार की कोई भाषा जानते हैं, तो आपको लुआ से कोई आपत्ति नहीं होगी। इसके अलावा, मैं इस लेख में कामकाजी उदाहरण भी प्रदान कर रहा हूं।

मुझे एक उदाहरण दिखाएँ

<पी> आइए redis-cli के माध्यम से स्क्रिप्ट चलाकर शुरुआत करें . इसकी शुरुआत इससे करें:

redis-cli
<पी> अब निम्न कमांड चलाएँ:

eval “redis.call(‘set’, KEYS[1], ARGV[1])” 1 key:name value
<पी> ईवल कमांड वह है जो रेडिस को स्क्रिप्ट चलाने के लिए कहता है जो निम्नानुसार है। ”redis.call(‘set’, KEYS[1], ARGV[1])” स्ट्रिंग हमारी स्क्रिप्ट है जो कार्यात्मक रूप से रेडिस के set के समान है आदेश. तीन पैरामीटर स्क्रिप्ट टेक्स्ट का अनुसरण करते हैं:

  1. प्रदत्त कुंजियों की संख्या
  2. कुंजी नाम
  3. पहला तर्क
<पी> स्क्रिप्ट तर्क दो समूहों में आते हैं:कुंजियाँ और ARGV .

<पी> हम निर्दिष्ट करते हैं कि स्क्रिप्ट को उसके ठीक बाद वाली संख्या के साथ कितनी कुंजियों की आवश्यकता है। हमारे उदाहरण में, यह 1 है . इस नंबर के तुरंत बाद, हमें एक के बाद एक ये चाबियाँ प्रदान करनी होंगी। वे कुंजी के रूप में पहुंच योग्य हैं स्क्रिप्ट के भीतर तालिका. हमारे मामले में, इसमें एक ही मान key:name शामिल है सूचकांक 1 पर .

<पी> ध्यान दें, कि लुआ अनुक्रमित तालिकाएँ सूचकांक से शुरू होती हैं 1, नहीं 0 . <पी> हम कुंजियों के बाद किसी भी संख्या में तर्क प्रदान कर सकते हैं, जो लुआ में ARGV के रूप में उपलब्ध होंगे। टेबल. इस उदाहरण में, हम एक एकल ARGV प्रदान करते हैं -तर्क:स्ट्रिंग value . जैसा कि आपने पहले ही अनुमान लगाया था, उपरोक्त आदेश कुंजी key:name सेट करता है मान value के लिए .

<पी> कुंजियाँ प्रदान करना एक अच्छा अभ्यास माना जाता है जिन्हें स्क्रिप्ट KEYS के रूप में उपयोग करती है , और अन्य सभी तर्क ARGV के रूप में . इसलिए आपको कुंजियाँ निर्दिष्ट नहीं करनी चाहिए 0 के रूप में और फिर ARGV के भीतर सभी कुंजियाँ प्रदान करें तालिका.

<पी> आइए अब देखें कि स्क्रिप्ट सफलतापूर्वक पूरी हुई या नहीं। हम एक अन्य स्क्रिप्ट चलाकर ऐसा करने जा रहे हैं जिसे Redis से कुंजी मिलती है:

<पी> eval "वापसी redis.call('प्राप्त करें', कुंजी[1])" 1 कुंजी:नाम

<पी> आउटपुट ”value” होना चाहिए , जिसका अर्थ है कि पिछली स्क्रिप्ट ने कुंजी “key:name” को सफलतापूर्वक सेट कर दिया है .

क्या आप स्क्रिप्ट समझा सकते हैं?

<पी> मास्टर रेडिस लुआ स्क्रिप्टिंग:प्रदर्शन को बढ़ावा देने के लिए एक व्यावहारिक मार्गदर्शिका ऊपर स्क्रिप्ट देखने के बाद डोगे <पी> हमारी पहली स्क्रिप्ट में एक ही कथन शामिल है:redis.call फ़ंक्शन:

redis.call(‘set’, KEYS[1], ARGV[1])
<पी> redis.call के साथ आप किसी भी रेडिस कमांड को निष्पादित कर सकते हैं। पहला तर्क इस कमांड का नाम है और उसके बाद इसके पैरामीटर हैं। set के मामले में आदेश, ये तर्ककुंजीहैं और मूल्य . सभी रेडिस कमांड समर्थित हैं। दस्तावेज़ के अनुसार:

<पी> रेडिस सभी कमांड चलाने के लिए एक ही लुआ दुभाषिया का उपयोग करता है <पी> हमारी दूसरी स्क्रिप्ट केवल एक कमांड चलाने से थोड़ा अधिक काम करती है - यह एक मान भी लौटाती है:

eval “return redis.call(‘get’, KEYS[1])” 1 key:name
<पी> स्क्रिप्ट द्वारा लौटाई गई हर चीज़ कॉलिंग प्रक्रिया में भेज दी जाती है। हमारे मामले में, यह प्रक्रियारेडिस-क्लिहै और आप परिणाम अपनी टर्मिनल विंडो में देखेंगे।

कुछ अधिक जटिल?

<पी> मास्टर रेडिस लुआ स्क्रिप्टिंग:प्रदर्शन को बढ़ावा देने के लिए एक व्यावहारिक मार्गदर्शिका एक व्यक्ति एक जटिल रेडिस स्क्रिप्ट बनाने की योजना बना रहा है <पी> मैंने एक बार हैश मैप से तत्वों को एक विशेष क्रम में वापस करने के लिए लुआ स्क्रिप्ट का उपयोग किया था। ऑर्डर स्वयं एक क्रमबद्ध सेट में संग्रहीत हैश कुंजियों द्वारा निर्दिष्ट किया गया था।

<पी> आइए सबसे पहले इन कमांड्स को redis-cli में चलाकर अपना डेटा सेट करें :

hmset hkeys key:1 value:1 key:2 value:2 key:3 value:3 key:4 value:4 key:5 value:5 key:6 value:6
zadd order 1 key:3 2 key:1 3 key:2
<पी> ये आदेश कुंजी hkeys पर एक हैश मैप बनाते हैं और कुंजी order पर एक क्रमबद्ध सेट जिसमें hkeys से चयनित कुंजियाँ शामिल हैं एक विशिष्ट क्रम में.

<पी> हो सकता है कि आप जांच करना चाहें एचएमसेट और ज़ाद विवरण के लिए संदर्भ आदेश देता है। <पी> आइए निम्नलिखित स्क्रिप्ट चलाएँ:

eval “local order = redis.call(‘zrange’, KEYS[1], 0, -1); return redis.call(‘hmget’,KEYS[2],unpack(order));” 2 order hkeys
<पी> आपको निम्नलिखित आउटपुट देखना चाहिए:

“value:3”
“value:1”
“value:2”
<पी> इसका मतलब है कि हमें उन चाबियों के मान मिल गए जो हम चाहते थे और सही क्रम में।

क्या इसे चलाने के लिए मुझे पूर्ण स्क्रिप्ट टेक्स्ट निर्दिष्ट करना होगा?

<पी> नहीं! रेडिस आपको स्क्रिप्ट लोड के साथ एक स्क्रिप्ट को मेमोरी में प्रीलोड करने की अनुमति देता है आदेश:

script load “return redis.call(‘get’, KEYS[1])”
<पी> आपको इस तरह का आउटपुट देखना चाहिए:

“4e6d8fc8bb01276962cce5371fa795a7763657ae”
<पी> यह स्क्रिप्ट का अद्वितीय हैश है जिसे आपको EVALSHA को प्रदान करना होगा स्क्रिप्ट चलाने का आदेश:

evalsha 4e6d8fc8bb01276962cce5371fa795a7763657ae 1 key:name
<पी> ध्यान दें:आपको वास्तविक का उपयोग करना चाहिए SHA1 हैश द्वारा लौटाया गया स्क्रिप्ट लोड कमांड, ऊपर दिया गया हैश केवल एक उदाहरण है।

आपने JSON बदलने के बारे में क्या बताया?

<पी> कभी-कभी लोग JSON ऑब्जेक्ट को Redis में संग्रहीत करते हैं। यह एक अच्छा विचार है या नहीं यह एक अलग कहानी है, लेकिन व्यवहार में ऐसा बहुत होता है।

<पी> यदि आपको इस JSON ऑब्जेक्ट में कोई कुंजी बदलनी है, तो आपको इसे Redis से प्राप्त करना होगा, इसे पार्स करना होगा, कुंजी बदलना होगा, फिर क्रमबद्ध करना होगा और इसे Redis पर वापस सेट करना होगा। इस दृष्टिकोण के साथ कुछ समस्याएं हैं:

  1. समवर्तीता. एक अन्य प्रक्रिया हमारे प्राप्त और सेट संचालन के बीच इस JSON को बदल सकती है। इस स्थिति में, परिवर्तन खो जाएगा।
  2. प्रदर्शन. यदि आप ये परिवर्तन अक्सर करते हैं और यदि वस्तु अपेक्षाकृत बड़ी है, तो यह आपके ऐप की बाधा बन सकती है। आप लुआ में इस तर्क को लागू करके कुछ प्रदर्शन जीत सकते हैं।
<पी> आइए कुंजी obj के अंतर्गत Redis में एक परीक्षण JSON स्ट्रिंग जोड़ें :

set obj ‘{“a”:”foo”,”b”:”bar”}’
<पी> अब अपनी स्क्रिप्ट चलाएँ:

EVAL ‘local obj = redis.call(“get”,KEYS[1]); local obj2 = string.gsub(obj,”(“ .. ARGV[1] .. “\”:)([^,}]+)”, “%1” .. ARGV[2]); return redis.call(“set”,KEYS[1],obj2);’ 1 obj b bar2
<पी> अब हमारे पास कुंजी obj के अंतर्गत निम्नलिखित ऑब्जेक्ट होगा :

{“a”:”foo”,”b”:”bar2"}
<पी> इसके बजाय आप इस स्क्रिप्ट को स्क्रिप्ट लोड के साथ लोड कर सकते हैं आदेश:

SCRIPT LOAD ‘local obj = redis.call(“get”,KEYS[1]); local obj2 = string.gsub(obj,”(“ .. ARGV[1] .. “\”:)([^,}]+)”, “%1” .. ARGV[2]); return redis.call(“set”,KEYS[1],obj2);’
<पी> और फिर इसे इस तरह चलाएं:

EVALSHA <your_script_sha> 1 obj b bar2
<पी> कुछ नोट्स:
  • .. लुआ में स्ट्रिंग कॉन्सटेनेशन ऑपरेटर है।
  • हम कुंजी से मिलान करने और उसके मान को बदलने के लिए एक रेगेक्स पैटर्न का उपयोग करते हैं। यदि आप इस रेगुलर एक्सप्रेशन को नहीं समझते हैं, तो आप मेरी हालिया मार्गदर्शिका देख सकते हैं।
  • अधिकांश अन्य स्वादों से लुआ रेगेक्स स्वाद का एक अंतर यह है कि हम % का उपयोग करते हैं रेगेक्स विशेष प्रतीकों के लिए बैकरेफरेंस मार्क और एस्केप कैरेक्टर दोनों के रूप में।
  • हम अभी भी से बचे हुए हैं \ के साथ और % नहीं क्योंकि हम लुआ स्ट्रिंग डिलीमीटर से बचते हैं, न कि रेगएक्स विशेष प्रतीक से।

क्या मुझे हमेशा लुआ स्क्रिप्ट का उपयोग करना चाहिए?

<पी> नहीं, मैं उनका उपयोग केवल तभी करने की सलाह देता हूं जब आप यह साबित कर सकें कि इससे बेहतर प्रदर्शन होता है। हमेशा पहले बेंचमार्क चलाएं।

<पी> यदि आप केवल परमाणुता चाहते हैं, तो आपको इसके बजाय रेडिस लेनदेन की जांच करनी चाहिए।

<पी> साथ ही, आपकी स्क्रिप्ट बहुत लंबी नहीं होनी चाहिए। याद रखें कि जब एक स्क्रिप्ट चल रही होती है, तो बाकी सभी चीज़ें उसके ख़त्म होने का इंतज़ार कर रही होती हैं। यदि आपकी स्क्रिप्ट में काफी समय लगता है, तो यह प्रदर्शन में सुधार के बजाय बाधाएं पैदा कर सकता है। टाइमआउट (डिफ़ॉल्ट रूप से 5 सेकंड) तक पहुंचने के बाद स्क्रिप्ट बंद हो जाती है।

<पी> मास्टर रेडिस लुआ स्क्रिप्टिंग:प्रदर्शन को बढ़ावा देने के लिए एक व्यावहारिक मार्गदर्शिका रेडिस स्क्रिप्ट में बहुत अधिक समय नहीं लगना चाहिए

अंतिम शब्द

<पी> लुआ के बारे में अधिक जानकारी के लिए lua.org देखें।

<पी> आप लुआ स्क्रिप्ट के कुछ उदाहरणों के लिए GitHub पर मेरी नोड.जेएस लाइब्रेरी देख सकते हैं (देखें src/lua फ़ोल्डर). आप स्वयं कोई लुआ स्क्रिप्ट लिखे बिना JSON ऑब्जेक्ट को बदलने के लिए इस लाइब्रेरी का उपयोग नोड.जेएस में भी कर सकते हैं।

<पी> — — — — — — — — — — — — — — — — — — — — — — — — — — — — — <पी> इस लेख को पढ़ने के लिए धन्यवाद. प्रश्नों और टिप्पणियों की बहुत सराहना की जाती है। मेरा अनुसरण करने के लिए आपका भी स्वागत हैट्विटर पर . <पी> मुफ़्त में कोड करना सीखें. फ्रीकोडकैंप के ओपन सोर्स पाठ्यक्रम ने 40,000 से अधिक लोगों को डेवलपर्स के रूप में नौकरी पाने में मदद की है। आरंभ करें


  1. मेरे एंड्रॉइड ऐप में रिपल एनीमेशन कैसे बनाएं? मेरे एंड्रॉइड ऐप में रिपल एनीमेशन कैसे बनाएं?

    कोड में जाने से पहले, हमें पता होना चाहिए कि एंड्रॉइड में रिपल एनीमेशन क्या है। लहर एनीमेशन तरंग गति की तरह ही है। एंड्रॉइड में यह बैकग्राउंड एट्रीब्यूट का उपयोग करके टेक्स्टव्यू, बटन आदि जैसे दृश्य पर दिखाई देता है। यह उदाहरण प्रदर्शित करता है कि देखने के लिए रिपल एनिमेशन को कैसे एकीकृत किया जाए।

  1. रूबी एनएलपी:मनोरंजन और लाभ के लिए एन-ग्राम विश्लेषण रूबी एनएलपी:मनोरंजन और लाभ के लिए एन-ग्राम विश्लेषण

    यदि आपको पाठ का एक बड़ा संग्रह दिया जाए और आप उसमें से कुछ अर्थ निकालना चाहते हैं, तो आप क्या करेंगे? अपने टेक्स्ट को n-grams . में विभाजित करना एक अच्छी शुरुआत है । यहां एक विवरण दिया गया है : कम्प्यूटेशनल भाषाविज्ञान और संभाव्यता के क्षेत्र में, एक n-ग्राम पाठ के दिए गए अनुक्रम से n वस्तुओं का

  1. एंड्रॉइड CopyOnWriteArrayList में इंडेक्स के आधार पर तत्व कैसे प्राप्त करें? एंड्रॉइड CopyOnWriteArrayList में इंडेक्स के आधार पर तत्व कैसे प्राप्त करें?

    उदाहरण में आने से पहले, हमें पता होना चाहिए कि CopyOnWriteArrayListis. यह ArrayList का एक थ्रेड-सुरक्षित संस्करण है और अंतर्निहित सरणी की एक नई प्रतिलिपि बनाकर संचालन जोड़, सेट आदि करता है। यह उदाहरण दर्शाता है कि एंड्रॉइड में इंडेक्स के आधार पर तत्व कैसे प्राप्त करें CopyOnWriteArrayList चरण 1 -