2015-02-14 6 views
6

मैंने केवल मेरे डीबी के रूप में रेडिस का उपयोग किया, और मेरा ग्राहक ServiceStack.Redis है। बात यह है कि, यदि दो समवर्ती अनुरोध को एक कुंजी को अपडेट करने की आवश्यकता है, तो यह दौड़ की स्थिति हो सकती है। उदाहरण के लिएरेडिस का उपयोग करके दौड़ की स्थिति को कैसे रोक सकता हूं?

एक:

  1. पूर्णांक एक = जाओ कुंजी
  2. बहु
  3. एक = एक - 100
  4. कुंजी एक
  5. EXEC सेट

बी:

  1. पूर्णांक एक = जाओ कुंजी
  2. बहु
  3. एक = एक - 100
  4. सेट कुंजी एक
  5. EXEC

अगर मूल "कुंजी" 1000 है। यदि स्परेशन ए और बी धारावाहिक हैं ized, "कुंजी" के इन दो परिचालनों का सही परिणाम 800 होगा। लेकिन यदि ए और बी एक ही समय में होता है। ए प्रतिबद्ध करने से पहले, ऑपरेशन बी को "कुंजी" से 1000 मान मिलता है, और 900 को "कुंजी" पर सेट करता है। यही वह नहीं है जो मैं चाहता हूं। मैं इस तरह की दौड़ की स्थिति को कैसे रोक सकता हूं, "वॉच" का उपयोग कैसे कर सकता हूं?

+0

हां, वॉच का उपयोग करें। –

उत्तर

5

आपको Transactions in Redis पर दस्तावेज़ों को पढ़ना चाहिए, रेडिस में लेनदेन अनिवार्य रूप से कई संचालन को बैच कर रहा है ताकि उन्हें एक परमाणु ऑपरेशन के रूप में निष्पादित किया जा सके।

चूंकि यह केवल बैचिंग ऑपरेशंस है, इसलिए आप लेनदेन के संदर्भ में कोई भी पढ़ नहीं सकते हैं। लेनदेन की शुरुआत से पहले हाथ से पहले आपको जो भी पढ़ना चाहिए उसे पुनर्प्राप्त करने की आवश्यकता है। फिर आप किसी भी कुंजी को देखने के लिए Redis WATCH का उपयोग कर सकते हैं, जिसे आपके लेनदेन को पूरा करने से पहले संशोधित नहीं किया जाना चाहिए, यदि लेनदेन में कोई कुंजी संशोधित हो गई है और कोई संचालन संसाधित नहीं होगा।

+0

मुझे याद दिलाने के लिए धन्यवाद। मेरे कार्यक्रम में, मैंने अपने कार्यक्रम में लेनदेन शुरू करने से पहले पढ़ा। मैंने अपने छद्म कोड को सही क्रम में बदल दिया है। तो, देखो मेरी समस्या को हल करना चाहिए? –

+0

@AllanYang हाँ किसी भी पाठ से पहले वॉच का उपयोग करके यह सुनिश्चित करेगा कि लेनदेन निष्पादित होने से पहले कुंजी संशोधित की गई थी, तो लेनदेन को निष्पादित नहीं किया जाएगा। – mythz

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