2015-10-28 13 views
6

टीएल; डीआर मैं मिनट की घटनाओं की श्रेणी को बढ़ाने, बढ़ाने और पुनर्प्राप्त करने का एक तरीका ढूंढ रहा हूं।एक रेडिस सॉर्ट किए गए सेट के मूल्य को बढ़ाने के लिए कैसे करें

मैं रेडिस में वृद्धिशील टाइम्सरी बनाने के लिए एक समाधान की तलाश में हूं। मैं मिनटों को मायने रखता हूं। मेरा लक्ष्य एक समय सीमा को देखने और मूल्य प्राप्त करने में सक्षम होना है। इसलिए इंस्टेंस के लिए यदि कोई ईवेंट एक विशिष्ट कुंजी के लिए 30 बार एक मिनट के लिए हुआ। मैं ज़्रेंज की तरह कुछ करना चाहता हूं और उनके प्रमुख मूल्य प्राप्त करना चाहता हूं। मैं भी मूल्य बढ़ाने के लिए zincrby की तरह कुछ उपयोग करने की उम्मीद कर रहा हूँ। मैंने निश्चित रूप से एक क्रमबद्ध सेट को देखा है जो एकदम सही फिट जैसा लग रहा था जब तक मुझे एहसास हुआ कि मैं केवल स्कोर पर एक रेंज स्कैन कर सकता हूं, न कि मूल्य। इष्टतम समाधान स्कोर के रूप में मिनटों की संख्या का उपयोग करना होगा और फिर उस मिनट के लिए घटनाओं की संख्या के रूप में क्रमबद्ध सेट में मान का उपयोग करना होगा। जिस समस्या में मैंने भाग लिया वह ज़िन्स्बी केवल स्कोर को बढ़ाता है, न कि मूल्य। मैं परमाणु रूप से मूल्य बढ़ाने के लिए एक रास्ता खोजने में असमर्थ था। मैंने वर्तमान मिनट का उपयोग करके हैशपैप को भी देखा क्योंकि कुंजी और घटना गणना मूल्य के रूप में होती है। मैं hincrby का उपयोग कर मूल्य बढ़ाने में सक्षम था लेकिन समस्या यह है कि यह कुंजी की एक श्रृंखला लाने का समर्थन नहीं करता है।

किसी भी मदद की सराहना की जाएगी।

उत्तर

4

आप जानते हैं, एक प्रश्न पहले से ही एक उत्तर है। समय और काउंटर के रूप में मूल्य के रूप में कुंजी -

  1. उपयोग ZSET: और आप पहले से ही अपनी समस्या को हल करने के लिए redis तरीके के बारे में कहते हैं।
  2. HSET का उपयोग करें - काउंटर के रूप में समय और मूल्य के रूप में कुंजी।
  3. string keys का उपयोग करें - कुंजी के रूप में समय और मूल्य के रूप में महत्वपूर्ण नाम।

क्यों केवल इस मामलों - केवल इस ढांचे (ZSET, HSET और string keys) परमाणु तरीकों मान बढ़ाने के लिए है की वजह से।

तो वास्तव में:

  1. आप डेटा संरचना के बारे में सही choise बनाना चाहिए।
  2. डेटा चयन के साथ समस्या को हल करें।

पहला प्रश्न उत्तर स्मृति और perfomance के बीच समझौता है। अपने प्रश्न से आप यदि ऐसा है तो क्रमबद्ध सेट छँटाई एक सबसे अच्छा समाधान नहीं है किसी भी प्रकार की जरूरत नहीं है - स्मृति और ZINCRBY समय जटिलता का उपयोग करते है हे (लॉग (एन)) बल्कि HINCRBY और INCRBY है हे (1)। तो हमें betweeh हैश और स्ट्रिंग कुंजी का चयन करना चाहिए। कृपया रेडिस में सही मेमोरी ऑप्टिमाइज़ेशन के बारे में question and answer देखें - इसके अनुसार मुझे लगता है कि आपको अपने समाधान के लिए डेटा प्रकार के रूप में हैश का उपयोग करना चाहिए।

दूसरा प्रश्न किसी भी प्रकार के डेटा संरचनाओं के लिए आम है क्योंकि उनमें से सभी प्रकार के select by name फीचर्स या वे एनालॉग नहीं हैं। और हम इस समस्या को हल करने के लिए HMGET या LUA scripting का उपयोग कर सकते हैं। किसी भी मामले में इस समाधान में समय जटिलता ओ (एन) होगी।

यहाँ Jedis के साथ नमूना (मैं `नहीं एक जावा प्रोग्रामर, संभावित त्रुटियों के लिए खेद है) है:

int fromMinute = 1; 
int toMinute = 10; 

List<String> list = new ArrayList<String>(); 
for(int i = fromMinute ; i < toMinute ; i++) { 
    list.add(i.toString()); 
} 

Jedis jedis = new Jedis("localhost"); 
List<String> values = jedis.hmget("your_set_name", list); 

यह समाधान परमाणु, तेज है, समय जटिलता हे (एन) और उपभोग मेमोरी है रेडिस में जितना संभव हो उतना छोटा।

+0

जानकारी के लिए धन्यवाद !! मैं काफी निष्कर्ष पर आया था, हालांकि मैंने चाबियों की सूची प्राप्त करने के लिए hmget के बारे में नहीं सोचा था। मैं hscan देख रहा था और ऐसा करने के लिए बहुत नफरत था। मुझे लगता है कि यह एक उत्कृष्ट समाधान है !! मुझे नोड के लिए एक परियोजना भी मिली जिसमें एक बहुत ही समान समाधान है जिसे मैं नकल करने जा रहा हूं। यह HashMaps का उपयोग करता timeseries मिनट/घंटे की विवरण स्तरों पर depeneding बनाने के लिए/द्वितीय आदि –

+1

नोड पुस्तकालय http://blog.apiaxle.com/post/storing-near-realtime-stats-in- को ऋण देने के लिए भूल redis / –

संबंधित मुद्दे