लॉक के 3 भाग होते हैं:
- कुंजी (डेटाबेस में लॉक का अद्वितीय नाम)
- मान (एक कॉलर-परिभाषित टोकन जिसका उपयोग यह इंगित करने के लिए किया जा सकता है कि लॉक का "मालिक" कौन है, और यह जांचने के लिए कि लॉक को जारी करना और विस्तार करना सही तरीके से किया जा रहा है)
- अवधि (एक ताला जानबूझकर एक सीमित अवधि की चीज है)
यदि कोई अन्य मूल्य दिमाग में नहीं आता है, तो एक गाइड उपयुक्त "मूल्य" बना सकता है। हम मशीन-नाम का उपयोग करते हैं (या मशीन के नाम का एक मुंग्ड संस्करण यदि एक ही मशीन पर कई प्रक्रियाएं प्रतिस्पर्धा कर सकती हैं)।
साथ ही, ध्यान दें कि लॉक लेना सट्टा है , अवरुद्ध नहीं . यह पूरी तरह से संभव है कि आप असफल लॉक प्राप्त करने के लिए, और इसलिए आपको इसके लिए परीक्षण करने और शायद कुछ पुनः प्रयास तर्क जोड़ने की आवश्यकता हो सकती है।
एक विशिष्ट उदाहरण हो सकता है:
RedisValue token = Environment.MachineName;
if(db.LockTake(key, token, duration)) {
try {
// you have the lock do work
} finally {
db.LockRelease(key, token);
}
}
ध्यान दें कि यदि कार्य लंबा है (विशेष रूप से एक लूप), तो आप कुछ सामयिक LockExtend
जोड़ना चाह सकते हैं बीच में कॉल - सफलता की जांच करने के लिए फिर से याद रखना (यदि यह समय समाप्त हो गया हो)।
यह भी ध्यान दें कि सभी व्यक्तिगत रेडिस कमांड परमाणु हैं, इसलिए आपको प्रतिस्पर्धा करने वाले दो बुद्धिमान संचालन के बारे में चिंता करने की आवश्यकता नहीं है। अधिक जटिल बहु-संचालन इकाइयों के लिए, लेनदेन और स्क्रिप्टिंग विकल्प हैं।