حسین احمدی
بنیانگذار توسینسو و برنامه نویس و توسعه دهنده ارشد وب

آموزش استفاده از Redis در ASP.NET Core

ابزارهای مختلفی برای بحث Caching وجود دارند که یکی از معروفترین آن ها Redis است. Redis یک ساختار Key Value در اختیار شما میگذارد که بوسیله آن می توانید مقادیر مختلفی رو با سرعت بالا ذخیره و بازیابی کنید. در این مطلب قصد داریم با چگونگی استفاده از Redis در ASP.NET Core آشنا بشیم.

دوره های شبکه، برنامه نویسی، مجازی سازی، امنیت، نفوذ و ... با برترین های ایران

در این مطلب ما از Redis بر روی ساختار Docker استفاده می کنیم. البته شما می تونید از روش های دیگه ای هم استفاده کنید، اما Docker به شما اجازه اجرای بدون دردسر Redis رو میده و به راحتی می تونید از Redis استفاده کنید.

در ابتدا در صورت نصب Docker، دستور زیر رو در محیط Powershell اجرا کنید تا Redis بر روی Docker اجرا بشه:

docker run --restart always --name redis-sample -p 7002:6379 -d redis

با اجرای این دستور Container جدیدی با نام redis-sample بر روی داکر ایجاد شده و بوسیله پورت 7002 می تونید به Redis دسترسی داشته باشید (دستور بالا پورت 6379 رو به پورت 7002 مپ میکنه). برای تست برنامه Docker Desktop رو اجرا کنید، redis-sample رو انتخاب کنید و با کلیک روی گزینه مشخص شده در تصویر وارد محیط CLI بشید:


Docker Desktop

در خط فرمان دستور redis-cli رو وارد کنید تا وارد redis بشید:

# redis-cli
127.0.0.1:6379>

برای تست عملکرد Redis دستورات زیر رو در خط فرمان تایپ کنید و باید خروجی مشابه خروجی زیر بگیرید:

127.0.0.1:6379> set mykey "Welcome to TOSINSO"
OK
127.0.0.1:6379> keys *
1) "mykey"
127.0.0.1:6379> get mykey
"Welcome to TOSINSO"

در قدم بعدی، به سراغ ASP.NET Core میریم. برای استفاده از Redis در ASP.NET یک پروژه جدید ایجاد می کنیم (در این مطلب از نسخه ASP.NET Core 5 استفاده شده). پکیج های Nuget مورد نیاز رو به صورت زیر نصب می کنیم:

Install-Package Microsoft.Extensions.Caching.StackExchangeRedis
Install-Package StackExchange.Redis.Extensions.AspNetCore
Install-Package StackExchange.Redis.Extensions.Core
Install-Package StackExchange.Redis.Extensions.Newtonsoft

قبل از اضافه کردن تنظیمات مربوط به Redis در فایل Startup.cs باید تنظیمات مربوط به Redis رو در فایل appsettings.json اضافه کنیم. فایل appsettings.json رو به صورت زیر تغییر میدیم:

{
  "Redis": {
    "ConnectTimeout": 6000,
    "ConnectRetry": 2,
    "Database": 0,
    "Hosts": [
      {
        "Host": "127.0.0.1",
        "Port": "7002"
      }
    ]
  },
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    }
  },
  "AllowedHosts": "*"
}

برای مرحله بعد تنظیمات مربوطه رو داخل فایل Startup.cs انجام میدیم. این تنظیمات شامل اضافه کردن سرویس Redis برای ساختار Distributed Caching و همچین اضافه کردن سرویس Redis Database است. سرویس اول باعث میشه تا ساختار Distributed Caching داخل ASP.NET Core از سرویس Redis برای ذخیره کردن آیتم های Cache استفاده کنه و مورد دوم به ما این اجازه رو میده تا بتونیم به صورت مستقیم از Redis داخل کدها استفاده کنیم. متد ConfigureServices رو به صورت زیر تغییر بدید:

public void ConfigureServices(IServiceCollection services)
{
    var redisConfiguration = Configuration.GetSection("Redis").Get<RedisConfiguration>();
    services.AddStackExchangeRedisCache(options => { options.Configuration = redisConfiguration.Hosts[0].Host + ":" + redisConfiguration.Hosts[0].Port; });
    services.AddStackExchangeRedisExtensions<NewtonsoftSerializer>(redisConfiguration);
    services.AddControllersWithViews();
}

و قسمت app.UseEndpoints رو در متد Configure به صورت زیر تغییر بدید:

app.UseEndpoints(endpoints =>
{
    endpoints.MapControllers();
});

در ادامه، یک کلاس با نام HomeController در پوشه Controllers اضافه می کنیم و کد زیر رو بهش اضافه می کنیم. با اجرای برنامه باید پیام ok در مرورگر نمایش داده شود.

public class HomeController : Controller
{
    [HttpGet("")]
    [AllowAnonymous]
    public IActionResult Index()
    {
        return Content("ok");
    }
}

برای استفاده از Redis، باید سرویس IRedisCacheClient رو به کنترلر Inject  کنیم. کد زیر رو به کلاس HomeController اضافه می کنیم:

private readonly IRedisCacheClient client;

public HomeController(IRedisCacheClient client)
{
    this.client = client;
}

برای اضافه کردن یک مقدار جدید، کافیه کد زیر رو استفاده کنیم:

[HttpGet("")]
[AllowAnonymous]
public async Task<IActionResult> Index()
{
    await client.Db0.AddAsync("Website Name", "Total Single Solutions");
    return Content("ok");
}

با اینکار مقدار Total Single Solutions با کلید Website Name به Redis اضافه میشه. ابتدا برنامه رو اجرا کرده و بعد از دیدن پیام ok در مرورگر، از خط فرمان Redis در داکر دستور زیر رو اجرا می کنیم تا از صحت عملکرد کدهامون مطمئن بشیم:

127.0.0.1:6379> keys *
1) "Website Name"
2) "mykey"
127.0.0.1:6379> get "Website Name"
"\"Total Single Solutions\""

در صورت مشاهده خروجی بالا، مشخص میشه که ارتباط ما با Redis برقرار شده.

مورد بعدی اینکه ما می تونیم به جای مقادیری مثل یک رشته یا عدد، یک شئ رو به صورت کامل داخل Redis ذخیره کنیم. برای اینکار یک کلاس با نام Person در پوشه Models تعریف می کنیم:

public class Person
{
    public Guid Id { get; set; }
    public string Firstname { get; set; }
    public string Lastname { get; set; }
    public string Website { get; set; }
}

برای ذخیره یک شئ از نوع Person کافیه که از کد زیر استفاده کنیم:

await client.Db0.AddAsync("Person1", new Models.Person()
{
    Id = Guid.NewGuid(),
    Firstname = "Hossein",
    Lastname = "Ahmadi",
    Website = "https://tosinso.com"
});

در خط فرمان Redis دستورات زیر رو به ترتیب اجرا می کنیم:

127.0.0.1:6379> keys *
1) "Person1"
2) "Website Name"
3) "mykey"
127.0.0.1:6379> get Person1
"{\"Id\":\"1b0861e4-a4ad-4b83-9958-a715c0400295\",\"Firstname\":\"Hossein\",\"Lastname\":\"Ahmadi\",\"Website\":\"https://tosinso.com\"}"

همونطور که می بینیم Person1 به صورت Json در Redis ذخیره شده. برای بازیابی مقدار Person1 از کد زیر استفاده می کنیم:

var person = await client.Db0.GetAsync<Models.Person>("Person1");

عملیات ذخیره کردن و بازیابی اطلاعات بوسیله کتابخانه Newtonsoft Json انجام میشه، یعنی برای ذخیره کردن، شئ ما در قالب Json سریالایز میشه و برای بازخوانی Deserialize میشه.

مورد بعدی چک کردن وجود یک کلید در Redis هست، در کدهای قبلی، در صورتی که کلید مورد نظر در Redis وجود داشته باشه، مقدارش با مقدار جدید جایگزین میشه، برای بررسی وجود یک کلید می تونیم از کد زیر استفاده کنیم:

if (!await client.Db0.ExistsAsync("Website Name"))
{
    await client.Db0.AddAsync("Website Name", "Total Single Solutions");
}

مورد بعدی مشخص کردن تاریخ انقضا برای یک کلید هست، برای مثال میخواییم یک کلید فقط برای سه ساعت در Redis باشه و بعد به صورت خودکار حذف بشه، برای اینکار کد مربوط به Add کردن رو به صورت زیر تغییر میدیم:

if (!await client.Db0.ExistsAsync("Website Name"))
{
    await client.Db0.AddAsync("Website Name", "Total Single Solutions", TimeSpan.FromHours(3));
}

در این مطلب سعی کردیم موارد مقدماتی مربوط به استفاده از Redis در ASP.NET Core رو پوشش بدیم. یکی از مزیت های استفاده از Redis سرعت بازخوانی بسیار بالای اطلاعات هست. برای مثال، اگر شما برای بازخوانی رکوردها از بانکی مثل SQL Server استفاده می کنید و بازخوانی اطلاعات از بانک اطلاعاتی زمان بر هست، پیشنهاد می کنم که حتماً از Redis استفاده کنید تا متوجه تفاوت بسیار زیاد در بازخوانی اطلاعات بشید.


حسین احمدی
حسین احمدی

بنیانگذار توسینسو و برنامه نویس و توسعه دهنده ارشد وب

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

نظرات