Caching در ASP.NET Core 2.0

در این مقاله قصد داریم که در رابطه با نحوه استفاده از caching توزیع شده و Redis در ASP.NET Core به صورت خلاصه و ارائه نکات مورد نیاز به شما ارائه دهیم.

Caching در ASP.NET Core 2.0

مشکل

نحوه استفاده از caching  توزیع شده و Redis  در ASP.NET Core.

راه حل

از یک پروژه خالی شروع میکنیم و سرویس های Redis را به متد ()ConfigureServices در Startup اضافه میکنیم.

public void ConfigureServices(  
        IServiceCollection services)  
    {  
        services.AddDistributedRedisCache(options =>  
        {  
            options.Configuration = "..."; // Redis connection string  
        });  
    }  

متدهای utility را برای اشیاء نوع های set/get از cache ایجاد کنید.

public static class CachingExtensions  
 {  
     public static async Task SetObjectAsync(  
         this IDistributedCache cache, string key, T value)  
     {  
         await cache.SetStringAsync(key, JsonConvert.SerializeObject(value));  
     }  
  
     public static async Task GetObjectAsync(  
         this IDistributedCache cache, string key)  
     {  
         var value = await cache.GetStringAsync(key);  
         return value == null ? default(T) :  
                               JsonConvert.DeserializeObject(value);  
     }  
 } 

یک middleware برای نوشتن در کش ایجاد کنید.

public class WriteCachingMiddleware  
  {  
      private readonly RequestDelegate next;  
      private readonly IDistributedCache cache;  
  
      public WriteCachingMiddleware(  
          RequestDelegate next,  
          IDistributedCache cache)  
      {  
          this.next = next;  
          this.cache = cache;  
      }  
  
      public async Task Invoke(HttpContext context)  
      {  
          await cache.SetObjectAsync("CurrentUser",  
              new UserInfo { Username = "James", Email = "james@bond.com" });  
          await this.next(context);  
      }  
  } 

یک middleware برای خواندن از کش مینویسیم.

public class ReadCachingMiddleware  
{  
    private readonly RequestDelegate next;  
    private readonly IDistributedCache cache;  
  
    public ReadCachingMiddleware(  
        RequestDelegate next,  
        IDistributedCache cache)  
    {  
        this.next = next;  
        this.cache = cache;  
    }  
  
    public async Task Invoke(HttpContext context)  
    {  
        var user = await cache.GetObjectAsync("CurrentUser");  
        await context.Response.WriteAsync($"{user.Username}, {user.Email}");  
    }  
} 

توضیحات تکمیلی

ذخیره سازی داده های پر استفاده می تواند عملکرد یک برنامه وب را بهبود بخشد.برای برنامه های میزبانی شده در چند سرور ، استفاده از ذخیره سازی توزیع شده به این معنی است که برنامه می تواند بدون مراجعه به سرور به نمونه داشته باشد.

caching باید یک جایگزین برای استفاده از Session State باشد.ASP.NET Core یک abstraction یا انتزاع بر روی caching توزیع شده ارائه میدهد ، به طوری که صرف نظر از جایی که Cache در آن به صورت فیزیکی ذخیره میشود (Redis, SQL) ، توسعه دهندگان می توانند با استفاده از یک api یکپارچه با آن تعامل داشته باشند.

این رابط یا اینترفیس IDistributedCache است و متدهایی برای Set و Get و حذف داده های کش ارائه میدهد.توجه داشته باشید که این را میتوان به عنوان وابستگی به middleware خود یا کنترلرها و غیره تزریق کرد.متدهای set/get موجود در IDistributedCache با []byte کار میکنند اما framework همچنین extension method هایی برای کار با string ارائه میدهند.

این extension method ها در پشت صحنه  از ()Encoding.UTF8.GetBytes و ()Encoding.UTF8.GetString استفاده میکنند.

شما میتوانید extension method های شخصی خود را که با اشیاء نوع های قوی دیگر کار میکنند ، همانطور که در بالا نشان داده شده است بنویسید.