عموما مکانیزم کشینگ این امکان را به ما میدهد که منابع کمتری را بکار ببریم. جلوگیری از لود کردن دوباره یک فایل (مثلا ذخیره یک CSS Style یا یک فایل جاوا اسکریپت در مرورگر) یا ذخیره Response یک Action با استفاده از Response Caching، یا ذخیره یک شی در حافظه موقت با استفاده از In-Memory Cache که موضوع این پست می باشد (نوع دیگری از کشینگ اصطلاحا با Distributed Caching شناخته میشود که موضوع بحث ما نیست).

In-Memory Caching ساده ترین نوع کش کردن می باشد که به سادگی در ASP.NET Core قابل پیاده سازی می باشد. این نوع کشینگ معمولا زمانی استفاده می شود که نرم افزار ما بر روی یک سرور قرار دارد و اصلاحا توزیع شده نیست( در صورتی که نرم افزار ما بر روی چند سرور قرار گرفته باشد و همچنان قصد استفاده از این In-Memory Caching را داشته باشیم، Request های مختلف برای استفاده از اطلاعات موجود در کش باید به سروری هدایت شوند که کشینگ در آن اعمال می شود). با استفاده از In-Memory Caching میتوانیم انواع مختلف داده ها را بدون مشکل در حافظه نگهداری کنیم. برای مثال داده ما میتواند یک string ساده یا یک لیست از اطلاعات کارمندان باشد. یک سری قوانین در پیاده سازی و استفاده از مکانیزنم کشینگ وجود دارد که باید رعایت شود :
نحوه استفاده از کشینگ حافظه موقت :
در کلاس Startup و در متد ConfigureServices متد زیر را برای فعال کردن کشینگ فراخوانی میکنیم :
services.AddMemoryCache ();
و در قسمتی که قصد استفاده از کشینگ را داریم، عمل تزریق ImemoryCache را به Constructor انجام میدهیم، در اینجا ما در یک کنترلر به نام InfoController قصد استفاده از کشینگ را داریم :
private readonly IMemoryCache _memoryCache;
public InfoController (IMemoryCache memoryCache) {
_memoryCache = memoryCache;
}
در متد/اکشن مورد نظر، بعد از تعریف یک کلید بعنوان کلید دستیابی به کش، بررسی میکنیم که در صورت خالی بودن کش، اطلاعات مورد نظر از منبع مناسب واکشی شود و در کش قرار گیرد، متغیر expirationOptions حاوی تنظمات مربوط به مدت زمان غیر فعال بودن مقدار کش شده، الویت و مدت زمان قطعی نگهداری داده کش شده است :
[HttpGet]
public string GetInfo () {
var key = "info1"
if (!_memoryCache.TryGetValue (key, out string info)) {
info = getInformation ();
var expirationOptions = new MemoryCacheEntryOptions {
SlidingExpiration = TimeSpan.FromMinutes (2),
Priority = CacheItemPriority.Normal,
AbsoluteExpiration = DateTime.Now.AddMinutes (50)
};
_memoryCache.Set (key, info, expirationOptions);
}
return info;
}
نکات حائض اهمیت برای تنظیمات یک شی کش شده که در متغیر expirationOptions تعیین شده بصورت زیر است :
و متد private زیر به اصطلاح یک منبع داده می باشد( در حالتهای واقعی تر این منبع می تواند یک دیتابیس یا یک سرویس خارجی باشد) :
private string getInformation () {
return $"this is a sample text. generated at : {DateTime.Now.ToLongTimeString()}"
}
یک نمونه ساده از نحوه استفاده از In-Memory Caching در github