2012-10-11 29 views
6

मुझे अधिकतम संख्या में तत्वों के साथ एक लीडरबोर्ड बनाने की आवश्यकता है, एन कहें? मुझे पता है कि एन तत्वों के लिए सूची आकार कैप करने के लिए LPUSH + LTRIM का उपयोग कैसे करें। एक Redis का उपयोग कर लीडरबोर्ड के लिए यह लागू कैसे sortedsetरेडिस में केवल ली तत्वों में लीडरबोर्ड कैप करने के लिए कैसे?

अब तक मेरी दृष्टिकोण 3 चरणों में यह करने के लिए है: क) ZADD को लीडरबोर्ड

ख स्कोर + आइटम जोड़ने के लिए) वां के पद पाते हैं तत्व (मुझे यकीन नहीं है कि यह कैसे करें)

सी) ZREMRANGEBYRANK लीडरबोर्ड 0 रैंक_of_the_nth_element करें।

क्या कोई बेहतर तरीका है?

उत्तर

5

मेरे पास वास्तव में एक काम कर रहे लीडरबोर्ड ऐप है जो रेडिस का उपयोग करता है। आप इसे here देख सकते हैं। मेरे ऐप में लीडर बोर्ड शीर्ष n स्कोर से सीमित हैं, और पुराने स्कोर होने पर पुराने स्कोर भी बंद हो जाते हैं (इसलिए दिन, सप्ताह, महीना, वर्ष उच्च स्कोर बोर्ड हो सकते हैं)।

वैसे भी, मुझे लगता है कि आप जो करना चाहते हैं वह एक समग्र नेता बोर्ड है, इसलिए कम स्कोर को धक्का दिया जाता है। रेडिस सॉर्टेड सेट स्कोर के अर्थ में, यदि आपने इसे स्थापित किया है तो बहुत अधिक स्कोर रहना चाहिए (वे नीचे हैं) और कम स्कोर छोड़ना चाहिए (वे शीर्ष पर हैं) तो आप कुछ ऐसा करेंगे:

ZREMRANGBYRANK leaderboard 0 -100 

यह उदाहरण मानता है कि आप पिछले 100 स्कोर रखना चाहते हैं।

शायद आप स्कोर को उलटा कर सकते हैं, इसलिए 1000 का "उच्च स्कोर" लाल रंग में -1000 के रूप में संग्रहीत किया जाता है, इसलिए इसका क्रमबद्ध क्रम में पहला होता है। उस मामले में यह ऊपर के रूप में ही होगा, लेकिन ZREMRANGEBYRANK 100 -1 उपयोग करने के बाद पहले 100

अद्यतन सभी आइटम हटाना: एहसास है ZREMRANGEBYRANK तो मेरे उदाहरण सरलीकृत।

आपके प्रस्तावित समाधान को भी काम करना चाहिए। आप nth तत्व का स्कोर पता लगाना चाहते हैं, तो आप इस का उपयोग कर सकते हैं:

hundredth_entry = ZRANGE leaderboard 100 100 
hundredth_score = ZSCORE leaderboard hundredth_entry 
ZREMRANGEBYSCORE leaderboard -inf (hundredth_score 

( है सीमा नहीं समावेशी बनाने के लिए है, तो कुछ भी सौवां स्कोर की तुलना में कम से हटा दिया जाएगा, लेकिन नहीं सौवां स्कोर अपने आप।

1

ओपी एल्गोरिथ्म के एक lua कार्यान्वयन:

redis.call("ZADD", KEYS[1], ARGV[1]+0, ARGV[2]) 
local n = redis.call("ZCARD", KEYS[1]) 
if n > ARGV[3]+0 then 
    redis.call("ZREMRANGEBYRANK", KEYS[1], 0, n-ARGV[3]-1) 
end 

फिर

EVAL script 1 key score member cap 
साथ

ZADD key score member 

की जगह