Redis
 sql >> डेटाबेस >  >> NoSQL >> Redis

रेडिस:फैन आउट न्यूज फीड्स लिस्ट या सॉर्टेड सेट में?

हां, सॉर्ट किए गए सेट बहुत तेज और शक्तिशाली होते हैं। वे 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"



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. JHipster Redis इंटीग्रेशन एलिमेंट अनबाउंड एरर

  2. Socket.io में रेडिस कनेक्शन का पुन:उपयोग कैसे करें?

  3. मैं किसी भी एमक्यू प्लेटफॉर्म में इस एकल समवर्ती वितरित कतार को कैसे कार्यान्वित कर सकता हूं?

  4. स्प्रिंग डेटा रेडिस - यूयूआईडी आईडी - कन्वर्टर नॉटफाउंड अपवाद

  5. रेडिस - उपयोगकर्ता नाम, पासवर्ड और डीबी?