redis MULTI/EXEC इकाइयों की एक मूलभूत विशेषता है जिसका अर्थ है कि आप नहीं ऑपरेशन के दौरान परिणाम प्राप्त करें। जैसे, आप जो पूछते हैं उसे करने के दो सामान्य तरीके हैं:
- लुआ का उपयोग करें (
ScriptEvaluate[Async]
); सर्वर पर शुरू से अंत तक एक लुआ स्क्रिप्ट निष्पादित होती है, कुशल होती है, और राउंड-ट्रिप समय (विलंबता या बैंडविड्थ) या अन्य कनेक्शन से प्रतिस्पर्धा से जुड़ी सभी समस्याओं से बचाती है - एक आशावादी लूप का उपयोग करें जो वर्तमान मूल्य को पढ़ता है, फिर SE-Redis में एक लेनदेन बनाता है जो एक बाधा जोड़ता है कि आपने जो मूल्य पढ़ा है वह वही है, और लेन-देन के अंदर साइड-इफेक्ट्स निष्पादित करें; पुस्तकालय इसे मजबूत बनाने के लिए आवश्यक वॉच आदि मशीनरी का समन्वय करेगा, लेकिन यदि बाधा की स्थिति अमान्य हो जाती है (यानी पुस्तकालय
false
लौटाता है ), आपको शुरू से ही सब कुछ फिर से करना होगा
सच कहूं, तो इन दिनों मैं हमेशा लोगों को विकल्प 1 के लिए मार्गदर्शन करता था; विकल्प 2 केवल "आकर्षक" है (और मैं उस शब्द का गलत तरीके से उपयोग करता हूं) यदि सर्वर-साइड लुआ स्क्रिप्टिंग उपलब्ध नहीं है।
मैं पीसी पर नहीं हूं, लेकिन मुझे लगता है कि स्क्रिप्ट कुछ इस तरह दिखेगी:
local id = redis.call("incr", KEYS[1])
redis.call("hset", KEYS[2], tostring(id), ARGV[1])
return id