۲۹ شهریور ۱۴۰۳

Techboy

اخبار و اطلاعات روز تکنولوژی

نحوه پیاده سازی کش در حافظه در ASP.NET Core

شما می توانید از الگوی طراحی دکوراتور برای افزودن کش در حافظه به برنامه های ASP.NET Core خود بهره ببرید. در اینجا نحوه

شما می توانید از الگوی طراحی دکوراتور برای افزودن کش در حافظه به برنامه های ASP.NET Core خود بهره ببرید. در اینجا نحوه

الگوهای طراحی برای رفع مشکلاتی که اغلب در برنامه های نرم افزاری با آن مواجه می شوند، تکامل یافته اند. آنها راه حل هایی برای مشکلات و پیچیدگی های تکراری در طراحی نرم افزار هستند. الگوهای طراحی به سه دسته مجزا تقسیم می شوند: خلاقانه، ساختاری، و رفتاری.

الگوهای طراحی خلاقانه برای انتزاع و ساده سازی خلق اشیاء استفاده می شوند. الگوهای ساختاری برای تعریف روابط بین اشیا (مانند وراثت و ترکیب) استفاده می شوند. و الگوهای طراحی رفتاری برای کنترل روش‌های تعامل اشیاء با یکدیگر (مانند همکاری و تفویض اختیار) استفاده می‌شوند.

الگوی طراحی دکوراتور یک الگوی ساختاری است که می‌تواند برای پیوست کردن عملکرد یا رفتار به یک شی به صورت پویا یا استاتیک بدون تغییر ساختار شی مورد استفاده قرار گیرد. در این مقاله، از الگوی دکوراتور برای پیاده‌سازی حافظه پنهان در یک برنامه ASP.NET Core استفاده می‌کنیم.

توجه داشته باشید که ASP.NET Core شیء کش مانند ASP.NET قبلی خود ندارد. با این حال، گزینه های مختلف دردناک از جمله کش در حافظه، کش توزیع شده و کش پاسخ را ارائه می دهد. می‌توانیم با استفاده از قدرت میان‌افزار یا سرویس‌ها در کنار الگوی دکوراتور، کش را به‌طور یکپارچه در یک برنامه ASP.NET Core پیاده‌سازی کنیم.

برای استفاده از نمونه کدهای ارائه شده در این مقاله، باید Visual Studio 2022 را در سیستم خود نصب کنید. اگر قبلاً نسخه‌ای ندارید، می‌توانید Visual Studio 2022 را از اینجا بارگیری کنید.

یک پروژه ASP.NET Core Web API در Visual Studio 2022 ایجاد کنید

برای ایجاد یک پروژه ASP.NET Core 7 Web API در Visual Studio 2022، مراحل ذکر شده در زیر را دنبال کنید.

  1. Visual Studio 2022 IDE را راه اندازی کنید.
  2. روی “ایجاد پروژه جدید” کلیک کنید.
  3. در پنجره “ایجاد پروژه جدید”، “ASP.NET Core Web API” را از لیست الگوهای نمایش داده شده انتخاب کنید.
  4. بعدی را کلیک کنید.
  5. در پنجره “پیکربندی پروژه جدید خود”، نام و مکان پروژه جدید را مشخص کنید.
  6. به صورت اختیاری، بسته به تنظیمات برگزیده خود، کادر انتخاب «قرار دادن راه حل و پروژه در یک فهرست راهنمای» را علامت بزنید.
  7. بعدی را کلیک کنید.
  8. در پنجره «اطلاعات اضافی» که در ادامه نشان داده شده است، کادر «استفاده از کنترل‌کننده‌ها (برای استفاده از حداقل API‌ها علامت آن را بردارید» علامت بزنید. ما از حداقل API در این پروژه استفاده نخواهیم کرد.
  9. در جای دیگری از پنجره «اطلاعات اضافی»، «نوع احراز هویت» را روی «هیچ» (پیش‌فرض) بگذارید و مطمئن شوید که کادرهای «فعال کردن پشتیبانی از API باز کردن»، «پیکربندی برای HTTPS» و «فعال کردن داکر» را انتخاب کنید. ” کنترل نشده باقی بماند. ما در اینجا از هیچ یک از این ویژگی ها استفاده نخواهیم کرد.
  10. روی ایجاد کلیک کنید.
روش شناسی چابک چیست؟ توسعه نرم افزار مدرن توضیح داد

ما از این پروژه ASP.NET Core Web API برای کار با نمونه‌های کد در بخش‌های زیر استفاده خواهیم کرد.

مخزن کش چیست؟ چرا به یکی نیاز داریم؟

الگوی مخزن یک الگوی طراحی پرکاربرد است که به تفکیک منطق دسترسی به داده ها از بقیه برنامه ها کمک می کند. یک مخزن کش برای افزایش کارایی و عملکرد عملیات دسترسی به داده استفاده می شود. این الگوی پرکاربرد مخزن را با تکنیک های کش ترکیب می کند.

کپسوله کردن عملیاتی مانند پرس و جو، درج، به روز رسانی و حذف داده ها در کلاس مخزن، یک لایه انتزاعی واضح را ارائه می دهد که به برنامه اجازه می دهد تا با ذخیره سازی داده های زیرین از طریق مخزن تعامل داشته باشد. با افزودن قابلیت کش به مخزن، می‌توانیم عملیات دسترسی به داده‌های مکرر و نیازمند منابع را اتصال کوتاه کرده و عملکرد برنامه خود را بهبود ببخشیم.

یک مخزن ذخیره شده چگونه کار می کند

در اینجا نحوه عملکرد یک مخزن حافظه پنهان معمولاً آمده است:

  1. مخزن ذخیره شده ابتدا بررسی می کند که آیا داده های درخواست شده توسط مشتری در حافظه پنهان ذخیره شده است یا خیر.
  2. اگر داده‌ها در حافظه پنهان یافت نشد، مخزن ذخیره‌سازی شده درخواست را به مخزن اصلی ارسال می‌کند. سپس مخزن زیربنایی داده ها را از منبع اصلی خود، مانند پایگاه داده، دریافت می کند.
  3. بعد از اینکه داده ها از منبع داده بازیابی شدند، در حافظه پنهان ذخیره می شوند.
  4. در نهایت، داده های درخواستی به مشتری برگردانده می شود.

استفاده از مکانیزم ذخیره سازی، عملکرد کلی را بهبود می بخشد و بار روی منبع داده را کاهش می دهد. به جای انجام عملیات گران قیمت بازیابی داده ها از منبع داده زیربنایی بارها و بارها، درخواست های بعدی برای همان داده ها را می توان از حافظه پنهان ارائه کرد.

می توانید مخازن کش را با استفاده از مکانیسم های مختلف کش مانند کش در حافظه، کش توزیع شده، یا حتی راه حل های کش سفارشی پیاده سازی کنید. یک مخزن کش می‌تواند با کاهش زمان دسترسی به داده‌ها، کاهش تأخیر و بهبود مقیاس‌پذیری، عملکرد برنامه شما را به میزان قابل توجهی بهبود بخشد.

هسته معنایی مایکروسافت برنامه نمونه چت Copilot را اضافه می کند

با به حداقل رساندن تماس‌ها به منبع داده اصلی، یک مخزن ذخیره‌سازی شده، پاسخگویی برنامه را بهبود می‌بخشد. با این حال، حفظ سازگاری داده‌های حافظه پنهان با منبع داده واقعی، مستلزم در نظر گرفتن دقیق استراتژی‌های ابطال کش است.

یک مخزن کش در ASP.NET Core ایجاد کنید

قبل از اینکه مخزن کش خود را ایجاد کنیم، بیایید یک کلاس مدل برای برنامه خود ایجاد کنیم. روی پروژه Web API ما در پنجره Solution Explorer کلیک راست کرده و یک فایل .cs جدید ایجاد کنید. کد تولید شده پیش فرض را با قطعه کد زیر جایگزین کنید تا کلاس مدل ما ایجاد شود.

    public class Author
    {
        public Guid Id { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public string Address { get; set; }
        public string Phone { get; set; }
        public string City { get; set; }
        public string PostalCode { get; set; }
        public string Country { get; set; }
    }

در مرحله بعد، یک رابط به نام IAuthorRepository ایجاد کنید که حاوی اعلان متدهای مربوط به عملیات پشتیبانی شده توسط کلاس مخزن ما باشد. کد تولید شده پیش فرض را با کد زیر جایگزین کنید.

public interface IAuthorRepository
{
   Task<List<Author>> GetAuthorsAsync();
}

اکنون یک کلاس جدید به نام AuthorRepository در فایلی با همین نام با پسوند cs ایجاد کنید و کد زیر را در آنجا وارد کنید.

public class AuthorRepository: IAuthorRepository
 {
     private readonly List<Author> authorList;
     public AuthorRepository()
     {
         authorList = new List<Author>() {
         new Author()
         {
             Id = Guid.NewGuid(),
             FirstName = "Joydip",
             LastName = "Kanjilal",
             Address = "1 ABC Road",
             City = "Hyderabad",
             Country = "India",
             PostalCode = "500089",
             Phone = "1234567890"
         },
         new Author()
         {
             Id = Guid.NewGuid(),
             FirstName = "Steve",
             LastName = "Barnes",
             Address = "9/2A CT Road",
             City = "Chicago",
             Country = "USA",
             PostalCode = "101010",
             Phone = "0987654321"
         },
         new Author()
         {
             Id = Guid.NewGuid(),
             FirstName = "Michael",
             LastName = "Bogan",
             Address = "81 Red Road",
             City = "Sydney",
             Country = "Australia",
             PostalCode = "123456",
             Phone = "1212121212"
         }
         };
     }
     public async Task<List<Author>> GetAuthorsAsync()
     {
         return await Task.FromResult(authorList);
     }
 }

یک کلاس دکوراتور با قابلیت ذخیره سازی در حافظه پنهان ایجاد کنید

برای پیاده سازی عملکرد ذخیره سازی، از رابط دیگری به نام ICachedAuthorRepository استفاده خواهیم کرد. رابط ICachedAuthorRepository تنها یک متد به نام GetCachedAuthorsAsync()، را همانطور که در قطعه کد زیر نشان داده شده است، اعلام می کند.

public interface ICachedAuthorRepository

    Task> GetCachedAuthorsAsync();

}

اکنون یک کلاس دکوراتور با قابلیت ذخیره سازی در حافظه پنهان ایجاد می کنیم. برای انجام این کار، یک کلاس جدید به نام AuthorCachingDecorator ایجاد کنید که همان رابط ICachedAuthorRepository را پیاده سازی می کند و کد زیر را در آنجا بنویسید.

    public class AuthorCachingDecorator : ICachedAuthorRepository

    {

CloudBees پلتفرم devsecops بومی ابری را آماده می کند

        فقط خواندنی خصوصی IMemoryCache _memoryCache؛

        فقط خواندنی خصوصی IAuthorRepository _authorRepository;

        Public AuthorCachingDecorator(IMemoryCache memoryCache,

        IAuthorRepository authorRepository)

        {

            _memoryCache = memoryCache;

            _authorRepository = authorRepository;

        }

        همگام سازی عمومی Task> GetCachedAuthorsAsync()

        {

            const string cacheKey = “Author”;

            اگر (!_memoryCache.TryGetValue(cacheKey,

            out List cachedData))

            {

                cachedData = منتظر _authorRepository.GetAuthorsAsync();

                _memoryCache.Set(cacheKey, cachedData,

                TimeSpan.FromMinutes(10))؛

            }

            cachedData را برمی گرداند؛

        }

    }

در روش‌های CachedAuthorsAsync، داده‌هایی که برای اولین بار بازیابی می‌شوند، قبل از بازگرداندن در حافظه پنهان ذخیره می‌شوند. برای تمام تماس های بعدی، داده ها از حافظه پنهان بازگردانده می شوند. داده‌های کش به مدت ۱۰ دقیقه باقی می‌مانند، پس از آن، داده‌های کش باطل می‌شوند، یعنی داده‌های کش حذف می‌شوند. کش در تماس بعدی دوباره با داده های تازه پر می شود و همین رویه ادامه می یابد.

به نحوه استفاده از تزریق وابستگی در کلاس AuthorCachingDecorator برای بازیابی نمونه ای از نوع IAuthorRepository توجه کنید. این نمونه برای بازیابی داده ها با فراخوانی متد GetAuthorsAsync مربوط به کلاس AuthorRepository استفاده می شود.

در حافظه نهان هسته aspnet

شکل ۱: پیاده سازی حافظه پنهان در ASP.NET Core.

اگر داده ها از قبل در حافظه پنهان موجود باشد، متد GetAuthorsAsync از کلاس AuthorRepository فراخوانی نمی شود.

فایل Program.cs را پیکربندی کنید

فقط دو مرحله دیگر، سپس می توانیم برنامه خود را اجرا کنیم. ما باید خدمات کش حافظه خود را با استفاده از کد زیر در فایل Program.cs به IServiceCollection اضافه کنیم.

builder.Services.AddMemoryCache();

ما همچنین باید نمونه هایی از نوع IAuthorRepository و ICachedAuthorRepository را با استفاده از کد زیر به IServiceCollection اضافه کنیم.

builder.Services.AddScoped<IAuthorRepository,
AuthorRepository>();
builder.Services.AddScoped<ICachedAuthorRepository,
AuthorCachingDecorator>();

کد منبع کامل فایل Program.cs برای مرجع شما در زیر آورده شده است.

var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddMemoryCache();
builder.Services.AddScoped<IAuthorRepository, AuthorRepository>();
builder.Services.AddScoped<ICachedAuthorRepository, AuthorCachingDecorator>();
builder.Services.AddControllers();
var app = builder.Build();
// Configure the HTTP request pipeline.
app.UseAuthorization();
app.MapControllers();
app.Run();

در نهایت، هنگامی که برنامه را اجرا می کنید، داده های نویسنده باید در مرورگر وب شما همانطور که در شکل ۲ نشان داده شده است نمایش داده شود.

در حافظه نهان در عمل

شکل ۲: حافظه پنهان ما در حال کار است.

برای سادگی، در اینجا از یک مخزن ساده استفاده کرده ایم که داده ها را در یک مجموعه ذخیره می کند. به طور طبیعی، برای یک برنامه کاربردی دنیای واقعی، این پیاده سازی را برای بازیابی رکوردها از پایگاه داده تغییر می دهید. هنگام خواندن داده های ذخیره شده در حافظه پنهان به جای ضربه زدن به پایگاه داده برای بازیابی داده ها، از افزایش عملکرد شگفت زده خواهید شد.