آموزش Caching Strategy در لاراول

از نظر فنی، Caching فرآیند ذخیره و بازیابی اطلاعات از یک Cache Provider است. کش یک مؤلفه نرمافزاری یا سختافزاری است که برای ذخیره دادهها به منظور سرعت بخشیدن به درخواستهای آینده طراحی شده است.
استفاده از مکانیزم caching در نرمافزارها از جمله راهکارهایی است که توسط آن میتوان عملکرد سیستم را بهبود بخشید، زمان بارگذاری صفحات را به حداقل رساند و از نیاز به دسترسی مجدد به منابع پرهزینهی سیستم جلوگیری کرد. استفاده از مناسبترین روشهای کش از جمله مواردی است که توسعهدهندگان وب باید در نظر داشته باشند. در این پست، من تلاش میکنم شما را با این استراتژیها آشنا کنم و با قطعهکدی در فریمورک لاراول آنها را پیادهسازی میکنیم.
چرا caching مهم است؟
در دنیای نرمافزار، محدودیتهایی نظیر پهنایباند و ظرفیت حافظه در ارتباط با دادههای پرهزینه وجود دارد که این موارد میتواند منجر به ایجاد مشکلاتی در دسترسی به آنها شود. منظور از دادههای پر هزینه دادههایی هستند که بهصورت مکرر توسط سرور فراخوانی میشوند. برای مثال صفحهی اصلی وبسایت دیجیکالا را در نظر بگیرید. لیستی از دهها محصول وجود دارد که بهازای هر درخواست توسط کاربر، باید از دیتابیس خوانده شود. دسترسی به این دادهها در صورت درخواست مجدد برای سیستم پر هزینه خواهد بود. این مشکل باعث کاهش سرعت دسترسی به دادهها و افزایش هزینههای زیرساخت میشود.
استفاده از کش میتواند به این کسب و کار کمک کند تا دادههای پرهزینه را در خود ذخیره کند و از ارسال درخواستهای مکرر به دیتابیس جلوگیری کند.به عبارت دیگر هر بار که کاربر درخواستی را به سرور ارسال میکند، سرور نیازی به جمعآوری و پردازش مجدد دادهها ندارد و میتواند به سرعت پاسخ قبلی را از کش بازیابی کرده و برای کاربر ارسال کند. پس برای درک اهمیت استفاده از کش، به موارد زیر اشاره میکنیم:
- کاهش هزینههای سختافزاری و بهینهسازی مصرف آنها
- کاهش تعداد درخواستها به سرور
- کاهش هزینههای پردازش داده در سرور
- کاهش میزان ترافیک دادهها
- کاهش میزان خطاهای سیستم
- پشتیبانی از بیشترین کاربران همزمان
- بهبود سرعت بارگذاری صفحات
- بهبود تجربهی کاربران
- افزایش قابلیت اطمینان سیستم
- افزایش امنیت دادهها
استراتژیهای Caching
برای انتخاب بهترین استراتژی caching باید با نحوهی عملکرد آنها آشنا شویم. هر کدام از این استراتژی ها مزایا و معایبی دارند که با شناخت آنها میتوان با رویکردی هوشمندانه، استراتژی مناسب شرایط کسب و کارمان انتخاب کنیم.
استراتژی Write Through
استراتژی (Caching) write-through یکی از روشهای رایج در کش دادهها است. در این روش، هنگامی که دادهای در سیستم ثبت میشود، به صورت همزمان در حافظه کش نیز ذخیره میشود. با این روش، دادههایی که در کش ذخیره شدهاند، همیشه در دسترس و قابل استفاده هستند.
یکی از مزایای اصلی استفاده از این روش، کاهش زمان دسترسی به دادههاست. به علت ذخیرهی همزمان داده در حافظه کش، درخواستهای بعدی برای داده به سرعت از حافظه کش دریافت میشوند. همچنین، با استفاده از این روش، دادههای کش همیشه بهروز هستند و آخرین نسخهی داده در سیستم در دسترس قرار دارد.
یکی از مشکلات این روش، افزایش ترافیک در سیستم است. زیرا هرگاه دادهای در سیستم ثبت میشود، باید به صورت همزمان در حافظه کش هم ذخیره شود. در نتیجه هزینهی ذخیرهسازی دادهها در حافظه کش نیز با استفاده از این روش افزایش مییابد. همچنین در صورتی که دادهها بسیار بزرگ باشند، ذخیرهسازی آنها هزینهبر خواهد بود و ممکن است باعث افت عملکرد سیستم شود.
مزایا:
- افزایش سرعت دسترسی به دادهها
- اطمینان از قابلیت بازیابی دادهها در صورت خرابی سیستم
- کاهش تعداد دسترسیهای مستقیم به دیسک و افزایش سرعت عملیات دسترسی
- بهبود عملکرد سیستم با استفاده از کاهش تعداد ترافیک داده بین حافظه اصلی و حافظه کش
- افزایش قابلیت اطمینان و پایداری سیستم با استفاده از توازن بار در زمان ذخیره دادهها
معایب:
- بار اضافی برای حافظهی کش
- افزایش ترافیک در شبکه
پیاده سازی Write Through در لاراول
// inside a cache service file
public function writeThrough($key, $data, $minutes) {
$cacheData = Cache::put($key, $data, $minutes)
// Database Server is called from(after) the Cache Server.
$this->storeToDB($cachedData)
return $cacheData
}
private function storeToDB($data){
Database::create($data)
return true
}
استراتژی Write Back (Write Behind)
در این روش دادهها در کش ذخیرهشده و از کش دریافت میشوند. پس از مدتی تاخیر، دادهها به صورت دستهای در دیتابیس ذخیره میشوند. این روش عملکرد بهتری در مدیریت حافظهی کش دارد.
مزایا:
- مدیریت بهتر در ذخیره اطلاعات نسبت به روش write Through
- کاهش هزینههای ذخیرهسازی دادهها در حافظه کش
- کاهش تعداد درخواستها به حافظهی اصلی
معایب:
- افزایش احتمال از دست رفتن دادهها در صورت قطعی برق
- افزایش پیچیدگی در امر مدیریت دادهها
- رخ دادن مشکلات پیشبینی نشده در ذخیرهسازی دادهها در کش (به علت احتمال قطعی برق و از دست رفتن دادهها)
پیاده سازی روش Write Back یا Write Behind
// inside a cache service file
$durationToFlush = 1; // (in minute)
$tempDataToFlush = [];
public function writeBack($key, $data, $minutes){
return $this->writeThrough($key, $data, $minutes);
}
public function writeThrough($key, $data, $minutes) {
$cacheData = Cache::put($key, $data, $minutes);
$this->storeForUpdates($cacheData);
return $cacheData;
}
// Stores new data to temp Array for updating
private function storeForUpdates($data){
$tempData = {};
$tempData['duration'] = this.getMinutesInMilli();
$tempData['data'] = data;
array_push($tempDataToFlush, data);
}
// Converts minutes to millisecond
private function getMinutesInMilli(){
$currentDate = now();
$futureDate = Carbon(Carbon::now()->timestamp + $this->durationToFlush * 60000)
return $futureDate->timestamp
}
// Calls to update the Database Server.
public function updateDatabaseServer(){
if($this->tempDataToFlush){
foreach($this->tempDataToFlush as $index => $obj){
if($obj->duration timestamp){
if(Database::create($obj->data)){
array_splice($this->tempDataToFlush, $index, 1);
}
}
}
}
}
هنگامی که دادهای در حافظهی کش نوشته میشود، ابتدا در یک آرایه نگهداری میشود و سپس با فراخوانی روش Write Through، این داده در کش ذخیره میشود. سپس تغییرات در دیتابیس ثبت میشود. برای بهروزرسانی دیتابیس، متد updateDatabaseServer اجرا میشود تا دادههای موجود در حافظهی کش را با دیتابیس همگام کند. من شخصا برای پیادهسازی این استراتژی در لاراول یک job مینویسم که هر ۱۰ دقیقه یکبار اجرا میشود و این متد را فراخوانی میکند تا این تداخل داده برطرف شود.
استراتژی Write Around
در این استراتژی دادهها بهصورت مستقیم در سرور اصلی ذخیره میشوند تا از احتمال دسترسی به دادههای قدیمی و نامعتبر در حافظه کش جلوگیری شود. از مزایای دیگر استفاده از استراتژی Write Around میتوان به کاهش زمان پاسخگویی و افزایش دقت دادهها اشاره کرد. با این حال یکی از معایب این روش این است که دادههایی که بیش از حد کوچک هستند (مثلاً یک رکورد) برای هر درخواست به سرور اصلی ارسال میشوند، که باعث افزایش ترافیک شبکه و محدودیت در عملکرد سرور میشود. به همین دلیل، استفاده از این روش بیشتر برای دادههایی با اندازهی بزرگ و پر کاربرد مناسب است.
استراتژی Write Around این قابلیت را دارد تا اگر دادههایی که در حافظهی کش ذخیره شده اند کمتر استفاده شوند، آنها را از حافظهی کش حذف نماید. به عبارت دیگر، در این روش اگر انتظار میرود یک داده بعداً استفاده شود، آن را به حافظه کش اضافه نمیکنیم. در این حالت دادهها مستقیماً به حافظه اصلی فرستاده میشوند و در صورت لزوم از حافظه اصلی فراخوانی میشوند.
مزایا:
- کنترل بیشتر روی حافظهی کش، زیرا تنها دادههایی که واقعا نیاز به ذخیرهسازی در حافظهی کش دارند، در آن قرار میگیرند.
- جلوگیری از پر شدن حافظهی کش با دادههای بیاهمیت که میتوانست باعث کاهش عملکرد سیستم شود.
معایب:
- کاهش سرعت دسترسی به دادهها در صورتی که دادههایی مورد نیاز در حافظهی کش نباشند.
- افزایش دسترسی به دیسک، در صورتی که دادهها در حافظهی کش نباشند، باید به دیسک مراجعه شود که میتواند باعث کاهش عملکرد سیستم شود.
پیادهسازی استراتژی Write Around
// inside a cache service file
public function writeAround($data) {
$storedData = Database::create($data);
return $storedData;
}
public function readOperation($key, $minutes){
$cacheData = Cache::remember($key, $minutes, function() {
return Article::all();
})
return $cacheData;
}
استراتژی Cache Aside (Lazy Loading)
استراتژی Cache Aside یکی از رایجترین روشهای کشکردن دادهها در سیستمهای توزیعشده است. در این روش، ابتدا در صورتی که درخواست برای یک داده جدید ارسال شود، سیستم ابتدا به حافظهی کش مراجعه میکند و در صورت وجود در حافظهی کش، داده را بازگردانده و در صورت عدم وجود در حافظهی کش، به پایگاهداده دسترسی پیدا میکند و دادهها را از آنجا بازیابی میکند و سپس حافظهی کش را بهروزرسانی میکند.
این روش به دلیل کاهش تعداد درخواستها به دیتابیس، عملکرد بهتری دارد و همچنین حافظهی کش به صورت مستقل مدیریت میشود که این باعث میشود این روش قابلیت مقیاسپذیری بیشتری داشته باشد. در این روش دادههای قدیمی همچنان در حافظهی کش قرار میگیرند و باعث اشغال فضای بیشتر حافظهی کش میشوند که میتواند باعث بروز مشکلات در کارکرد سیستم شود. همچنین، این روش برای دادههایی که به طور مکرر درخواست میشوند مناسب نیست و باعث بروز مشکلات در کارکرد سیستم میشود.
یکی دیگر از مشکلات این روش این است که همیشه هنگام اجرای اولین درخواست Cache Miss اتفاق میافتد و یک فشار زیادی به سرور و پایگاه داده وارد میشود. Cache Miss زمانی اتفاق میافتد که سرور برای دریافت دادهها به کش مراجعه میکند اما دادهای یافت نمیشود.
مزایا
- این روش ساده و قابل فهم است و معمولاً برای سیستمهای با حجم داده کم مناسب است.
- به دلیل جداسازی کش از منبع اصلی داده، در صورت خرابشدن کش، منبع اصلی داده هیچ تغییری نمیکند و اطلاعات دقیق و معتبری را به کاربران ارائه میدهد.
- کاهش بار ترافیک روی دیتابیس
- پایداری بالاتر سیستم
معایب
- ممکن است اطلاعات در حافظهی کش با اطلاعات موجود در پایگاه داده هماهنگ نباشد
- افزایش حجم حافظهی مصرفی
- فشار زیاد روی سرور در زمان اجرای اولین درخواست (Cache Miss)
پیادهسازی روش Cache Aside
// inside a cache service file
public function lazyLoadingStrategy($key, $minutes, $callback) {
if (Cache::has($key)) {
$data = Cache::get($key);
return $data;
} else {
// Database Server is called outside the Cache Server.
$data = $callback();
Cache::set($key, $data, $minutes);
return $data;
}
}
استراتژی Read Through
در استراتژی Read Through در صورتی که دادهای در حافظهی کش وجود نداشته باشد، ابتدا دادهها را از دیتابیس دریافت کرده و در حافظهی کش ذخیره میکند. سپس داده را به کاربر برگرداند. این روش از تعامل کمتر با دیتابیس و همچنین کاهش تعداد درخواستها به پایگاهداده استفاده میکند.
در واقع این روش مشابه روش Cache Aside است، با این تفاوت که در استراتژی Cache Aside، خود کش مسئول بهروزرسانی خودش است. اما در Read Through پایگاه داده مسئول بهروزرسانی کش است. به عبارت دیگر در روش Cache Aside هنگامی که دادهها در پایگاهداده بهروزرسانی میشوند، کش نیز باید بهروزرسانی شود تا باعث ایجاد تداخل بین دادههای کش و پایگاهداده نشود. اما در Read Through هنگامی که دادهها بهروزرسانی میشوند، کش از دادههای جدید خبر ندارد و در درخواستهای بعدی دادههای بهروزرسانیشده را برمیگرداند.
مزایا
- هماهنگی خوبی با دادههای دیتابیس دارد
- در صورتی که درخواستهای مکرر به دادههای خاص وجود داشته باشد، این روش مناسب خواهد بود
- مصرف کمتر حافظه نسبت به روش Cache Aside
معایب
- در صورتی که دادههای پر استفاده در سیستم پایگاهداده تغییر کنند، باعث ایجاد overhead میشود و درخواستهای بعدی با افت سرعت روبرو میشوند.
- در صورتی که دادههای پر استفاده از سمت کاربران تغییر کنند، باعث ایجاد اشکال در برنامه میشود.
پیادهسازی استراتژی Read Through در لاراول
// inside a cache service file
public function readThrough($key, $minutes) {
$data = Cache::find($key, $minutes);
return $data;
}
private function find($key, $minutes){
if(Cache::has($key);){
return Cache::get($key);
}
// Database Server is called from the Cache Server.
$DBdata = Database::find($key);
Cache:put($key, $DBdata, $minutes);
return $DBdata;
}
ما استراتژیهای caching را بررسی کردیم و با نحوهی عملکردشان آشنا شدیم. باید در انتخاب استراتژی مناسب Caching شرایط پروژه را از جهات مختلف بسنجیم، مزایا و معایب آنها را درک کنیم تا با دید بهتری مناسب ترین گزینه را انتخاب کنیم. امیدواریم که این پست
نتیجهگیری
به طور خلاصه، پس از بررسی استراتژیهای Caching، میتوان نتیجهگیری کرد که هر روش مزایا و معایب خود را دارد و انتخاب روش مناسب باید با توجه به نیازهای خاص هر پروژه انجام شود. در نهایت، مهمترین نکته این است که Caching به عنوان یکی از ابزارهای اصلی بهینهسازی عملکرد سامانههای پرترافیک و پربار استفاده میشود. در پایان اگر سوالی در مورد Caching Strategy دارید در قسمت نظرات مطرح کنید تا شخصا پاسخ دهم.
اگر این پست برای شما مفید بود از شما دعوت میکنم آن را در شبکههای اجتماعی به اشتراک بگذارید.
دیدگاهها
دیدگاهی ثبت نشده است