مم‌کشد

**مِمکَشد** (به انگلیسی: Memcached) یک سامانه حافظه پنهان توزیع‌شده است. این سامانه معمولاً برای افزایش سرعت وب‌سایت‌های استفاده کننده از پایگاه‌داده، با استفاده از ذخیره داده‌ها و اشیا در حافظه اصلی (RAM) برای کاهش تعداد دفعات خواندن داده از منبع داده خارجی (برای نمونه پایگاه‌داده) به کار می‌رود.

## تاریخچه
ممکشد در سال ۲۰۰۳ توسط «برد فیتزپاتریک» برای استفاده در لایوجورنال توسعه داده شد.

## معماری
این سامانه از معماری کارخواه-کارساز استفاده می‌کند. سرورها هر کدام دارای یک آرایه انجمنی شامل مقادیر کلید-مقدار هستند، که کلاینت‌ها این آرایه را پر کرده و از آن استفاده می‌کنند. اندازه کلیدها حداکثر ۲۵۰ بایت، و اندازه مقادیر حداکثر یک مگابایت است.

کلاینت‌ها از کتابخانه‌های سمت کارخواه برای ارتباط با سرورها می‌کنند، که معمولاً سرویس خود را در درگاه ۱۱۲۱۱ ارائه می‌دهند. هر کلاینتی تمام سرورها را می‌شناسد؛ سرورها با همدیگر ارتباط برقرار نمی‌کنند. اگر کلاینتی بخواهد مقدار متناظر با یک کلید را تنظیم کند یا بخواند، کتابخانه کلاینت ابتدا مقدار درهم‌سازی کلید را محاسبه می‌کند تا سروری که باید استفاده شود را تعیین کند. سپس با سرور تماس می‌گیرد. سرور مقدار درهم‌سازی دیگری را برای کلید محاسبه می‌کند تا محل ذخیره‌سازی یا خواندن کلید را محاسبه کند.

سرورها مقادیر را در حافظه اصلی (RAM) کامپیوتر ذخیره می‌کنند. اگر حافظه اصلی یک سرور پر شود، مقادیر قدیمی‌تر را نادیده می‌گیرد؛ بنابراین، کلاینت‌ها باید ممکشد را به عنوان یک حافظه‌نهان گذرا رفتار کنند، و فرض نکنند که هر مقداری که در آن قرار داده شد همواره در آن خواهد ماند. ممکش‌دی‌بی و ممبیس در حالی که با پروتکل ممکشد سازگار هستند، ذخیره‌سازی ماندگار نیز ارائه می‌دهند.

اگر تمام کتابخانه‌های کلاینت از الگوریتم درهم‌سازی یکسان برای مشخص کردن سرور استفاده کنند، آن‌گاه می‌توانند به داده‌های نهان شده یکدیگر دسترسی پیدا کنند؛ که به‌طور آشکار این ویژگی مطلوب است.

یک استقرار معمولاً چندین سرور و چندین کلاینت دارد. با این حال، استفاده از ممکشد در یک کامپیوتر که هم سرور و کلاینت در آن اجرا می‌شوند امکان دارد.

## مثال
فرض کنید در برنامه تحت وب، یکی از پرس‌وجوهایی که به پایگاه‌داده ارسال می‌شود منابع و زمان زیادی برای اجرا می‌خواهد. از سویی دیگر، نتیجهٔ این پرس‌وجو در اکثر زمان‌ها ثابت است و ممکن است حداکثر ۵ دقیقه یکبار تغییر کند، و همچنین از نظر برنامه‌نویس اشکالی ندارد که کاربر نتایج جدید را با پنج دقیقه تأخیر مشاهده کنند. در این صورت می‌توانیم نتیجه این پرس‌وجو را ابتدا از ممکشد درخواست کنیم، و اگر نتیجه در ممکشد یافت نشد، پرس‌وجوی واقعی را از پایگاه‌داده انجام دهیم و نتیجه را با اعتبار ۵ دقیقه در ممکشد ذخیره کنیم. در این صورت در هر بازه ۵ دقیقه‌ای، تنها یک درخواست به پایگاه‌داده ارسال خواهد شد، و بقیه درخواست‌ها از ممکشد و با سرعت بالا پاسخ داده خواهند شد.

در ادامه، مثال پیاده‌سازی با زبان پی‌اچ‌پی انجام می‌دهیم. برای این‌کار، ابتدا ممکشد را در تعدادی از ماشین‌های سرور نصب و اجرا می‌کنیم. سپس در کد برنامه یک نمونه از شی ممکشد ایجاد می‌کنیم و این سرورها معرفی می‌کنیم:


```php
$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 );
}
```


سپس می‌توانیم از ممکشد به صورت استفاده کنیم:


```php
$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);
}
```


## کاربران سرشناس
از کاربران سرشناس ممکشد می‌توان به وب‌گاه‌های زیر اشاره کرد:
* یوتیوب
* ردیت
* فیس‌بوک
* تویتر
* ویکی‌پدیا

## کتابخانه‌های کلاینت در زبان‌های مختلف
* جاوا
* پرل
* پی‌اچ‌پی
* پایتون
* روبی

## منابع

## پیوند به بیرون
* سایت رسمی ممکشد

رده:ذخیره‌سازی ساخت‌یافته
رده:نرم‌افزارهای آزاد مدیریت حافظه
رده:نرم‌افزارهای چندسکویی
رده:نرم‌افزارهای ۲۰۰۳ (میلادی)
رده:نرم‌افزارهایی که از پروانه بی‌اس‌دی استفاده می‌کنند
رده:نهان‌سازی پایگاه داده