दिलचस्प पोस्ट
प्रिंट () का उपयोग करते हुए वर्ग या ऑब्जेक्ट की कक्षा कैसे मुद्रित करें? ई-मेल बॉडी में एक छवि कैसे जोड़ें Internet Explorer 8 में "मार्जिन: 0 ऑटो;" का उपयोग करना हाइबरनेट 4.30 के साथ वसंत 4.0.0 की संगतता क्या यह एक ही थ्रेड पर दो बार प्रारंभ विधि को कॉल करने के लिए कानूनी है? रूबी में प्रतीकों को कैसे समझें डाटाबेस स्कीमा जो विशेष गुणों का समर्थन कर सकती है बहुत बड़ी 'एन' के लिए नौवें फाइबोनैचि संख्या खोजना MongoDB 3.0 में 'सॉकेट फ़ाइल अनलिंक करने में विफल' त्रुटि इसका अर्थ यह है कि वैश्विक नामस्थान प्रदूषित होगा? स्वयं के बीच अंतर और बस var PHP: टाइमस्टैम्प से सापेक्ष तिथि / समय का उत्पादन ट्रैश, नई Google ड्राइव एंड्रॉइड एपीआई में हटाएं? एक डबल की स्ट्रिंग फ़ॉर्मेटिंग ऑब्जेक्ट को हटाया नहीं जा सकता क्योंकि यह ऑब्जेक्टस्टेट मैनेजर में नहीं मिला था

डब्लूसीएफ में कैशिंग?

मैं एक WCF सेवा का निर्माण कर रहा हूँ मुझे संदर्भ डेटा को कैश में संग्रहीत करने की आवश्यकता है, जिसे मैं विधि से इनपुट प्राप्त हर बार देखूंगा … यह करने का सही तरीका क्या है? मैं कैश के लिए एक समाप्ति नीति को भी परिभाषित करना चाहूंगा जो एक निश्चित समय अंतराल के बाद इसे रद्द कर देगा।

Solutions Collecting From Web of "डब्लूसीएफ में कैशिंग?"

यदि आप .NET 4 का उपयोग कर रहे हैं, तो मेमोरीकैच का उपयोग करने का सुझाव दिया गया है

कोई भी कैशिंग समाधान दो बुनियादी समस्याओं को हल करना चाहिए

1) कैश आइटम और पुनर्प्राप्ति का भंडारण

2) कैश अमान्यकरण

चूंकि एचटीटीपी कैशिंग एक अच्छी तरह से ज्ञात है इसलिए मैं विस्तार से इसकी व्याख्या नहीं कर रहा हूं। आप कुछ वेब कॉन्फ़िगरेशन के साथ अकेले एप संगतता विशेषता का उपयोग कर सकते हैं, जहां आप आकर्षण से कैशिंग करेंगे

[AspNetCacheProfile("MyProfile")] public Customer GetName(string id) { // ... } 

और वेब कॉन्फ़िग की तरह है

 <system.serviceModel> <serviceHostingEnvironment aspNetCompatibilityEnabled="true" /> </system.serviceModel> <system.web> <caching> <outputCacheSettings> <outputCacheProfiles> <add name=" MyProfile" duration="600" varyByParam="none" sqlDependency="MyTestDatabase:MyTable"/> </outputCacheProfiles> </outputCacheSettings> </caching> </system.web> 

लेकिन यह ज्यादातर परिदृश्यों के लिए उपयुक्त नहीं है, खासकर जब आपके पास बड़ी जटिल ऑब्जेक्ट कैश है। उदाहरण के लिए मेरे पास ऐसी स्थिति थी जहां मैं एक सिस्टम जनरेटेड छवि को कैश करना चाहता था (ऑपरेशन अनुबंध का आउटपुट एक सिस्टम निर्मित छवि है जो इनपुट पर निर्भर करता है)। ऐसे मामले में, आपको अपना कैश लागू करना होगा। मैंने माइक्रोसॉफ्ट एंटरप्राइज लाइब्रेरी कैशिंग ब्लॉकों का इस्तेमाल किया है जो मेरी सभी कैशिंग स्टोरेज आवश्यकताओं को संबोधित करता है। हालांकि, आपको अभी भी डब्ल्यूसीएफ सेवा के साथ माइक्रोसॉफ्ट एंटरप्राइज लाइब्रेरी कैशिंग ब्लॉक को एकीकृत करने के लिए प्लंबिंग करने की आवश्यकता है। पहले आपको कैश को लागू करने के लिए WCF संचार चैनल को रोकना होगा। WCF संचार चैनल को कैसे रोकना चाहिए की एक विस्तृत चर्चा http://msdn.microsoft.com/en-us/magazine/cc163302.aspx पर पाई जा सकती है। ऐसा है कि आप WCF कैशिंग के लिए प्लंबिंग कैसे करते हैं

बुनियादी नलसाजी वास्तुकला

चरण 0 मान लें कि आपके पास एक ऑपरेशन अनुबंध है और आप उस विधि से आइटम वापसी को कैश करना चाहते हैं।

 [OperationContract] MyCompositeClass Rotate(int angle) 

चरण 1 पहले आपको WCF पाइपलाइन में अपने कस्टम केचर को पंजीकृत करना होगा। ऐसा करने के लिए मैं एक विशेषता का उपयोग करने जा रहा हूं जिससे कि मैं पहलू उन्मुख प्रोग्रामिंग सिद्धांतों के अनुसार अपने WCF कॉल को अच्छी तरह से सज सकता हूं।

 using System; using System.ServiceModel.Description; using System.ServiceModel.Channels; using System.ServiceModel.Dispatcher; using System.Reflection; [AttributeUsage(AttributeTargets.Method)] public class MyCacheRegister : Attribute, IOperationBehavior { ConstructorInfo _chacherImplementation; public ImageCache(Type provider) { if (provider == null) { throw new ArgumentNullException("Provider can't be null"); } else if (provider.IsAssignableFrom(typeof(IOperationInvoker))) { throw new ArgumentException("The type " + provider.AssemblyQualifiedName + " does not implements the interface " + typeof(IOperationInvoker).AssemblyQualifiedName); } else { try { Type[] constructorSignatureTypes = new Type[1]; constructorSignatureTypes[0] = typeof(IOperationInvoker); _chacherImplementation = provider.GetConstructor(constructorSignatureTypes); } catch { throw new ArgumentException("There is no constructor in " + provider.AssemblyQualifiedName + " that accept " + typeof(IOperationInvoker).AssemblyQualifiedName + " as a parameter"); } } } public void AddBindingParameters(OperationDescription operationDescription, BindingParameterCollection bindingParameters) { return; } public void ApplyClientBehavior(OperationDescription operationDescription, ClientOperation clientOperation) { return; } /// <summary> /// Decorate the method call with the cacher /// </summary> public void ApplyDispatchBehavior(OperationDescription operationDescription, DispatchOperation dispatchOperation) { //decorator pattern, decorate with a cacher object[] constructorParam = new object[1]; constructorParam[0] = dispatchOperation.Invoker; dispatchOperation.Invoker = (IOperationInvoker)_chacherImplementation.Invoke(constructorParam); } public void Validate(OperationDescription operationDescription) { return; } } 

चरण 2

फिर आपको उस बिंदु को कार्यान्वित करना होगा जहां कैश ऑब्जेक्ट पुनर्प्राप्त किया जाएगा।

 using System; using System.ServiceModel.Dispatcher; using Microsoft.Practices.EnterpriseLibrary.Caching; using Microsoft.Practices.EnterpriseLibrary.Common; using System.IO; class RotateCacher : IOperationInvoker { private IOperationInvoker _innerOperationInvoker; public RotateImageCacher(IOperationInvoker innerInvoker) { _innerOperationInvoker = innerInvoker; } public object[] AllocateInputs() { Object[] result = _innerOperationInvoker.AllocateInputs(); return result; } public object Invoke(object instance, object[] inputs, out object[] outputs) { object result=null; ///TODO: You will have more object in the input if you have more ///parameters in your method string angle = inputs[1].ToString(); ///TODO: create a unique key from the inputs string key = angle; string provider = System.Configuration.ConfigurationManager.AppSettings["CacheProviderName"]; ///Important Provider will be DiskCache or MemoryCache for the moment provider =”DiskCache”; ///TODO: call enterprise library cache manager, You can have your own /// custom cache like Hashtable ICacheManager manager = CacheFactory.GetCacheManager(provider); if (manager.Contains(key)) { result =(MyCompositeClass) manager[key]; } else { result =(MyCompositeClass) _innerOperationInvoker.Invoke(instance, inputs, out outputs); manager.Add(key, result); } return result; } public IAsyncResult InvokeBegin(object instance, object[] inputs, AsyncCallback callback, object state) { IAsyncResult result = _innerOperationInvoker.InvokeBegin(instance, inputs, callback, state); return result; } public object InvokeEnd(object instance, out object[] outputs, IAsyncResult asyncResult) { object result = _innerOperationInvoker.InvokeEnd(instance, out outputs, asyncResult); return result; } public bool IsSynchronous { get { return _innerOperationInvoker.IsSynchronous; } } } 

चरण 3

अंत में अपने गुण को अपनी सेवा कॉल से ऊपर जोड़ें

 [OperationContract] [MyCacheRegister(typeof(RotateCacher)] MyCompositeClass Rotate(int angle) 

एंटरप्राइज़ लाइब्रेरी कैशिंग ब्लॉक का कॉन्फ़िगरेशन इस उत्तर के दायरे से परे है। आप इसे जानने के लिए निम्नलिखित लिंक का उपयोग कर सकते हैं। एंटरप्राइज़ लाइब्रेरी के बारे में अच्छी बात यह है कि आप अपनी कैशिंग नीति का विस्तार करने के लिए तैयार किए गए तरीके प्राप्त करते हैं। यह कैश एक्सपायरी और स्टोरेज के लिए तरीके में बनाया गया है आप अपनी कैश समाप्ति और संग्रहण नीतियों को भी लिख सकते हैं। http://www.codeproject.com/KB/web-cache/CachingApplicationBlock.aspx

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

 <configSections> <section name="cachingConfiguration" type="Microsoft.Practices.EnterpriseLibrary.Caching.Configuration.CacheManagerSettings, Microsoft.Practices.EnterpriseLibrary.Caching, Version=5.0.414.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" requirePermission="true" /> </configSections> <cachingConfiguration defaultCacheManager="Cache Manager"> <cacheManagers> <add name="MemoryCache" type="Microsoft.Practices.EnterpriseLibrary.Caching.CacheManager, Microsoft.Practices.EnterpriseLibrary.Caching, Version=5.0.414.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" expirationPollFrequencyInSeconds="60" maximumElementsInCacheBeforeScavenging="1000" numberToRemoveWhenScavenging="10" backingStoreName="NullBackingStore" /> <add name="DiskCache" type="Microsoft.Practices.EnterpriseLibrary.Caching.CacheManager, Microsoft.Practices.EnterpriseLibrary.Caching, Version=5.0.414.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" expirationPollFrequencyInSeconds="60" maximumElementsInCacheBeforeScavenging="1000" numberToRemoveWhenScavenging="10" backingStoreName="IsolatedStorageCacheStore" /> </cacheManagers> <backingStores> <add type="Microsoft.Practices.EnterpriseLibrary.Caching.BackingStoreImplementations.NullBackingStore, Microsoft.Practices.EnterpriseLibrary.Caching, Version=5.0.414.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" name="NullBackingStore" /> <add name="IsolatedStorageCacheStore" type="Microsoft.Practices.EnterpriseLibrary.Caching.BackingStoreImplementations.IsolatedStorageBackingStore, Microsoft.Practices.EnterpriseLibrary.Caching, Version=5.0.414.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" encryptionProviderName="" partitionName="MyCachePartition" /> </backingStores> </cachingConfiguration> 

आप वेग पर एक नज़र डाल सकते हैं यह माइक्रोसॉफ्ट के इन-मेमोरी कैशिंग ढांचे को वितरित किया गया है। लेकिन यह थोड़ा बीटा हो सकता है …

यदि आप एक लोड संतुलित, स्टेटलेस सिस्टम में एक से अधिक सर्वर पर स्केलिंग कर रहे हैं, तो आप एक वितरित कैश के उपयोग के लिए डिजाइन करना चाहते हैं। यहाँ करने के लिए मुख्य चीजें हैं:

  1. एक स्थानीय और वितरित कैश दोनों का उपयोग करें। केवल वितरित कैश में सत्र या अल्पावधि सामान डालें, स्थानीय रूप से अन्य सामान कैश

  2. आइटम के लिए उचित समय-सीमा निर्धारित करें यह जानकारी के प्रकार के आधार पर अलग-अलग हो जाएगा और यह स्रोत के करीब कितनी आवश्यकता है

  3. कैश से सामान निकालें जब आपको पता चलेगा कि यह असंवेदनशील होगा (अपडेट, हटाए जाने आदि)।

  4. अद्वितीय कैश कुंजी डिजाइन करने के लिए ध्यान रखना ऐसी जानकारी के मॉडल का निर्माण करें जिसे आप कैश करने की योजना बनाते हैं और इसका उपयोग उस कुंजी के निर्माण के लिए टेम्पलेट के रूप में करते हैं।

आप System.Web.Cache का प्रयोग कर सकते हैं (भले ही आप वेब संदर्भ में नहीं हैं), और यही है कि मैं क्या करूँगा यह मूलतः एक बड़ा है, मेमोरी हैश तालिका में सामग्री समाप्त करने के लिए कुछ नक्सलियों के साथ।

आप ऐसा कर सकते हैं कई तरीके हैं एक बहुत ही आसान है System.Web.Cache ऑब्जेक्ट को होस्ट करने के लिए और संदर्भ डेटा को संग्रहीत करने के लिए इसका इस्तेमाल करना है। यहां का एक अच्छा उदाहरण है: http://kjellsj.blogspot.com/2007/11/wcf-caching-claims-using.html

WCF REST स्टार्टर किट कैशिंग है, यहां इसका उपयोग करने के बारे में एक लेख है … नमूना कोड के साथ।

http://weblogs.asp.net/gsusx/archive/2008/10/29/adding-caching-to-wcf-restful-services-using-the-rest-starter-kit.aspx

हर बार कैश डेटा को समाप्त करने के बजाय, आप वास्तव में यह सुनिश्चित कर सकते हैं कि कैश को रद्द कर दिया जाए, जब भी अंतर्निहित डेटा आप परिवर्तन कैशिंग कर रहे हों

जानकारी क्यू http://www.infoq.com/news/2011/04/Attribute-Caching से यह उदाहरण देखें

 [Cache.Cacheable("UserTransactionCache")] public DataTable GetAllTransactionsForUser(int userId) { return new DataProvider().GetAllTransactionsForUser(userId); } [Cache.TriggerInvalidation("UserTransactionCache")] public void DeleteAllTransactionsForUser(int userId) { ... }