2013-04-07 3 views
11

रेडिस वैकल्पिक पैरामीटर के साथ लॉकिंग तंत्र के रूप में एसईटी का उपयोग करने की विधि की सिफारिश करता है। अर्थात। "एसईटी लॉक 1 एक्स 10 एनएक्स" केवल लॉक सेट करेगा यदि यह पहले से मौजूद नहीं है और यह 10 सेकंड के बाद समाप्त हो जाएगा।नोड रेडिस - EX और NX के साथ सेट?

मैं नोड रेडिस का उपयोग कर रहा हूं, जिसमें एक सेट() विधि है, लेकिन मुझे यकीन नहीं है कि इसे अतिरिक्त समय सीमा समाप्त करने के लिए अतिरिक्त पैरामीटर कैसे पास करें और अगर यह पहले से मौजूद नहीं है, या यहां तक ​​कि यदि यह है मुमकिन।

शायद मुझे setnx() और समाप्त() को अलग कॉल के रूप में उपयोग करना होगा?

उत्तर

30

नोड Redis स्रोत कोड को पढ़ने के बाद, मैंने पाया कि सभी तरीकों तर्कों की एक मनमाना संख्या को स्वीकार । जब तर्कों की गलत संख्या उत्पन्न होती है, तो यह रेडिस द्वारा नोड मॉड्यूल नहीं उत्पन्न होता है।

कई तर्कों की आपूर्ति करने के मेरे शुरुआती प्रयास इसलिए थे क्योंकि मेरे पास केवल Redis 2.2.x स्थापित था, जहां एसईटी केवल 2.6.12 के साथ एनएक्स और एक्स तर्क स्वीकार करता है।

तो Redis 2.6.12 के साथ स्थापित किया, पालन विधि कॉल नोड redis के साथ काम एक चर सेट करने के लिए अगर यह मौजूद नहीं है और इसे सेट 5 मिनट के बाद समाप्त हो रहे हैं:

$client->set('hello', 'world', 'NX', 'EX', 300, function(err, reply) {...}); 
$client->set(['hello', 'world', 'NX', 'EX', 300], function(err, reply) {...}); 
3

आप अपना खुद का setnex कमांड बनाने के लिए एक लुआ स्क्रिप्ट का उपयोग कर सकते हैं। सभी लुआ स्क्रिप्ट्स परमाणु रूप से चलती हैं, इसलिए आपको अन्य क्लाइंट्स को डेटा बदलने के बारे में चिंता करने की ज़रूरत नहीं है जिसे आपने पहले ही स्क्रिप्ट में पढ़ा है।

-- setnex.lua 
local key = ARGV[1] 
local expiry = ARGV[2] 
local value = ARGV[3] 
local reply = redis.call("SETNX", key, value) 
if 1 == reply then 
    redis.call("EXPIRE", key, expiry) 
end 
return reply 

आप इस तरह node_redis से यह कॉल कर सकते हैं:

client.eval(setnex_lua, 0, "mykey", 10, "myvalue", function (err, res) { 
    console.dir(err); 
    console.dir(res); 
}); 
संबंधित मुद्दे