2012-06-11 11 views
8

संक्षेप में, नेट पारिस्थितिकी तंत्र में कौन सी सरल इन-मेमोरी कैश मौजूद है?नेट सरल इन-मेमोरी कैश

क्या मैं देख रहा हूँ है:

  • नो-विन्यास (सरल API कॉल के अलावा)। मैं बाह्य विन्यास फाइलों के साथ गड़बड़ नहीं करना चाहता क्योंकि वे सिर्फ तैनाती को जटिल करते हैं।
  • समान प्रक्रिया (कुछ बाहरी प्रक्रिया या सर्वर नहीं)। अधिमानतः के रूप में आसानी
    var myCache = new SimpleCache(1024 * 1024 * 100); // 100 MB
  • निर्दिष्ट मेमोरी सीमा के रूप में बनाया
  • आइटम कम से कम उपयोग
  • समय आधारित समाप्ति के आधार पर कैश से मंजूरी दे दी (आवश्यक नहीं है, लेकिन यह संभवत: अन्य स्थितियों में उपयोगी बनाता है)
  • वर्क्स के साथ

      : नेट 3,5

    मैं पहले से ही इन विकल्पों reasearched है

  • एएसपी.Net System.Web.Caching
    • इसका एपीआई कैश के आकार पर किसी भी प्रकार के नियंत्रण का समर्थन नहीं करता है, न ही उपयोग के आधार पर प्राथमिकता। नतीजतन आप पूरी तरह से अपनी दया पर हैं जब यह तय करता है कि कैश को खाली करने के लिए पर्याप्त स्मृति दबाव है।
  • System.Runtime.Caching
    • इस के रूप में एक विकल्प नेट 4.0 में जोड़ा गया है नहीं, और इस पोस्ट यह खराब प्रदर्शन है में इंगित करता है: Performance of system.runtime.caching
  • माइक्रोसॉफ्ट उद्यम लाइब्रेरी - कैशिंग ब्लॉक
    • हेवीवेट होने की प्रतिष्ठा के अलावा, मुझे XML फ़ाइलों या app.config का उपयोग करके इसकी कॉन्फ़िगरेशन पसंद नहीं है। इसके अलावा, जब यह संग्रहित वस्तुओं की संख्या के आधार पर कैश के आकार को सीमित करने का समर्थन करता है, तो इसमें उन वस्तुओं के SIZE को सीमित करने के लिए तंत्र नहीं होते हैं।
  • NCache
    • शायद उपयोग के मामले मैं चाहता हूँ के लिए overkill है, लेकिन सबसे महत्वपूर्ण बात यह एक भुगतान उत्पाद है जो कुछ मैं के साथ मुझे सिर्फ एक दिन में एक लेखन की तुलना के साथ सौदा (क्या करना चाहते हैं नहीं है या दो)। हमेशा की तरह, इसके व्यक्त संस्करण में उपयोग सीमाएं किसी भी उत्पादन उद्देश्यों के लिए अपने उपयोग को हतोत्साहित करती हैं।
  • memcached
    • जो मैं चाहता (बाहरी वितरित प्रक्रिया)

मैं Google प्रोटोकॉल बफ़र (Protobuf शुद्ध) के साथ काम कर रहा हूँ, तो मैं क्या एक है की सटीक विपरीत प्रत्येक आइटम की स्मृति पदचिह्न के अपेक्षाकृत सटीक अनुमान। मैं डाटाबेस एक्सेस से लौटाए गए डेटा को कैशिंग कर रहा हूं, लेकिन मुझे औपचारिक ओआरएम का उपयोग करने की कोई इच्छा नहीं है (मैं वास्तव में पेटापोको का उपयोग कर रहा हूं, लेकिन यह बिंदु के बगल में है)।

इस चरण में मैं एक डबल लिंक्ड सूची और हैश (शब्दकोश) का उपयोग करके अपने स्वयं के कैश को लागू करने की योजना बना रहा हूं, ताकि कैश सीमा तक पहुंचने के बाद हाल ही में कैश से उपयोग की जाने वाली वस्तुओं को छोड़ने के लिए उपलब्ध कराया जा सके। हालांकि, मैं यह देखने के लिए जांचना चाहता था कि क्या मुझे अपना खुद का लुत्फ उठाने से पहले किसी भी उपयुक्त विकल्प के बारे में पता था।

+1

यह कभी आसान नहीं है, एक अच्छी समाप्ति नीति के बिना एक कैश एक स्मृति रिसाव है। जो उपलब्ध है उसे पसंद नहीं करना हमेशा अपना खुद का निर्माण करने के लिए प्रेरणा संख्या एक है। –

+0

एक समाप्ति नीति के बजाय, मैं इसे अधिकतम मेमोरी निर्दिष्ट करना चाहता हूं। आप वास्तव में माप नहीं सकते कि नेट में कितनी मेमोरी ऑब्जेक्ट्स ले रही हैं, लेकिन प्रोटोकॉल बफर का उपयोग मैं कर रहा हूं, इसका एक उपयोगी उपयोगी माप है। –

+0

यदि आप इसे एक सामान्य जेनेरिक कैश के रूप में विकसित करते हैं, तो शायद आप इसे कोडप्रोजेक्ट या जैसे, दूसरों के उपयोग के लिए रख सकते हैं? एक साधारण प्रोटोटाइप को एक साथ प्राप्त करने के लिए काफी सरल होना चाहिए और उच्च परीक्षण कवरेज प्राप्त करना बहुत आसान होना चाहिए। – Michael

उत्तर

1

विंडोज सर्वर के लिए ऐपफ़ैब्रिक में कैशिंग सुविधाओं के बारे में क्या? कोशिश करो ! http://msdn.microsoft.com/en-us/windowsserver/ee695849.aspx और http://msdn.microsoft.com/en-us/library/hh334364.aspx

लेकिन यदि वांछित व्यवहार प्रदान करने वाले बाजार पर कोई उत्पाद नहीं है, तो आपको डिज़ाइन पैटर्न का उपयोग करके अपनी कस्टम कैशिंग परत लागू करना होगा।

+0

अच्छी अवधारणा, मैं इसे पहले से ही प्यार करता हूँ! +1! –

+0

यह एक ऐसा विकल्प देखना अच्छा लगता है जिसे मैंने पहले ही नहीं माना था, और यह भी अच्छा है कि यह XML कॉन्फ़िगरेशन की दिशा में तैयार दिखता है, लेकिन इसके समकक्ष प्रोग्रामेटिक कॉन्फ़िगरेशन विकल्प हैं। हालांकि, यह वह नहीं है जिसे मैं ढूंढ रहा हूं क्योंकि यह स्मृति उपयोग के आधार पर सीमित करने के लिए कोई क्षमता प्रदान नहीं करता है। ऑब्जेक्ट गिनती से कैश को सीमित करना बेकार है क्योंकि ये वस्तुएं 1 केबी प्रत्येक या 1 जीबी उपभोग करने वाली तनाव का जड़ हो सकती हैं। –

1

यह काफी पुराना है, लेकिन मैं जैसा दिखता है क्या आप के बारे

Generic cache with memory consumption

बात कर रहे हैं और यहाँ एक प्रासंगिक परिदृश्य के साथ एक और एसओ है:

performance of system runtime caches

+0

+1 क्योंकि यह वास्तव में वह लेख है जिसे मैंने दो महीने पहले पढ़ा था, जिसने अपना खुद का डिजाइन करने के लिए आधार प्रदान किया था। मैंने पूर्ण स्रोत कोड नहीं देखा है, लेकिन लेख एक अच्छा प्रारंभिक बिंदु था। –

3

तो आप क्या खत्म किया कैश के साथ कर रहे हैं?

मेरे पास यूनिवर्सल कैश का प्रोटोटाइप है जो मैं उस पर काम कर रहा था जो कैश सीमा को छोड़कर बहुत अधिक करता है, कैश सीमा को स्मृति उपयोग के बजाय क्षमता (आइटम की संख्या) के अलावा है, लेकिन इसमें एक अतिरिक्त सुविधा है जिसे आप सराहना कर सकते हैं: स्थानीय दृढ़ता

कैश परत द्वारा संरचित है जहां आपके पास एक परत हो सकती है: स्मृति, एक डबल परत: मेमोरी + स्थानीय दृढ़ता, या एक तिहरा परत: स्मृति + स्थानीय दृढ़ता + नेटवर्क साझाकरण। आप परतों के किसी भी संयोजन का उपयोग कर सकते हैं जैसा आपको चाहिए। यद्यपि नेटवर्क साझाकरण जिसे नेट पर रीमोटिंग सेवा के रूप में डिज़ाइन किया गया है जिसे नेटवर्क पर किसी भी कंप्यूटर पर स्थापित किया जा सकता है और क्लाइंट कैश द्वारा स्वयं-खोज योग्य है अभी तक काफी कार्यात्मक नहीं है।

कैश सामान्य इंटरफ़ेस आईसीएएच < टीकेई, टीवीएयू > के माध्यम से जेनेरिक कक्षाएं एक्सेस की जाती हैं। स्थानीय निरंतर कैश एसक्यूएल एक्सप्रेस कॉम्पैक्ट 4 का उपयोग ऑन-द-फ्लाई डेटाबेस और टेबल बनाने के लिए करता है जिसमें आपके टीकेई, टाइमस्टैम्प के सभी फ़ील्ड्स और एक टीवी कॉल्यू होता है जिसे छवि कॉलम के रूप में क्रमबद्ध किया जाता है। एकाधिक परत कॉन्फ़िगरेशन के मामले में, जब आप शीर्ष स्तर कैश पर TryGetValue (TKey कुंजी, आउट टीवी आउट्यू मान) विधि का उपयोग करते हैं, यदि पहली परत (मेमोरी कैश) में आइटम नहीं है तो यह आंतरिक परत को आंतरिक परत के साथ जांचता है (स्थानीय निरंतर), फिर अगला ... डेटा प्रदान करने के लिए अब तक कोई कैश उपलब्ध नहीं है। जब मेमोरी कैश किसी आइटम को त्याग देता है, तो अगली कैश को ऑब्जेक्ट को आइटम को अपनी परत में जोड़ने की अनुमति देता है ताकि लगातार कैश के मामले में डेटा भविष्य के अनुरोधों के लिए संग्रहीत हो।

कैश का उपयोग-परिभाषित प्रतिधारण समय पैरामीटर होता है (यानी मेमोरी कैश के लिए कुछ मिनट, स्थानीय लगातार कैश के लिए 30 दिन) और क्षमता।

यदि कोई दिलचस्पी लेता है तो मैं इसे सार्वजनिक डोमेन कोड के रूप में पोस्ट कर सकता हूं।

+2

आपको जिस कोड का उल्लेख आपने यहां दिया है उसे पोस्ट करना चाहिए। –

0

MemoryCache और यह आलेख मेमोरी कैश का उपयोग करने के बारे में CodeProject पर जांचें।

+0

क्या यह 3.5 के साथ काम करेगा? यह 4.0 ढांचा प्रतीत होता है। –