इसका समाधान लुआ स्क्रिप्ट का उपयोग करना है:
local time = redis.call('TIME')
local ts = time[1]..string.format('%06d', time[2])
return redis.call('ZADD', KEYS[1], ts, ARGV[1])
यहाँ हम Redis TIME
. का उपयोग करते हैं आज्ञा। कमांड वापस आती है:
- सेकंड में यूनिक्स समय
- माइक्रोसेकंड
तो हम इन दोनों को जोड़ सकते हैं और माइक्रोसेकंड-टाइमस्टैम्प का उपयोग कर सकते हैं। हमें माइक्रोसेकंड भाग को शून्य-पैड करने की आवश्यकता है।
चूंकि सॉर्ट किए गए सेट 2^53 तक के पूर्णांक मानों के साथ अच्छे हैं, इसलिए हमारा टाइमस्टैम्प वर्ष 2255 तक सुरक्षित है।
यह रेडिस-क्लस्टर-सुरक्षित है क्योंकि हम एक कुंजी में स्टोर करते हैं। अगर आप टाइमस्टैम्प की तुलना करना चाहते हैं, तो एक से ज़्यादा कुंजियों का इस्तेमाल करने के लिए, हैश टैग का इस्तेमाल करके उन्हें एक ही नोड पर लाना सुनिश्चित करें।
आप माइक्रोसेकंड से कम रिज़ॉल्यूशन का उपयोग करने के लिए स्क्रिप्ट को संशोधित कर सकते हैं।
यहां EVAL
आदेश, सरल पास कुंजी और तर्क के रूप में मूल्य, हाथ से पहले क्रमबद्ध सेट बनाने की कोई आवश्यकता नहीं है:
EVAL "local time = redis.call('TIME') local ts = time[1]..string.format('%06d', time[2]) return redis.call('ZADD', KEYS[1], ts, ARGV[1])" 1 ssetKey myVal
हमेशा की तरह, आप शायद स्क्रिप्ट लोड करना और EVALSHA
. का उपयोग करना चाहें ।
> SCRIPT LOAD "local time = redis.call('TIME') local ts = time[1]..string.format('%06d', time[2]) return redis.call('ZADD', KEYS[1], ts, ARGV[1])"
"81e366e422d0b09c9b395b5dfe03c03c3b7b3bf7"
> EVALSHA 81e366e422d0b09c9b395b5dfe03c03c3b7b3bf7 1 ssetKey myNewVal
(integer) 1
रेडिस संस्करण पर एक नोट। यदि आप उपयोग कर रहे हैं:
- 3.2 से पहले का रेडिस संस्करण:क्षमा करें, आप
TIME
का उपयोग नहीं कर सकते हैं (गैर-नियतात्मक आदेश) और फिरZADD
. के साथ लिखें । - Redis संस्करण 3.2 से अधिक लेकिन <5.0:
redis.replicate_commands()
जोड़ें स्क्रिप्ट के शीर्ष पर। लिपियों को शुद्ध कार्यों के रूप में देखें - Redis 5.0 a up:आप अच्छे हैं।