रेडिस के दस्तावेज़ों के अनुसार परमाणुता के मामले में आप ठीक रहेंगे:
<ब्लॉकक्वॉट>रेडिस सभी आदेशों को चलाने के लिए एक ही लुआ दुभाषिया का उपयोग करता है। रेडिस भी गारंटी देता है कि एक स्क्रिप्ट को परमाणु तरीके से निष्पादित किया जाता है:कोई अन्य स्क्रिप्ट या रेडिस कमांड निष्पादित नहीं किया जाएगा, जबकि एक स्क्रिप्ट निष्पादित की जा रही है। यह शब्दार्थ बहु / EXEC में से एक के समान है। अन्य सभी ग्राहकों के दृष्टिकोण से एक स्क्रिप्ट के प्रभाव या तो अभी भी दिखाई नहीं दे रहे हैं या पहले ही पूर्ण हो चुके हैं।
हालाँकि, यदि स्क्रिप्ट बहुत धीमी है, तो यह समस्या का कारण बनती है। तो स्क्रिप्ट प्रकाश संचालन के लिए सबसे अच्छी है जिसके लिए कुछ तर्क और परमाणुता की आवश्यकता होती है।
एक और खामी जिसमें आप पड़ सकते हैं, यदि स्क्रिप्ट किसी तरह बीच में विफल हो जाती है, तो आपके द्वारा किए गए कॉल को वापस नहीं लाया जा सकता है, हालांकि स्क्रिप्ट त्रुटि लौटाएगी।
उदा:आपके पास इस तरह की एक स्क्रिप्ट है:
redis.call('set', 'foo', 1)
redis.call('rpush', 'foo', 2)
स्क्रिप्ट निष्पादन त्रुटि लौटाएगा, लेकिन foo
पहले से ही रेडिस में 1
. के रूप में सेट किया गया है ।
आपके प्रश्न से कुछ असंबंधित:मैंने देखा है कि आपने इसका उपयोग किया है
eval "your_raw_code" key_count keys argv
जब आप टर्मिनल में होते हैं तो वास्तव में आप लुआ स्क्रिप्ट फ़ाइल को eval में कॉल कर सकते हैं:
> redis-cli eval "$(cat path/to/script/script_name.lua)" key_count keys argv