2012-09-26 9 views
18

मैं डब्ल्यूसीएफ सेवा के लिए अनुरोध स्तर पर कैशिंग लागू करने की तलाश में हूं। इस सेवा के लिए प्रत्येक अनुरोध बड़ी संख्या में डेटाबेस कॉल करता है। एकाधिक डेटा कलेक्टरों को सोचें। हमें एक डेटा कलेक्टर को पिछले डेटा कलेक्टर द्वारा पहले से प्राप्त जानकारी तक पहुंचने की अनुमति देने की आवश्यकता है।मेमोरी कैश या समवर्ती शब्दकोश?

मैं अनुरोध के अनुसार एक विशिष्ट उदाहरण बनाकर इस के लिए नए नेट 4.0 मेमोरी कैश का उपयोग करने के देख रहा था।

यह एक अच्छा विचार है? या मुझे बस एक शब्दकोश वस्तु का उपयोग करना चाहिए?

Btw: डेटा संग्रह समानांतर में होने जा रहा है, इसलिए वहाँ ताला लगा चारों ओर अधिक जटिलताओं हो जाएगा, लेकिन मैं रूप में अच्छी तरह उस के लिए समवर्ती संग्रह इस्तेमाल कर सकते हैं।

+0

अद्यतन पाया जा सकता है - मैं समवर्ती संग्रह का उपयोग करने के क्योंकि उस मॉडल एक प्रणाली के स्तर मेमोरी कैश की तुलना में बेहतर की जरूरत है मेरी तय कर लिया है। –

+0

जैसा कि मैं मेमोरी कैश क्लास को समझता हूं, यह एक प्रक्रिया स्तर कैश है .. – Legends

+0

या यहां तक ​​कि ऐपडोमेन स्तर, ने इसका परीक्षण नहीं किया है। – Legends

उत्तर

25

आप समाप्ति तर्क किसी तरह की जरूरत नहीं है, मैं समवर्ती संग्रह का उपयोग कर सुझाव है। आप आसानी से single entry caching mechanismConcurrentDictionary और Lazy कक्षाओं को संयोजित कर सकते हैं। आलसी और ConcurrentDictionary संयोजन के बारे में another लिंक है।

यदि आपको अपने आइटम की समयसीमा समाप्त करने की आवश्यकता है, तो आप कैश आइटम्स के एकल पुनर्प्राप्ति की गारंटी के लिए अंतर्निहित मेमोरी कैश का उपयोग करें और double-checked locking pattern लागू करें। एक डबल जाँच की लॉकिंग के कार्यान्वयन जाने के लिए तैयार में Locking pattern for proper use of .NET MemoryCache

+0

ठीक है - मैं एक ही पंक्ति पर सोच रहा था, लेकिन मुझे अभी भी "क्यों?" समझ में नहीं आता इसका मेमोरी कैश मुझे कुछ कैश विशिष्ट कार्यों जैसे AddOrGet प्रदान करता है। जब मैं समवर्ती संग्रह में जाता हूं तो मैं हार जाऊंगा। क्या समाप्ति कार्यक्षमता समवर्ती संग्रह बनाम MemoryCache के बीच चयन करने का एकमात्र कारण है? –

+1

@zync Lazy के साथ ConcurrentDictionary का उपयोग करने का विचार यह सुनिश्चित करना है कि आप प्रति एप्लिकेशन डोमेन में एक बार कैश आइटम पुनर्प्राप्त करें और आप उन्हें कभी नहीं बदलते। यदि ऐसा नहीं है तो मेमोरी कैश बेहतर है। हालांकि अगर आपको सिंगल एंट्री पुनर्प्राप्ति तर्क की आवश्यकता है, तो ConcurrentDictionary का उपयोग करना अधिक उचित है क्योंकि MemoryCache.AddOrGetExisting विधि को एक मान की आवश्यकता है और आपको अभी भी इस मान को पुनर्प्राप्त करते समय लॉकिंग लागू करना होगा। लेकिन ConcurrentDictionary.GetOrAdd (TKey कुंजी, Func valueFactory) के साथ आलसी के साथ मिलकर, आप सभी लॉकिंग सामान को फ्रेमवर्क लाइब्रेरी में छोड़ देते हैं। –

+3

वैसे अगर आपके कैश आइटम पहले अच्छी तरह से अपनी सेवाओं को शुरू (यानी आप गतिशील रूप से कैश नहीं है) और परिभाषित कर रहे हैं आप एक बार कैश में सभी डेटा लोड हो रहा tolarate कर सकते हैं, तो आप उन कैश आइटम लोड करने के लिए आपकी सेवा वर्गों के स्थिर निर्माता का उपयोग कर सकते । यह बेहतर है क्योंकि स्थाई रचनाकारों को प्रति आवेदन डोमेन में एक बार निष्पादित करने की गारंटी दी जाती है और किसी भी प्रकार के कन्स्ट्रक्टर को उस प्रकार से निष्पादित करने से पहले। यह आसान है। –

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