در مطالب قبل با دو قابلیت “ویرایش و حذف دسته ای” و “ارسال همزمان چند Query” از کتابخانه ی Entity Framework Extended آشنا شدیم. در این مقاله به بررسی مکانیزم Caching در این کتابخانه خواهیم پرداخت.
ممکن است هنگام پیاده سازی نرم افزارتان با سناریوهایی مواجه شوید که بعضی داده های موجود در دیتابیس بسیار دیر به دیر تغییر کنند و یا در بعضی مواقع در طول عمر نرم افزار هیچگاه تغییر نکنند (مانند لیست کشورها و یا لیست استان های یک کشور) اما تعداد دفعات خواندن آنها بسیار زیاد باشد. در چنین مواقعی می توان با خواندن داده ها از پایگاه داده و Cache کردن آنها در حافظه، سرعت و بازدهی نرم افزار را افزایش و مقدار درخواست های ارسالی به سمت سرور پایگاه داده را کاهش داد.
با استفاده از متد FromCache موجود در EntityFramework.Extensions می توان نتایج یک Query را Cache نمود :
1 2 3 4 5 6 7 8 |
using EntityFramework.Extensions; . . . using (var dbContext = new MembershipDbContext()) { var provinces = dbContext.Provinces.FromCache().ToList(); } |
در صورتی که که نتیجه ی Query از قبل در حافظه Cache نشده باشد (در اولین درخواست) از پایگاه داده خوانده می شوند ولی در دفعات بعد از حافظه خوانده شده و بازگردانده می شود. در صورتی که متد FromCache بدون پارامتر فراخوانی شود، از تنظیمات پیش فرض برای نگهداری Cache استفاده خواهد کرد. میتواند با ارسال پارامتر به این متد زمانی دلخواه جهت Expire شدن نتیجه ی Query مشخص کنید :
1 2 3 4 5 6 7 8 9 10 11 |
using EntityFramework.Caching; using EntityFramework.Extensions; . . . using (var dbContext = new MembershipDbContext()) { var provinces = dbContext.Provinces .FromCache(CachePolicy.WithDurationExpiration(new TimeSpan(0,0,1,0))) .ToList(); } |
در مثال بالا مدت زمان ۱ دقیقه برای Expire شدن Cache در نظر گرفته می شود. سه متد در کلاس CachePolicy برای استفاده در متد FromCache وجود دارد :
- WithDurationExpiration
این متد مدت زمان مشخصی (مانند ۱ دقیقه در مثال بالا) را برای Expire شدن نتایج در نظر میگیرد. (پارامتر از نوع TimeSpan)
- WithAbsoluteExpiration
این متد تاریخ و زمان مشخصی را جهت Expire شدن نتایج در نظر میگیرد. (پارامتر از نوع DateTimeOffset)
- WithSlidingExpiration
این متد نتایج Cache شده را در صورتی که هیچ درخواستی برای دسترسی به آنها نباشد در مدت زمان مشخص، Expire می کند. در صورتی که داده ها از Cache خوانده شوند، مدت زمان Expire شدن آن مجدد تمدید خواهد شد.
همچنین میتوانید با استفاده از پارامتر tags در متد FromCache بر روی Cache خود برچسب زده و آنها را به صورت دستی Expire کنید :
1 2 3 4 5 6 7 8 9 10 11 |
using (var dbContext = new MembershipDbContext()) { var provinces = dbContext.Provinces.FromCache(tags: new [] {"Provinces"}).ToList(); } . . . CacheManager.Current.Expire("Provinces"); |
همچنین اعمال Tag بر روی Cache ها می تواند به شما کمک کند تا نتایج Query ها را بر حسب کاربر (و یا هر فاکتور دیگری) به صورت جدا ذخیره و مدیریت نمایید :
1 2 3 4 5 6 7 |
using (var dbContext = new MembershipDbContext()) { var provinces = dbContext.Provinces .Where(a => a.Country.Id == countryId) .FromCache(tags: new [] {"Provinces-" + countryId }) .ToList(); } |
پیاده سازی به جا و مناسب Caching می تواند تاثیر مثبتی در بازدهی و سرعت نرم افزارتان داشته باشد. همانطور که پیاده سازی نادرست آن می تواند منجر به کمبود حافظه در سرور و یا نادرستی اطلاعاتی در سیستم شود. به همین علت هنگام پیاده سازی مکانیزم Caching باید دقت زیادی به خرج داده و تمام جوانب را در نظر بگیرید.
سلاباید از زحمات شما دوست عزیز در استارت کار تشکر و قدردانی کرد.
البته درصورت امکان امکان دریافت خروجی PDF برای کاربران قرار بدین خیلی بهتر میشه.
موفق باشید.
سلام، خواهش میکنم لطف دارید
به زودی نسخه ی PDF و قابل چاپ مطالب رو قرار میدم.
ممنون از پیشنهاد خوبتون
سلام استاد امیدوارم حالتون خوب باشه
داشتم توی اینترنت دنبال CachePolicy های entityFramework extended میگشتم رسیدم به سایت شما!
خیلی خوب بود مرسی استاد
سلام.
خواهش میکنم میثم جان
امیدوارم مطلب براتون مفید بوده باشه
سلام آقای احمدی مرسی واقعا اولین سایتی هست که ساده و جامع مطالبو میگه دمت گرم مرسی
سلام این مطلب عالی بود خیلی بدرد من خورد
ممنون