জোন ডেভিস এর নিবন্ধ এখানে। পঠনযোগ্যতা সংরক্ষণের জন্য, আমি এখন অপ্রচলিত এন্টলিব বিভাগ, পরিচয়ের পাশাপাশি উপসংহারটি কেটে দিচ্ছি।
এএসপি.নেট ক্যাশে
ASP.NET, বা System.Web.dll সমাবেশে একটি ক্যাশিং ব্যবস্থা আছে। এটি কখনও কখনও ওয়েব প্রসঙ্গে বাইরে ব্যবহার করার ইচ্ছা ছিল না, তবে এটি ওয়েবের বাইরেও ব্যবহার করা যেতে পারে এবং এটি উপরের মেয়াদোত্তীর্ণ আচরণগুলি হ্যাশটেবলের মতোভাবে সম্পাদন করে।
গুগলকে ধমক দেওয়ার পরে দেখা যাচ্ছে যে .NET-তে অন্তর্নির্মিত ক্যাচিং কার্যকারিতা নিয়ে আলোচনা করেছেন এমন বেশ কয়েক জন লোক তাদের অ-ওয়েব প্রকল্পগুলিতে এএসপি.এনইটি ক্যাশে ব্যবহার করতে অবলম্বন করেছেন। এটি আর .NET- এ সর্বাধিক উপলভ্য, সর্বাধিক সমর্থিত বিল্ট-ইন ক্যাচিং সিস্টেম নয়; .NET 4 এর একটি অবজেক্ট ক্যাশে রয়েছে যা আমি পরে যাব। মাইক্রোসফ্ট সর্বদা অবিচল ছিল যে এএসপি.এনইটি ক্যাশে ওয়েবের বাইরে ব্যবহারের উদ্দেশ্যে নয়। কিন্তু অনেক লোক এখনও। নেট 2.0 এবং .NET 3.5 এ আটকে আছে এবং এর সাথে কাজ করার জন্য কিছু দরকার এবং এমএসডিএন স্পষ্টভাবে বলেছে যে, অনেক লোকের পক্ষে এটি কাজ করা হয়:
দ্রষ্টব্য: ক্যাশে শ্রেণি ASP.NET অ্যাপ্লিকেশনগুলির বাইরে ব্যবহারের জন্য নয়। ওয়েব অ্যাপ্লিকেশনগুলির জন্য ক্যাচিং সরবরাহ করতে এটি এএসপি.এনইটি-তে ব্যবহারের জন্য ডিজাইন ও পরীক্ষিত হয়েছিল। অন্যান্য ধরণের অ্যাপ্লিকেশনগুলিতে, যেমন কনসোল অ্যাপ্লিকেশন বা উইন্ডোজ ফর্ম অ্যাপ্লিকেশনগুলিতে, এএসপি.নেট ক্যাশিং সঠিকভাবে কাজ না করে।
ASP.NET ক্যাশের ক্লাস হ'ল System.Web.dll এ System.Web.Cach.Cache। তবে আপনি কেবল একটি ক্যাশে অবজেক্টটি নতুন করে আপ করতে পারবেন না। আপনাকে অবশ্যই এটি System.Web.HttpRuntime.Cache থেকে অর্জন করতে হবে।
Cache cache = System.Web.HttpRuntime.Cache;
এএসপি.এনইটি ক্যাশে নিয়ে কাজ করা এখানে এমএসডিএন-তে নথিভুক্ত করা হয়েছে ।
পেশাদাররা:
- এটি অন্তর্নির্মিত ।
- .NET 1.0 সিনট্যাক্স সত্ত্বেও এটি ব্যবহার করা মোটামুটি সহজ ।
- যখন কোনও ওয়েব প্রসঙ্গে ব্যবহৃত হয়, এটি ভালভাবে পরীক্ষা করা হয় । মাইক্রোসফ্ট এর বিরুদ্ধে সুপারিশ করা সত্ত্বেও গুগল অনুসন্ধান অনুসারে গুগল অনুসন্ধান অনুসারে এটি সাধারণত সমস্যা সৃষ্টি করে বলে জানা যায় না যতক্ষণ আপনি .NET 2.0 বা তার পরে ব্যবহার করছেন।
- কোনও আইটেম সরানো হলে আপনাকে একটি প্রতিনিধি দ্বারা অবহিত করা যেতে পারে , এটি প্রয়োজন যদি আপনার এটি বাঁচিয়ে রাখতে হয় এবং আপনি আইটেমটির অগ্রাধিকার আগেই সেট করতে পারেন নি।
- পৃথক আইটেমগুলির (ক), (খ), বা (গ) মেয়াদোত্তীর্ণকরণ এবং অপসারণের পদ্ধতির যেকোনটির নমনীয়তা এই নিবন্ধটির শীর্ষে অপসারণ পদ্ধতির তালিকায় রয়েছে। আপনি একটি দৈহিক ফাইলের উপস্থিতির সাথে মেয়াদোত্তীর্ণ আচরণটিও যুক্ত করতে পারেন।
কনস:
- এটি কেবল স্থির নয়, কেবল একটিই রয়েছে । আপনি ক্যাশের নিজস্ব স্ট্যাটিক উদাহরণ দিয়ে নিজের ধরণের তৈরি করতে পারবেন না। আপনার পুরো অ্যাপ্লিকেশন, পিরিয়ডের জন্য কেবল একটি বালতি থাকতে পারে। আপনি বালতিটি আপনার নিজের মোড়কের সাথে মুড়ে রাখতে পারেন যা কীগুলিতে প্রাক-ইনজেক্ট উপসর্গের মতো কাজ করে এবং আপনি কী / মান জোড়গুলি পিছনে টেনে আনলে এই উপসর্গগুলি সরিয়ে ফেলতে পারেন। তবে এখনও একটি বালতি রয়েছে। সব কিছু একসাথে লম্পট হয়ে গেছে। এটি প্রকৃত উপদ্রব হতে পারে যদি উদাহরণস্বরূপ, আপনার কাছে এমন একটি পরিষেবা রয়েছে যা পৃথকভাবে তিন বা চারটি বিভিন্ন ধরণের ডেটা ক্যাশে করা দরকার। করুণভাবে সরল প্রকল্পগুলির জন্য এটি কোনও বড় সমস্যা হওয়া উচিত নয়। তবে যদি কোনও প্রকল্পের প্রয়োজনীয়তার কারণে কোনও জটিল ডিগ্রী থাকে তবে এএসপি.এনইটি ক্যাশে সাধারণত যথেষ্ট হবে না।
- আইটেমগুলি অদৃশ্য হয়ে যেতে পারে, উইলি-নিলি। এই ক্যাশে বাস্তবায়নে আমার জ্ঞানকে রিফ্রেশ না করা পর্যন্ত অনেক লোক এ সম্পর্কে অবগত নয় — আমি ছিলাম না। ডিফল্টরূপে, ASP.NET ক্যাশে আইটেমগুলিকে পছন্দ করে যখন এটি "অনুভব" করে তা ধ্বংস করার জন্য ডিজাইন করা হয়েছে। আরও সুনির্দিষ্টভাবে দেখুন (গ) এই নিবন্ধের শীর্ষে ক্যাশে টেবিলের আমার সংজ্ঞাতে। যদি একই প্রক্রিয়াতে থাকা অন্য একটি থ্রেড সম্পূর্ণ আলাদা কিছু নিয়ে কাজ করে এবং এটি উচ্চ-অগ্রাধিকারের আইটেমগুলিকে ক্যাশে ফেলে দেয়, তবে যত তাড়াতাড়ি। নেট সিদ্ধান্ত নিয়েছে যে এটির জন্য কিছু মেমরি প্রয়োজন এটি অনুসারে ক্যাশে কিছু আইটেম ধ্বংস করতে শুরু করবে to তাদের অগ্রাধিকারগুলি, নিম্ন অগ্রাধিকারগুলি প্রথমে। ক্যাশে আইটেম যুক্ত করার জন্য এখানে ডকুমেন্ট করা সমস্ত উদাহরণ নোট-অপসারণযোগ্য অগ্রাধিকার মানের চেয়ে ডিফল্ট অগ্রাধিকার ব্যবহার করে যা এটিকে মেমরি-সাফ করার উদ্দেশ্যে সরানো থেকে বিরত রাখে তবে সমাপ্তির নীতি অনুসারে এটিকে সরিয়ে ফেলবে।
- কীটি অবশ্যই একটি স্ট্রিং হওয়া উচিত। যদি উদাহরণস্বরূপ, আপনি ডেটা রেকর্ডগুলি ক্যাশে করছেন যেখানে রেকর্ডগুলি দীর্ঘ বা একটি পূর্ণসংখ্যার উপর কীড করা হয়, আপনাকে অবশ্যই প্রথমে কীটিকে একটি স্ট্রিংয়ে রূপান্তর করতে হবে।
- সিনট্যাক্স মামুলি হয় । এটি .NET 1.0 সিনট্যাক্স, অ্যারেলিস্ট বা হ্যাশটেবলের চেয়েও খারাপ। এখানে কোনও জেনেরিকস নেই, কোনও আইডোরিয়াইজ নেই <> ইন্টারফেস। এটিতে কোনও ধারণ () পদ্ধতি নেই, কোনও কী সংগ্রহ নেই, মানক ইভেন্ট নেই; এটিতে একটি গেট () পদ্ধতি এবং একটি সূচক রয়েছে যা গেট () এর মতো একই কাজ করে, মিল না থাকলে নাল ফেরায়, যোগ করুন (), সন্নিবেশ () (রিডানড্যান্ট?), সরান () এবং গেটইমুনিটার () ।
- আপনার ডিফল্ট মেয়াদোত্তীর্ণকরণ / অপসারণ আচরণ স্থাপনের DRY নীতি উপেক্ষা করে যাতে আপনি সেগুলি সম্পর্কে ভুলে যেতে পারেন। আপনি যে আইটেমটি যুক্ত করছেন তা কীভাবে আপনি মেয়াদ শেষ করতে চান বা প্রতিবার কোনও আইটেম যুক্ত করার সময় অপসারণ করতে চান তা আপনাকে স্পষ্টভাবে বলতে হবে।
- ক্যাশেড আইটেমের ক্যাশিং বিশদ যেমন অ্যাক্সেস করার উপায় নেই যেমন এটি কখন যুক্ত হয়েছিল তার টাইমস্ট্যাম্প। এনক্যাপসুলেশন এখানে কিছুটা ওভারবোর্ড হয়ে গেছে, কোডে যখন আপনি নির্ধারণ করার চেষ্টা করছেন যে ক্যাশেড আইটেমটি অন্য ক্যাশেিং ব্যবস্থার (যেমন অধিবেশন সংগ্রহ) বিরুদ্ধে বাতিল করা উচিত কিনা তা নির্ধারণ করার চেষ্টা করছেন তখন ক্যাশে ব্যবহার করা কঠিন হয়ে পড়ে।
- অপসারণ ইভেন্টগুলি ইভেন্ট হিসাবে প্রকাশিত হয় না এবং অ্যাডের সময়ে অবশ্যই তা ট্র্যাক করা উচিত।
- এবং যদি আমি এটি যথেষ্ট না বলে থাকি তবে মাইক্রোসফ্ট স্পষ্টতই ওয়েবের বাইরে এর বিরুদ্ধে সুপারিশ করে । এবং যদি আপনি .NET 1.1 এর সাথে অভিশাপিত হন তবে আপনাকে এটি ওয়েবের বাইরে কোনও স্থায়িত্বের আত্মবিশ্বাসের সাথে ব্যবহার করার কথা নয়, তাই বিরক্ত করবেন না।
.NET 4.0 এর অবজেক্টস ক্যাচ / মেমোরি ক্যাশে
মাইক্রোসফ্ট অবশেষে .NET ফ্রেমওয়ার্কের সর্বশেষ সংস্করণে একটি অ্যাবস্ট্রাক্ট অবজেক্ট ক্যাশে ক্লাস প্রয়োগ করেছে এবং একটি মেমোরি ক্যাশ বাস্তবায়ন যা অ-ওয়েব সেটিংয়ে ইন-মেমরির উদ্দেশ্যে অবজেক্টক্যাশ উত্তরাধিকারসূত্রে এবং প্রয়োগ করে।
সিস্টেম.রুনটাইম.ক্যাচিং.অবজেক্ট ক্যাশে সিস্টেম.আরুনটাইম.ক্যাচিং.ডিল অ্যাসেমব্লিতে রয়েছে। এটি একটি বিমূর্ত শ্রেণি যা মূলত একই .NET 1.0 স্টাইল ইন্টারফেসগুলি এএসপি.নেট ক্যাশে পাওয়া যায় বলে ঘোষণা করে। System.Runtime.Caching.MemoryCache
হ'ল অবজেক্ট ক্যাশের অন্তর্নিহিত বাস্তবায়ন এবং কয়েকটি পরিবর্তন সহ এএসপি.এনইটি ক্যাশের সাথে খুব মিল।
স্লাইডিংয়ের মেয়াদ শেষ হওয়ার সাথে সাথে কোনও আইটেম যুক্ত করতে, আপনার কোডটি এর মতো দেখতে লাগবে:
var config = new NameValueCollection();
var cache = new MemoryCache("myMemCache", config);
cache.Add(new CacheItem("a", "b"),
new CacheItemPolicy
{
Priority = CacheItemPriority.NotRemovable,
SlidingExpiration=TimeSpan.FromMinutes(30)
});
পেশাদাররা:
- এটি অন্তর্নির্মিত, এবং এখন ওয়েবের বাইরে মাইক্রোসফ্ট দ্বারা সমর্থিত এবং প্রস্তাবিত।
ASP.NET ক্যাশের বিপরীতে, আপনি একটি মেমোরি ক্যাশে অবজেক্ট ইনস্ট্যান্ট করতে পারেন।
দ্রষ্টব্য: এটি অচল থাকতে হবে না, তবে এটি হওয়া উচিত Microsoft এটি মাইক্রোসফ্টের সুপারিশ (হলুদ সতর্কতা দেখুন) ।
এএসপি.এনইটি ক্যাশের ইন্টারফেস, যেমন আইটেমগুলি যুক্ত করার পরে অগত্যা উপস্থিত না হয়ে অপসারণের ইভেন্টগুলিতে সাবস্ক্রাইব করার ক্ষমতা, রিডানড্যান্ট সন্নিবেশ () সরিয়ে দেওয়া হয়েছিল, আইটেমগুলি ক্যাশেআইটেমের সাথে যুক্ত করা যেতে পারে যেমন বনাম কয়েকটি হালকা উন্নতি করা হয়েছে vs একটি ইনিশিয়ালাইজারের সাথে অবজেক্ট যা ক্যাশে কৌশলটি সংজ্ঞায়িত করে এবং এতে () যুক্ত হয়েছিল।
কনস:
- তবুও ডিআরওয়াইকে পুরোপুরি শক্তিশালী করে না। আমার অল্প পরিমাণের অভিজ্ঞতা থেকে আপনি এখনও স্লাইডিংয়ের মেয়াদোত্তীর্ণ টাইমস্প্যানটি একবার সেট করতে পারবেন না এবং এটি ভুলে যাবেন না। এবং প্রকৃতপক্ষে, যদিও উপরের আইটেম-অ্যাড নমুনায় নীতিটি আরও পঠনযোগ্য, এটি ভয়াবহ ভার্বোসটির প্রয়োজন।
- এটি এখনও সাধারণভাবে চালিত নয়; এটির কী হিসাবে স্ট্রিং দরকার। সুতরাং আপনি স্ট্রিংতে রূপান্তর না করা আপনি যদি ডেটা রেকর্ডগুলি ক্যাশে করছেন তবে আপনি দীর্ঘ বা ইনট সংরক্ষণ করতে পারবেন না।
DIY: নিজেকে তৈরি করুন
স্পষ্ট বা স্লাইডিংয়ের মেয়াদোত্তীর্ণ কার্য সম্পাদন করে এমন একটি ক্যাচিং ডিকশনারি তৈরি করা আসলে খুব সহজ। (আপনি মেমরি-সাফ করার উদ্দেশ্যে আইটেমগুলিকে স্বয়ংক্রিয়ভাবে সরানো চাইলে এটি অনেক বেশি শক্ত হয়ে যায়)) আপনাকে যা করতে হবে তা এখানে:
- মেয়াদ উত্তীর্ণ বা মেয়াদোত্তীর্ণের মতো এমন একটি মান ধারক শ্রেণি তৈরি করুন যা টাইপের টি, মান ক্যাশে যুক্ত হওয়ার সময় সংরক্ষণের জন্য ডেটটাইম টাইপের একটি টাইমস্ট্যাম্প সম্পত্তি এবং একটি টাইমস্প্যান যা টাইমস্ট্যাম্প থেকে কতটা দূরে তা নির্দেশ করবে আইটেমটির মেয়াদ শেষ হবে। সুস্পষ্ট মেয়াদোত্তীর্ণতার জন্য আপনি কেবলমাত্র একটি সম্পত্তি সেটারকে প্রকাশ করতে পারেন যা টাইমস্ট্যাম্প দ্বারা বিয়োগের তারিখের সাথে টাইমস্প্যান সেট করে।
- একটি ক্লাস তৈরি করুন, আসুন একে এক্সপায়ারেবল আইটেমডোরিয়ান বলতে যাক, এটি আইডোরিয়াসটি কার্যকর করে। আমি এটি গ্রাহক দ্বারা সংজ্ঞায়িত করে জেনেরিক শ্রেণি তৈরি করতে পছন্দ করি।
- # 2-এ তৈরি ক্লাসে একটি অভিধান> একটি সম্পত্তি হিসাবে যুক্ত করুন এবং এটিকে ইনডারি ডিকোরিয়ান বলুন।
- # 2-এ তৈরি ক্লাসে আইডি অভিধান থাকলে বাস্তবায়ন ক্যাশেড আইটেমগুলিকে সঞ্চয় করতে ইনারড ডিকোরিয়ানোটি ব্যবহার করা উচিত। এনক্যাপসুলেশন উপরের # 1 তে তৈরি টাইপের উদাহরণগুলির মাধ্যমে ক্যাশে পদ্ধতি বিশদটি গোপন করবে।
- নিশ্চিত হয়ে নিন যে সূচক (এটি []), কন্টেনসকে () ইত্যাদি মেয়াদ উত্তীর্ণ হওয়া আইটেমগুলি সাফ করার জন্য এবং মূল্য ফেরানোর আগে মেয়াদোত্তীর্ণ আইটেমগুলি সরিয়ে ফেলার বিষয়ে সতর্কতা অবলম্বন করছে। আইটেমটি সরানো থাকলে getters মধ্যে নাল ফিরে।
- সমস্ত getters, setters, ContainsKey (), এবং বিশেষত মেয়াদোত্তীর্ণ আইটেম সাফ করার সময় থ্রেড লক ব্যবহার করুন।
- যখনই কোনও আইটেমের মেয়াদ শেষ হওয়ার কারণে মুছে ফেলা হবে তখন একটি ইভেন্ট উত্থাপন করুন।
- একটি সিস্টেম যুক্ত করুন.ট্রেডিং.Timer দৃষ্টান্ত এবং প্রতি 15 সেকেন্ডে মেয়াদোত্তীর্ণ আইটেমগুলি স্বয়ংক্রিয়ভাবে সরানোর জন্য ইনিশিয়ালেশনের সময় তা ছড়িয়ে দিন। এটি এএসপি.নেট ক্যাশে হিসাবে একই আচরণ।
- আপনি একটি অ্যাডআরআপডেট () রুটিন যোগ করতে চাইতে পারেন যা আইটেমটির ধারকটিতে টাইমস্ট্যাম্প প্রতিস্থাপনের মাধ্যমে স্লাইডিংয়ের মেয়াদ শেষ করে দেয় (মেয়াদোত্তীর্ণ উদাহরণ) এটি ইতিমধ্যে উপস্থিত থাকলে।
মাইক্রোসফ্টকে তার মূল নকশাগুলি সমর্থন করতে হবে কারণ এর ব্যবহারকারী বেস তাদের উপর নির্ভরতা তৈরি করেছে, তবে এর অর্থ এই নয় যে তারা ভাল ডিজাইন are
পেশাদাররা:
- বাস্তবায়নের উপর আপনার সম্পূর্ণ নিয়ন্ত্রণ রয়েছে।
- ডিফল্ট ক্যাচিং আচরণ স্থাপন করে এবং তারপরে আপনি যখন কোনও আইটেম যুক্ত করবেন প্রতিবার ক্যাচিংয়ের বিশদটি না জানিয়ে কেবল কী / মান জোড়া ফেলে রেখে ডিআরওয়াইকে আরও জোরদার করতে পারেন ।
- আধুনিক ইন্টারফেস বাস্তবায়িত করতে পারে , যথা
IDictionary<K,T>
। এটি ইন্টারফেসটি অভিধান ইন্টারফেস হিসাবে আরও অনুমানযোগ্য হিসাবে এটি গ্রাস করা সহজ করে তোলে এবং এটি আইডেরুয়ালি <> দিয়ে কাজ করে এমন সহায়ক এবং এক্সটেনশন পদ্ধতিতে এটি আরও অ্যাক্সেসযোগ্য করে তোলে।
- ক্যাশিংয়ের বিশদগুলি আনেনক্যাপসুলেটেড হতে পারে , যেমন আপনার আঞ্চলিক অভিধানটি সর্বজনীন পঠনযোগ্য সম্পত্তির মাধ্যমে প্রকাশ করে, আপনাকে আপনার ক্যাচিংয়ের কৌশলটির বিরুদ্ধে সুস্পষ্ট ইউনিট পরীক্ষা লেখার পাশাপাশি এটির উপর ভিত্তি করে অতিরিক্ত ক্যাচিং কৌশলগুলি সহ আপনার বেসিক ক্যাচিং বাস্তবায়নকে বাড়িয়ে দেয়।
- যদিও এটি ইতিমধ্যে তাদের জন্য যারা এএসপি.নেট ক্যাশে বা ক্যাচিং অ্যাপ্লিকেশন ব্লকের নেট নেট 1.0 স্টাইল সিনট্যাক্সটি দিয়ে স্বাচ্ছন্দ্য বোধ করেছেন তাদের জন্য এটি প্রয়োজনীয় কোনও পরিচিত ইন্টারফেস নয় তবে আপনি ইন্টারফেসটিকে দেখতে যেমন দেখতে চান তেমন সংজ্ঞা দিতে পারেন।
- কীগুলির জন্য যে কোনও প্রকারের ব্যবহার করতে পারেন। জেনেরিকগুলি তৈরি হওয়ার কারণ এটি। সমস্ত কিছু স্ট্রিং দিয়ে কী করা উচিত নয়।
কনস:
- মাইক্রোসফ্ট দ্বারা উদ্ভাবিত হয় না, সমর্থনও করে না , সুতরাং এটি একই মানের মানের নিশ্চয়তা পাবে না।
- আমি উপরে বর্ণিত কেবলমাত্র নির্দেশাবলী কার্যকর করা হয়েছে তা ধরে নিলে, অগ্রাধিকার ভিত্তিতে মেমরি সাফ করার জন্য "উইল-নিলি" স্পষ্ট আইটেমগুলি ব্যবহার করে না (যা যাইহোক ক্যাশে কোনও কোণার ক্ষেত্রে ইউটিলিটি ফাংশন .. র্যাম কিনুন যেখানে আপনি ক্যাশে ব্যবহার করবেন , র্যাম সস্তা।
এই চারটি বিকল্পের মধ্যে এটি আমার পছন্দ। আমি এই বেসিক ক্যাচিং সমাধানটি প্রয়োগ করেছি have এখনও অবধি, এটি নিখুঁতভাবে কাজ করছে বলে মনে হচ্ছে, কোনও পরিচিত বাগ নেই (দয়া করে নীচের মন্তব্যে বা জোন-এ-জন্ডাভিতে যদি থাকে তবে আমার সাথে যোগাযোগ করুন !!), এবং আমি এটি আমার সমস্ত ছোট পাশের প্রকল্পগুলিতে ব্যবহার করার ইচ্ছা করছি বেসিক ক্যাচিং এটা এখানে:
গিথুব লিঙ্ক: https://github.com/kroimon/ExpirableItemD dictionary
পুরানো লিঙ্ক: এক্সপায়ারযোগ্য আইটেমডোরিজ.জিপ
উল্লেখ করার মতো মূল্য: অ্যাপফ্যাব্রিক, নোএসকিউএল, এবং অন্যান্য
লক্ষ্য করুন যে এই ব্লগ নিবন্ধটির শিরোনামটি "ভারী-দায় ক্যাচিং" নয়, "সিম্পল ক্যাচিং" নির্দেশ করে। আপনি যদি ভারী শুল্কের স্টাফগুলিতে যেতে চান তবে আপনার উত্সর্গীকৃত, সমাধানগুলি সমাধান করা উচিত।