हां, सॉर्ट किए गए सेट बहुत तेज और शक्तिशाली होते हैं। वे SORT
. की तुलना में आपकी आवश्यकताओं के लिए बहुत बेहतर मेल लगते हैं संचालन। समय की जटिलता को अक्सर गलत समझा जाता है। ओ (लॉग (एन)) बहुत तेज़ है, और स्केल ठीक है। हम इसे एक क्रमबद्ध सेट में लाखों सदस्यों के लिए उपयोग करते हैं। पुनर्प्राप्ति और प्रविष्टि उप-मिलीसेकंड है।
ZRANGEBYSCORE key min max WITHSCORES [LIMIT offset count]
. का उपयोग करें अपने परिणाम प्राप्त करने के लिए।
आप टाइमस्टैम्प को 'स्कोर' के रूप में कैसे स्टोर करते हैं, इस पर निर्भर करते हुए, ZREVRANGEBYSCORE बेहतर हो सकता है।
टाइमस्टैम्प के बारे में एक छोटी सी टिप्पणी:क्रमबद्ध सेट SCORES
जिसे दशमलव भाग की आवश्यकता नहीं है वह 15 अंकों या उससे कम का उपयोग करना चाहिए। तो SCORE
-999999999999999 से 999999999999999 की सीमा में रहना होगा। नोट:ये सीमाएं मौजूद हैं क्योंकि रेडिस सर्वर वास्तव में स्कोर (फ्लोट) को रेडिस-स्ट्रिंग प्रतिनिधित्व के रूप में आंतरिक रूप से संग्रहीत करता है।
इसलिए मैं इस प्रारूप की अनुशंसा करता हूं, जिसे ज़ुलु समय में परिवर्तित किया गया है:-20140313122802 दूसरी-सटीकता के लिए। आप 100ms-सटीकता के लिए 1 अंक जोड़ सकते हैं, लेकिन अधिक नहीं यदि आप सटीकता में कोई नुकसान नहीं चाहते हैं। यह अभी भी एक फ्लोट64 है, इसलिए कुछ परिदृश्यों में सटीकता का नुकसान ठीक हो सकता है, लेकिन आपका मामला 'पूर्ण परिशुद्धता' श्रेणी में फिट बैठता है, इसलिए मैं यही अनुशंसा करता हूं।
यदि आपका डेटा 10 वर्षों के भीतर समाप्त हो जाता है, तो आप .0001 सेकंड की सटीकता प्राप्त करने के लिए पहले तीन अंकों (CCYY का CCY) को छोड़ भी सकते हैं।
मैं यहां नकारात्मक स्कोर का सुझाव देता हूं, ताकि आप आसान ZRANGEBYSCORE
. का उपयोग कर सकें REV
. के बजाय एक। आप -inf
का उपयोग कर सकते हैं प्रारंभ स्कोर (ऋण अनंत) और LIMIT 0 100
. के रूप में शीर्ष 100 परिणाम प्राप्त करने के लिए।
दो क्रमबद्ध सेट members
(या 'keys'
लेकिन यह अस्पष्ट है क्योंकि सॉर्ट किया गया सेट भी अपने आप में एक कुंजी है) एक SCORE
साझा कर सकते हैं , यह कोई समस्या नहीं है, एक समान score
. के भीतर परिणाम वर्णानुक्रम में हैं।
आशा है कि यह मदद करता है, TW
चैट के बाद संपादित करें
ओपी डेटा एकत्र करना चाहता था (ZSET
. का उपयोग करके) ) विभिन्न कुंजियों से (GET
/SET
या HGET
/HSET
चांबियाँ)। JOIN
यह आपके लिए कर सकता है, ZRANGEBYSCORE
नहीं कर सकते। ऐसा करने का पसंदीदा तरीका, एक साधारण लुआ लिपि है। लुआ स्क्रिप्ट सर्वर पर निष्पादित की जाती है। नीचे दिए गए उदाहरण में मैं EVAL
. का उपयोग करता हूं सादगी के लिए, उत्पादन में आप SCRIPT EXISTS
. का उपयोग करेंगे , SCRIPT LOAD
और EVALSHA
. अधिकांश क्लाइंट लाइब्रेरी में कुछ बहीखाता पद्धति अंतर्निहित होती है, इसलिए आप हर बार स्क्रिप्ट अपलोड नहीं करते हैं।
यह रहा एक example.lua
:
local r={}
local zkey=KEYS[1]
local a=redis.call('zrangebyscore', zkey, KEYS[2], KEYS[3], 'withscores', 'limit', 0, KEYS[4])
for i=1,#a,2 do
r[i]=a[i+1]
r[i+1]=redis.call('get', a[i])
end
return r
आप इसे इस तरह उपयोग करते हैं (कच्चा उदाहरण, प्रदर्शन के लिए कोडित नहीं) :
redis-cli -p 14322 set activity:1 act1JSON
redis-cli -p 14322 set activity:2 act2JSON
redis-cli -p 14322 zadd feed 1 activity:1
redis-cli -p 14322 zadd feed 2 activity:2
redis-cli -p 14322 eval '$(cat example.lua)' 4 feed '-inf' '+inf' 100
परिणाम:
1) "1"
2) "act1JSON"
3) "2"
4) "act2JSON"