2012-11-01 14 views
8

मैं वेब एप्लिकेशन लॉगिंग उद्देश्यों के लिए रेडिस का उपयोग करने के बारे में सोच रहा हूं। मैंने गुमराह किया कि लोग रेडिस कतार/सूची में लॉग को डंप करके और फिर एक अनुसूचित कार्यकर्ता डिस्क पर लिखने के द्वारा इस दृष्टिकोण का उपयोग कर रहे हैं।लॉगिंग के लिए redis

http://nosql.mypopescu.com/post/8652869828/another-redis-use-case-centralized-logging

मैं समझ है कि क्यों नहीं सीधे Redis का उपयोग डिस्क के लिए लागू करने के लिए की तलाश करना चाहते हैं? यदि मैंने एक छोटा सर्वर आवंटित किया है जो रेडिस डेटाबेस, ऐप सर्वर से अलग, लिखने के लिए लिखता है, तो क्या रेडिस का उपयोग सीधे लॉग को बनाए रखने के लिए करना संभव है?

मुझे डेटाटाइम, उपयोगकर्ता इत्यादि द्वारा रेडिस से पूछताछ में सहायता की भी आवश्यकता है। उदाहरण के लिए, प्रत्येक लॉग का पालन किया जाता है।

datetime=>2012-03-24 17:45:12 
userid=>123 
message=>test message 
category=>my category 

किसी विशेष श्रेणी के किसी विशिष्ट उपयोगकर्ता द्वारा डेटाटाइम रेंज के भीतर परिणामों के लिए मैं क्वेरी कैसे पूछ सकता हूं?

धन्यवाद!

उत्तर

19

आपको यह ध्यान रखना होगा कि रेडिस एक इन-मेमोरी डेटाबेस है (भले ही यह डिस्क को डेटा को जारी रख सके)। आपके द्वारा Redis में डाला गया डेटा स्मृति में फिट होना है।

आपके द्वारा उल्लेख किए गए लेख में प्रस्ताव Redis को वितरित क्यूइंग सिस्टम के रूप में उपयोग करने के बारे में है। कार्यकर्ता प्रक्रियाएं आइटम को हटा देती हैं और उन्हें डिस्क पर लिखती हैं, इसलिए रेडिस मेमोरी में कई आइटम नहीं हैं। इस डिज़ाइन में कोई दोष है: यदि कार्यकर्ता प्रक्रिया डिस्क पर पर्याप्त तेज़ी से डेटा नहीं लिख सकती है, तो रेडिस मेमोरी खपत विस्फोट हो जाएगी - इसलिए इसे कॉन्फ़िगरेशन (रेडिस मैक्समेमरी पैरामीटर) या सॉफ़्टवेयर (सीमित समय पर कतार को ट्रिम करें, या खाली) तक सीमित करना होगा कतार जब यह पूर्ण हो)।

अब आपका प्रस्ताव वास्तव में काम नहीं करता है क्योंकि रेडिस में आपके द्वारा लिखे गए सभी डेटा को स्मृति में रखा जाएगा (भले ही वे रेडिस द्वारा डिस्क पर बने रहें)।

एक और बिंदु यह है कि आप रेडिस से पूछ नहीं सकते हैं। रेडिस एक रिलेशनल डेटाबेस नहीं है, यह कोई विज्ञापन-प्रसार क्वेरी तंत्र का समर्थन नहीं करता है, केवल पहले परिभाषित एक्सेस पथ से जुड़े आदेश। यदि आप विभिन्न मानकों के साथ डेटा खोजना चाहते हैं, तो आपको सम्मिलित समय पर सभी संभावित खोजों का अनुमान लगाना होगा और संबंधित डेटा संरचनाओं (सेट, सॉर्ट किए गए सेट, आदि ...) का निर्माण करना होगा।

एक और स्टोर (मोंगोडीबी, या एक रिलेशनल डेटाबेस) शायद आपके उपयोग के मामले के लिए बेहतर होगा।

+0

मैं सिर्फ एक Redis डेमो देखा था। पीटर कूपर ने कहा कि रेडिस को लॉगिंग के लिए डिज़ाइन/कार्यान्वित किया गया था (वह आधिकारिक होने के लिए स्रोत के करीब है)। इसलिए, जबकि आपकी टिप्पणियां सच हैं, कुछ अतिरिक्त पढ़ने की आवश्यकता है। – Richard

+3

रेडिस को lloogg (http://lloogg.com/) का समर्थन करने के लिए डिज़ाइन किया गया था। लेकिन lloogg सेवा स्मृति में सबकुछ रखने और फिर प्रश्नों को संसाधित करने के बारे में नहीं है। यह सही डेटा संरचनाओं के भीतर डेटा पर आसानी से पहुंच की इजाजत देकर डेटा को स्टोर/एकत्रित करने के बारे में है। यह वही बात नहीं है। –

1

रेडिस मेमोरी डेटास्टोर में है। सहेजें या BGSAVE कमांड के साथ डेटा डिस्क पर डायरेक्ट दृढ़ता संभव है। पर्सिस्टेंस (आरडीबी/एओएफ) स्टोरेज इन-मेमोरी के अतिरिक्त एक सुविधा है।

डिस्क का लॉग डिस्क स्टोर करना आवश्यक है। इन-मेमोरी डेटास्टोर के बजाय किसी भी संदेश कतार (जैसे RabbitMQ) का उपयोग करना चीजों को सरल बनाना चाहिए। (लॉग मेमोरी नहीं खाएंगे)

अनुप्रयोग उत्पन्न करने वाले अनुप्रयोग उन्हें कतारों पर प्रकाशित कर सकते हैं और विभिन्न उपभोक्ताओं के साथ लॉग संदेश उपभोग कर सकते हैं और उन्हें डिस्क पर लिख सकते हैं।

किसी विशेष श्रेणी के किसी विशिष्ट उपयोगकर्ता द्वारा डेटाटाइम रेंज के भीतर परिणामों के लिए मैं क्वेरी कैसे पूछ सकता हूं?

लॉग का हर ब्लॉक (सी/सी के लिए उदाहरण ++) कुछ इस तरह एक संरचना के रूप में बचाया जाना चाहिए: स्ट्रिंग को यह संरचना

struct log{ 
    long datatime; 
    string userId; 
    string message; 
    string category; 
    }; 

को क्रमानुसार और मूल्य के रूप में Redis में संग्रहीत। इस तरह के मूल्यों के लिए कुंजी की तरह होगा: कुंजी = userId + परिसीमक + श्रेणी + परिसीमक + datatime

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

+0

क्या इस दृष्टिकोण का उपयोग कर रेंज प्रश्न (डेटाटाइम पर) जारी करना संभव है? – Legend

7

आप निम्नलिखित संरचना के साथ लॉग स्टोर कर सकते हैं:

"logs:{category}:{userid}:{datetime}" = message 

और फिर निम्नलिखित के रूप में यह अनुरोध करते हैं:

"logs:*:{userid}:{datetime}" 

या

"logs:{category}:*:{datetime}" 
संबंधित मुद्दे