2013-01-23 43 views
6

के लिए सभी स्कोर उपलब्ध कराएं मुझे रेडिस सॉर्ट किए गए सेट के लिए सभी स्कोर उपलब्ध कराने की आवश्यकता है।रेडिस: सॉर्ट किए गए सेट

redis> ZADD myzset 10 "one" 

(integer) 1 

redis> ZADD myzset 20 "two" 

(integer) 1 

redis> ZADD myzset 30 "three" 

(integer) 1 

अब मैं माइज़सेट के लिए सभी स्कोर पुनर्प्राप्त करना चाहता हूं, यानी। 10,20,30।

उत्तर

3

इस समस्या को हल करने का एक तरीका सर्वर-पक्ष लुआ स्क्रिप्टिंग का उपयोग करना है।

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 

कृपया ध्यान दें मैं लुआ में कुल नौसिखिया हूँ, तो वहाँ एक ही बात को प्राप्त करने के शायद अधिक सुरुचिपूर्ण तरीके हैं।

7

EDIT: चूंकि मूल्यों के आकार के साथ आपकी समस्या पहले स्पष्ट नहीं थी, मैंने कुछ अतिरिक्त शोध किया था।

वर्तमान दस्तावेज के अनुसार एक क्रमबद्ध सेट से स्कोर प्राप्त करने का कोई तरीका नहीं है।

तुम सिर्फ स्कोर प्राप्त करने के लिए करने की आवश्यकता होगी क्या एक साथ एक अलग सेट करने के लिए उन्हें जोड़ने के लिए और जब जरूरत उन्हें वहाँ से प्राप्त करने के लिए है।

क्या आप शायद हालांकि पहले क्या करना चाहिए डेटा संरचनाओं में अलग तरह से अपनी समस्या का मैप करने के लिए प्रयास करने के लिए है। मैं आपके प्रश्न से नहीं कह सकता कि आपको स्कोर प्राप्त करने की आवश्यकता क्यों है, लेकिन समस्या को ढूढ़ने के अन्य तरीके हो सकते हैं जो रेडिस को बेहतर तरीके से मैप करेंगे।

-

मुझे यकीन है कि वहाँ किसी भी तरह से कुंजी प्राप्त किए बिना सभी स्कोर प्राप्त करने के लिए है नहीं कर रहा हूँ, लेकिन ZRANGE कम से कम जानकारी आप देख रहे हैं मिल जाएगा;

redis> ZADD myzset 10 "one" 
(integer) 1 

redis> ZADD myzset 20 "two" 
(integer) 1 

redis> ZADD myzset 30 "three" 
(integer) 1 

redis> ZRANGE myzset 0 -1 WITHSCORES 
["one","10","two","20","three","30"] 
+0

मैं जानता हूँ कि आदेश क्या करेंगे, लेकिन समस्या यह है कि वी है मेरे मामले में अल्यूज़ इतने बड़े हैं, केवल स्कोर को ट्रैक करना समस्याग्रस्त है। – biztiger

+0

@biztiger अपडेट किया गया। जाहिर है कि सही समाधान नहीं है, लेकिन यदि आपको वास्तव में कार्यक्षमता की आवश्यकता है तो एक व्यावहारिक व्यक्ति। –

1

आपको वैकल्पिक तर्क के साथ ASSCORES पास करने की आवश्यकता है।प्रलेखन here:

ZREVRANGE कुंजी शुरू यह निम्नलिखित गहरे लाल रंग की बात आती है रोक [WITHSCORES] एक अनुसार क्रमबद्ध सेट में सदस्यों की एक सीमा लौटें, सूचकांक द्वारा स्कोर उच्च से निम्न

0

करने का आदेश दिया साथ, देखें

redis.zrange("zset", 0, -1, :with_scores => true) 
# => [["a", 32.0], ["b", 64.0]] 

स्रोत Ruby Docs