मैंने अपने अनुप्रयोगों में से एक में कैशिंग मुखौटा लागू करने का निर्णय लिया है - इसका उद्देश्य अंततः नेटवर्क ओवरहेड को कम करना और डीबी हिट की मात्रा को सीमित करना है। हम Castle.Windsor
का उपयोग हमारे IoC Container
के रूप में कर रहे हैं और हमने System.Runtime.Caching
नामस्थान का उपयोग करके हमारी सेवा परत के शीर्ष पर कैशिंग कार्यक्षमता जोड़ने के लिए Interceptors
के साथ जाने का निर्णय लिया है।विधि नाम और तर्क मानों के आधार पर कैश कुंजी निर्माण
इस समय मैं बिल्कुल सही नहीं समझ सकता कि cache key
बनाने के लिए सबसे अच्छा तरीका क्या है। लक्ष्य के लिए विभिन्न तरीकों के बीच एक अंतर बनाने के लिए है और यह भी पारित कर दिया तर्क मान शामिल - जिसका अर्थ है कि इन दो विधि कॉल दो अलग अलग चाबियाँ के तहत कैश्ड किया जाना चाहिए:
IEnumerable<MyObject> GetMyObjectByParam(56); // key1
IEnumerable<MyObject> GetMyObjectByParam(23); // key2
के लिए अब मैं दो संभव कार्यान्वयन देख सकते हैं:
विकल्प 1: असेंबली | कक्षा | विधि वापसी प्रकार | विधि का नाम | तर्क प्रकार | तर्क हैश कोड
"MyAssembly.MyClass IEnumerable<MyObject> GetMyObjectByParam(long) { 56 }";
विकल्प 2: MD5 या SHA-256 अभिकलन हैश विधि के पूरी तरह से योग्य नाम के आधार पर और पारित तर्क को महत्व देता
string key = new SHA256Managed().ComputeHash(name + args).ToString();
मैं के बारे में सोच रहा हूँ दूसरे विकल्प के रूप में पहला विकल्प अधिक प्रसंस्करण समय की आवश्यकता होती है - दूसरी ओर दूसरा विकल्प सभी जेनरेट की गई कुंजी की बिल्कुल 'लंबाई' को लागू करता है।
क्या यह मानना सुरक्षित है कि पहला विकल्प जटिल तर्क प्रकारों का उपयोग करके विधियों के लिए एक अद्वितीय कुंजी उत्पन्न करेगा? या शायद ऐसा करने का एक बिल्कुल अलग तरीका है?
सहायता और राय अत्यधिक सराहना की जाएगी!
हाय पैट्रिक, दो कारण हैं कि मैं 'विकल्प 1' के साथ क्यों नहीं गया - सबसे पहले, कभी-कभी मैं काफी बड़ी पदानुक्रमित वस्तुओं का उपयोग कर रहा हूं जो मुख्य निर्माण के दौरान * तेजी से पर्याप्त * क्रमबद्ध करना मुश्किल है - और अन्य परिदृश्यों में मुझे एहसास हुआ है कि वास्तव में समान मानों को वापस करने के लिए 'String.GetHashCode' विधि के लिए असंभव नहीं है। यही कारण है कि मैंने एक कक्षा लागू की है जो * ठीक से * 'गेटहाशकोड' और 'समान' विधियों को ओवरराइड करता है और अंततः संभावित टकराव का समाधान करता है। मैं आपको सही दिशा में ले जाने के लिए एक +1 दे रहा हूं :) – MonkeyCoder