آموزش Caching با استفاده از Redis در ASP Net Core


در این مقاله قصد داریم به بررسی دیتابیس Redis و Cache کردن داده در آن به وسیله ASP Net Core بپردازیم



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


آشنایی با Redis

ردیس یک دیتابیس NoSQL می باشد که از قانون ACID به صورت کامل پیروی نمی کند. یعنی داده در آن Durable نیست و ممکن است که در صورت قطعی برق یا System Crash داده موجود در آن از بین برود(هرچند که با اعمال تنظیماتی میتوان بوسیله آن هرچند ثانیه یکبار داده را روی دیسک ذخیره کرد). Redis داده را به صورت Key/Value ذخیره میکند و به علت سرعت بسیار خوب گزینه مناسبی برای Cache کردن داده و استفاده از آن به صورت متوالی می باشد.

راه اندازی Redis در محیط ویندوز

بهترین گزینه برای راه اندازی Redis در محیط ویندوز استفاده از داکر می باشد. در cmd دستور زیر را برای نصب ایمیج Redis اجرا میکنیم. دقت داشته باشید که برای استفاده از Docker نیازمند نرم افزار رفع تحریم هستید.

docker pull redis

پس از مدتی، Image مربوط به Redis دانلود و نصب می شود.

ساخت Container برای Redis

پس از دانلود و نصب Image مربوط به Redis ، برای استفاده از آن باید اقدام به ایجاد Container بکنیم. نکته مهم هنگام ایجاد Container ، ایجاد پسوورد برای آن است که یک نکته امنیتی مهم محسوب میشود.

دستور زیر را در محیط cmd اجرا میکنیم.

docker run -p 9191:6379 -d --name RedisCache redis --requirepass &quot123456&quot

در اینجا یک Container از Redis با پورت 9191 و نام RedisCache می سازیم و پسوورد 123456 را برای آن تنظیم میکنیم.

سپس دستور زیر را در محیط cmd اجرا میکنیم تا کانتینر ساخته شده شروع به کار کند

docker start RedisCache

برای تست Redis میتوان با دستور زیر به cli در Redis دسترسی پیدا کرد.

docker exec -it RedisCache redis-cli

دقت کنید که RedisCache نام کانتینر ساخته شده می باشد.

سپس با استفاده از دستور زیر در Redis پسووردی که برای آن تنظیم کرده ایم را وارد میکنیم

 auth 123456

در اینجا ما پسوورد 123456 را برای Redis ست کردیم.

با استفاده از دستور زیر میتوانیم از صحت کارکرد Redis مطمئن شویم

ping

اگر در جواب PONG دریافت کردیم یعنی همه چیز به درستی تنظیم شده است.


هم اکنون همه چیز برای استفاده از Redis در ASP Net Core آماده است.

استفاده از Redis در ASP Net Core

پس از ایجاد پروژه نمونه ASP Net Core ، اقدام به نصب پکیج StackExchange.Redis میکنیم.

برای نصب این پکیج، از طریق Package Manager Console دستور زیر را اجرا میکنیم.

Install-Package Microsoft.Extensions.Caching.StackExchangeRedis -Version 5.0.1

برای استفاده از Redis در ASP Net Core نیاز است که تنظیمات زیر را در Startup و در قسمت ConfigureServices اعمال کنیم.

https://gist.github.com/babaktaremi/40373d3200e8574e2334843ba4448599

در قسمت Configuration کانکشن Redis و همچنین پسووردی که برای آن تنظیم کرده ایم را قرار میدهیم. قسمت InstanceName بیان میکند که با چه کلید واژه ای قرار است که Value های مربوط به Redis ساخته شوند و در واقع نام پیشوند برای Key های داده هایی که قرار است در Redis ذخیره شوند را تنظیم میکند که آن را خالی میگذاریم و کلید ها را خودمان می سازیم.


ساخت مدل پروژه

در مسیر پروژه یک پوشه با نام Model ایجاد میکنیم و در آن یک کلاس با نام Book ایجاد میکنیم.

کلاس Book را به شکل زیر می سازیم.

https://gist.github.com/babaktaremi/7de13b748bc5e7433141678d92db31bb

سپس به سراغ ساخت BookController می رویم و یک API Controller به شکل زیر می سازیم.

https://gist.github.com/babaktaremi/7f10d05343abe4122c7616a53ba7b35d

ذخیره سازی داخل Redis Cache

برای دسترسی به Redis نیاز به یک Instance از IDistrubtedCache داریم که آن را در کنترلر Inject میکنیم.

https://gist.github.com/babaktaremi/87cbb56d16d5296c62d6264dba137472


برای ذخیره سازی یک نمونه Book در Redis یک اکشن با نام CreateBook می سازیم. دقت داشته باشید که Value ذخیره شده در Redis باید به صورت Byte Array باشد.

https://gist.github.com/babaktaremi/dd96736c49b9db35f8301cf0e695aadc

در قسمت بالا و در Entry Options برای Expire شدن Cache آن را به صورت Sliding تنظیم کردیم که با هربار دسترسی به Cache مدت زمان Expiration آن تمدید شود و یک روز به Expiration Duration آن اضافه شود.

سپس این اکشن را به وسیله Swagger تست میکنیم.

گرفتن تمامی Book ها از Redis

برای گرفتن تمامی Instance های ساخته شده و ذخیره شده در Redis نیاز است که ابتدا تمامی کلید های ذخیره شده در Redis را لیست کنیم. برای این کار نیاز به یک Instance از Connection Multiplexer داریم. یکی از Best Practice ها هنگام استفاده از Redis آن است که این Instance در سیستم به صورت Singleton رجیستر شود. پس آن را به صورت زیر در سیستم رجیستر میکنیم.

https://gist.github.com/babaktaremi/49a132d6fc6fa6bd28be97e449b9204f

حال Constructor کنترلر را به صورت زیر آپدیت میکنیم

https://gist.github.com/babaktaremi/551b727b49cebb7efdeb47ac09ad9230


سپس با استفاده از پترن زیر تمام کلید های موجود در Redis که با Book_ شروع میشوند را لیست میکنیم و مقادیر آن را deserialize کرده و در لیست میریزیم.

https://gist.github.com/babaktaremi/bbb52c8367948270a67d570bfc051490

سپس این اکشن را بوسیله Swagger تست میکنیم.

گرفتن یک Book از Redis

در قسمت قبل یک Instance از Book را با کلید ISBN آن در Redis ذخیره کردیم. حال به وسیله همین کلید همان Instance را بازیابی میکنیم.

https://gist.github.com/babaktaremi/6305e629f81a11f020f463fd860ef44a


سپس بوسیله Swagger این اکشن را تست میکنیم.

حذف یک Book از Redis

برای حذف یک Instance از Book از متد RemoveAsync به صورت زیر عمل میکنیم و به آن کلیدی که برای هر Book تعریف کرده ایم را پاس میدهیم.

https://gist.github.com/babaktaremi/d280e014c3ba90bd1932e365f797c68d

سپس این اکشن را به وسیله Swagger تست میکنیم


سپس مجدد تمام Book ها را واکشی میکنیم. مشاهده میشود که Book مورد نظر با موفقیت پاک شده است


نتیجه گیری

در این مقاله به طور اجمالی با caching در Redis آشنا شدیم. به طور کلی Distributed Caching می تواند در مقیاس بالا به افزایش پرفرمنس کمک کند و یکی از ابزار های بسیار کاربردی آن Redis می باشد. اگر به کد های این مقاله نیاز داشتید میتوانید آن را از لینک زیر دریافت کنید. همچنین خوشحال میشوم که نظرات خود را در رابطه با این مقاله مطرح کنید.

https://github.com/babaktaremi/Sample-Caching-Redis


مقالات بیشتر در دات نت زوم

https://t.me/DotNetZoom