इस समस्या को हल करने का एक तरीका सर्वर-पक्ष लुआ स्क्रिप्टिंग का उपयोग करना है।
local res = {}
local result = {}
local tmp = redis.call('zrange', KEYS[1], 0, -1, 'withscores')
for i=1,#tmp,2 do
res[tmp[i+1]]=true
end
for k,_ in pairs(res) do
table.insert(result,k)
end
return result
आप EVAL आदेश का उपयोग करके इसे निष्पादित कर सकते हैं:
निम्न स्क्रिप्ट पर विचार करें।
यह जेसेट (स्कोर के साथ) की सामग्री निकालने के लिए zrange कमांड का उपयोग करता है, फिर यह अनावश्यक स्कोर को हटाने के लिए एक सेट (लुआ में एक तालिका के साथ दर्शाया गया) बनाता है, और अंत में उत्तर तालिका बना देता है। इसलिए जेसेट के मान नेटवर्क पर कभी नहीं भेजे जाते हैं।
यह स्क्रिप्ट अगर zset में आइटमों की संख्या वास्तव में अधिक है, क्योंकि यह प्रतियां एक लुआ वस्तु में पूरे zset (इसलिए यह स्मृति लेता है) एक दोष है। हालांकि, जेडसेट पर बढ़ने के लिए इसे बदलना आसान है (20 आइटम प्रति 20 आइटम)। उदाहरण के लिए:
local res = {}
local result = {}
local n = redis.call('zcard', KEYS[1])
local i=0
while i<n do
local tmp = redis.call('zrange', KEYS[1], i, i+20, 'withscores')
for j=1,#tmp,2 do
res[tmp[j+1]]=true
i = i + 1
end
end
for k,_ in pairs(res) do
table.insert(result,k)
end
return result
कृपया ध्यान दें मैं लुआ में कुल नौसिखिया हूँ, तो वहाँ एक ही बात को प्राप्त करने के शायद अधिक सुरुचिपूर्ण तरीके हैं।
मैं जानता हूँ कि आदेश क्या करेंगे, लेकिन समस्या यह है कि वी है मेरे मामले में अल्यूज़ इतने बड़े हैं, केवल स्कोर को ट्रैक करना समस्याग्रस्त है। – biztiger
@biztiger अपडेट किया गया। जाहिर है कि सही समाधान नहीं है, लेकिन यदि आपको वास्तव में कार्यक्षमता की आवश्यकता है तो एक व्यावहारिक व्यक्ति। –