استراتژیهای کش کردن اطلاعات ۱ : یکی از مواردی که میتواند بهبود سرعت یک نرمافزار را تضمین کند، caching میباشد. cache یکی از مواردی است که شاید در توسعه یک نرم افزار خیلی کمتر برای آن وقت میگذاریم و زیاد مورد توجه قرار نمیگیرد. لازم به ذکر است که داشتن یک سیستم cache برای نرم افزارهای در مقایس بزرگ، نیازی ضروری به حساب میآید تا بتوان با سرعتی بهتر و قابل قبولتر (به نسبت سیستم بدون cache) به درخواستهای کاربران جواب داد و یک حس خوب از نرم افزار را به کاربران منتقل کرد.
قبل از شروع به پیاده سازی یک سیستم caching، ابتدا نیاز است با روشهای مختلف آن آشنا شویم و سپس اقدام به پیاده سازی و یا استفاده از یک سیستم cache کنیم. بدون شک انتخاب روشی مناسب، تاثیر چشم گیری را بر روی نتیجهی خروجی خواهد داشت. با ما در ادامه همراه شوید.
پایین آوردن زمان پاسخ (Response Time) به درخواستهای ارسالی کاربران و پایین آوردن بار ترافیکی بر روی دیتابیس.
استراتژیهای مختلفی که در ادامه در مورد آنها صحبت خواهیم کرد، وابستگی به نوع data و چگونگی دسترسی به آنها دارد؛ برای مثال اطلاعات چگونه ذخیره و خوانده میشوند که میتوان به چند مثال زیر اشاره کرد :
– آیا نرم افزار مورد نظر، اطلاعات زیادی را در دیتابیس ذخیره میکند و به نسبت آن، کمتر واکشی (read) اطلاعات را داریم؟ (مانند ثبت وقایع )
– آیا اطلاعات، یک بار نوشته خواهند شد و به کرّات واکشی میشوند؟ (مانند پرفایل کاربران یا اطلاعات یک کالا در یک فروشگاه اینترنتی)
Cache-Aside
میتوان این روش را یکی از متداولترین و یا آشناترین روشهای caching دانست و شاید حداقل یک بار، کارکردن با آن را تجربه کردهایم.
در این رویکرد، برنامه به صورت مستقیم هم با دیتابیس اصلی کار میکند و هم cache.
نحوهی کار به این صورت میباشد که:
۱- برنامه ابتدا cache را بررسی میکند میکند و اگر اطلاعات مورد نظر در cache یافت شود، اطلاعات به کاربر برگشت داده میشوند.
۲- اگر اطلاعات مورد نظر در cache یافت نشود، برنامه همان درخواست را به دیتابیس میفرستد و اطلاعات را به کاربر برمیگرداند؛ همچنین موظف است اطلاعات دریافتی از دیتابیس را در cache ذخیره کند تا در دفعات بعدی آنرا از cache، واکشی کند.
– اگر
cache به هر دلیلی از کار بیفتد، سیستم میتواند به کار خود ادامه دهد.
– اگر در نرم افزار شما درخواستهای خواندن اطلاعات، بیشتر است و اطلاعات حالت استاتیک (به ندرت تغییر میکنند) را دارند، این مدل میتواند راه حل خوبی باشد. موارد پیشنهادی برای این حالت، Redis و Memcached هستند.
public object GetMyEntity(int key) { // Try to get the entity from the cache. var value = cache.StringGet(key); if (value == null) // Cache miss { // If there's a cache miss, get the entity from the original store and cache it. value = db.StringGet(key); // Avoid caching a null value. if (value != null) { // Put the item in the cache with a custom expiration time that cache.StringSetAsync(key, JsonConvert.SerializeObject(value)); } } return value; }
Read-Through Cache
در این حالت دیتابیس و cache به صورت پشت سر هم (in-line) قرار دارند و نحوه کار به این صورت است که همیشه درخواستها در ابتدا به cache ارسال میشوند. تنها تفاوت این روش با روش قبل این است که برنامهی ما همیشه با cache صحبت میکند.
مزایا و معایب
Write-Through Cache
در این حالت اطلاعات ابتدا در cache ذخیره خواهند شد و بعد از آن در دیتابیس قرار خواهند گرفت. همچنین همانند روش Read-Through، برنامه همیشه با cache صحبت میکند.
این روش همهی مزایای روش Read-Through را دارد به علاوه رفع معایب آن از جمله:
– ناسازگاری دادهها نمیتوانند اتفاق بیفتند؛ زیرا اطلاعات همیشه ابتدا در cache نوشته خواهند شد و بعد در دیتابیس؛ به همین خاطر اطلاعات در هر دو نسخه یکسان هستند.
– بعد از درج اطلاعات جدید، نیازی به warming نیست. به این دلیل که در ابتدا در cache ذخیره خواهند شد.