Memcached به زبان ساده
Memcached (بصورت MEM CASH DI تلفظ میشود) یک سامانه حافظه پنهان توزیعشده (distributed memory-caching system) و متنباز است که با کاهش لود دیتابیس، سرعت دسترسی به وبسایتهای داینامیک یا برنامهها را افزایش میدهد.
این سامانه معمولاً برای افزایش سرعت وبسایتهای استفاده کننده از پایگاهداده، با استفاده از ذخیره دادهها و اشیا در حافظه اصلی (RAM) برای کاهش تعداد دفعات خواندن داده از منبع داده خارجی (برای نمونه پایگاهداده) به کار میرود.
مفهوم cache کردن در سرور
وقتی درخواستی برای سرور شما ارسال میشود این درخواست تبدیل به Queryهای پایگاهداده شده و به پایگاهداده ارسال میشود و و نتیجه ی این جستوجو توسط سرور دریافت و برای درخواستدهنده ارسال میشود که این فرآیند در تعداد درخواستهای زیاد، منابع مصرفی سرور را بالا برده و سرعت ارسال نتایج را کاهش میدهد.
برای بهبود سرعت پاسخگویی سرور و استفاده ی بهینه از منابع سختافزاری، از مکانیزم کش در حافظه RAM سیستم استفاده میشود و نتایج مربوط به درخواستهای پرتکرار در RAM سیستم Cache میشود و به جای اینکه هر بار درخواست برای دیتابیس ارسال شود نتایج قبلی با سرعت از RAM خوانده شده و برای درخواستدهنده ارسال میشود که سرعت را بالا برده و در مصرف بهینه منابع هم موثر هست.
Memcached چیست؟
نرم افزار Memcached بصورت Open Source ارائه شده و مکانیزم کش کردن Objectها و به ویژه Queryها را در وبسایتها ی داینامیک بر عهده دارد تا سرعت ارسال نتایج را بالا ببرد. با استفاده از Memcached تعداد دفعات دسترسی به پایگاه داده کم شده و سرعت پاسخگویی وب سرور بالا می رود . در Memcached مکانیزم هایی برای منقضی شدن Objectهای کش شده و پاسخهای بازگشتی به کاربر دیده شده که اگر محتوایی تغییر کند یا نتیجه ای باید تغییر کند بلافاصله اینکار انجام بشود و نتایج اشتباه برای کاربر ارسال نشود.
این نرم افزار از حافظه ی RAM سیستم استفاده می کند که بیشترین سرعت را در پاسخگویی دارد و اگر فضای RAM بیش از حد اشغال شود ، بصورت خودکار نتایج قدیمی را از حافظه خارج می کند که فضای RAM آزاد شود.
معماری Memcached
این سامانه از معماری server-client استفاده میکند. سرورها هر کدام دارای یک آرایه ی نگاشت شامل مقادیر کلید-مقدار هستند، که کلاینتها این آرایه را پر کرده و از آن استفاده میکنند. اندازه کلیدها حداکثر ۲۵۰ بایت، و اندازه مقادیر حداکثر یک مگابایت است.
کلاینتها از کتابخانههای سمت کلاینت برای ارتباط با سرورها استفاده میکنند، که معمولاً سرویس خود را در پورت ۱۱۲۱۱ ارائه میدهند. هر کلاینتی تمام سرورها را میشناسد؛ سرورها با همدیگر ارتباط برقرار نمیکنند. اگر کلاینتی بخواهد مقدار متناظر با یک کلید را تنظیم کند یا بخواند، کتابخانه کلاینت ابتدا مقدار هش مربوط به کلید را محاسبه میکند تا سروری که باید استفاده شود را تعیین کند. سپس با سرور تماس میگیرد. سرور مقدار هش دیگری را برای کلید محاسبه میکند تا محل ذخیرهسازی یا خواندن کلید را محاسبه کند.
سرورها مقادیر را در حافظه اصلی (RAM) کامپیوتر ذخیره میکنند. اگر حافظه اصلی یک سرور پر شود، مقادیر قدیمیتر را نادیده میگیرد؛ بنابراین، کلاینتها باید با ممکشد به عنوان یک حافظهنهان گذرا رفتار کنند، و فرض نکنند که هر مقداری که در آن قرار داده شد همواره در آن خواهد ماند. ممکشدیبی و ممبیس در حالی که با پروتکل ممکشد سازگار هستند، ذخیرهسازی ماندگار نیز ارائه میدهند.
اگر تمام کتابخانههای کلاینت از الگوریتم هش یکسان برای مشخص کردن سرور استفاده کنند، آنگاه میتوانند به دادههای نهان شده یکدیگر دسترسی پیدا کنند؛ که بهطور آشکار این ویژگی مطلوب است.
مثال
فرض کنید در برنامه تحت وب، یکی از پرسوجوهایی که به پایگاهداده ارسال میشود منابع و زمان زیادی برای اجرا میخواهد. از سویی دیگر، نتیجهٔ این پرسوجو در اکثر زمانها ثابت است و ممکن است حداکثر ۵ دقیقه یکبار تغییر کند و همچنین از نظر برنامهنویس اشکالی ندارد که کاربر نتایج جدید را با پنج دقیقه تأخیر مشاهده کند. در این صورت میتوانیم نتیجه این پرسوجو را ابتدا از ممکشد درخواست کنیم، و اگر نتیجه در ممکشد یافت نشد، پرسوجوی واقعی را از پایگاهداده انجام دهیم و نتیجه را با اعتبار ۵ دقیقه در ممکشد ذخیره کنیم. در این صورت در هر بازه ۵ دقیقهای، تنها یک درخواست به پایگاهداده ارسال خواهد شد، و بقیه درخواستها از ممکشد و با سرعت بالا پاسخ داده خواهند شد.
در ادامه، مثال پیادهسازی با زبان پیاچپی انجام میدهیم. برای اینکار، ابتدا ممکشد را در تعدادی از ماشینهای سرور نصب و اجرا میکنیم. سپس در کد برنامه یک نمونه از شی ممکشد ایجاد میکنیم و این سرورها معرفی میکنیم:
$MEMCACHE_SERVERS = array(
“10.1.1.1”, //server 1
“10.1.1.2”, //server 2
“10.1.1.3”, //server 3
);
$memcache = new Memcache();
foreach ($MEMCACHE_SERVERS as $server) {
$memcache->addServer ( $server );
}
سپس میتوانیم از ممکشد به این صورت استفاده کنیم:
$result_of_slow_query = $memcache->get(“query_variable_name”);
if ($result_of_slow_query == false) {
$result_of_slow_query = query_result_from_database();
// Cache for 5 minutes
$memcache->set(“query_variable_name”, $result_of_slow_query, 0, 5 * 60);
}
مزایای استفاده از Memcached
- پاسخگویی در کسری از میلیثانیه
- سادگی پیاده سازی آن
- مقیاسپذیری: معماری توزیع شده و multithreaded آن، مقیاسپذیری را چه به صورت افقی (افزایش تعداد سرورها) و چه به صورت عمودی (افزایش منابع سرور) آسان میکند.
مقایسه Memcached و Redis
از آنجایی که هر دوی اینها برای موارد مشترکی مانند cache میتوانند استفاده شوند همواره مقایسهای بین آنها انجام میشود اما با توجه به تغییرات Redis در ورژنهای بالاتر تقریبا انتخاب Redis امری بدیهی هست.
در پارامترهای زیادی از جنبههای مختلف می توان این دو را بررسی کرد اما به طور خاص در این ۳ پارامتر که در ادامه اشاره می شود Redis کاملا برتر هست:
- تفاوت بزرگ آنها در نوع دادههایی هست که نگه میدارند. Memcached فقط توانایی ذخیره نوع ساده رشته را به عنوان مقدار دارد در صورتی که Redis دارای ۵ نوع Data Type اصلی هست که در پست Redis به آنها اشاره شده است. از آنجایی که Redis دارای Data Typeهای بیشتری هست استفاده از آن میتواند باعث سهولت در نگهداری ساختارهای دادهای پیچیده تر و کاربرد های متفاوتتری بشود.
- تفاوت بعدی در بحث Memory usage هست که Redis عملکرد بهتری داد به خصوص در بحث آزادسازی سریع فضای RAM استفاده شده بعد از flush کردن دادهها.
- مورد بعدی persistence هست که Redis به صورت پیشفرض مکانیزم های کاملی برای آن دارد در صورتی که Memcached نیاز به ابزار های 3rd party برای dump گرفتن دادهها دارد.
وب سایت های مطرحی که از Memcached استفاده می کنند:
زبانهایی که Memcached ساپورت میکند:
- Python
- Java
- PHP
- C/C#/C++
- Perl
- Go
- Ruby
- JavaScript
- Node.js
- ASCII protocol
- Binary protocol
- TCP & UDP protocols