کش کردن (Caching) یکی از مؤثرترین روش‌های بهینه‌سازی عملکرد سایت است، و Memcached یکی از محبوب‌ترین و قدیمی‌ترین ابزارهای کش در حافظه است که میلیون‌ها وب‌سایت از آن استفاده می‌کنند. در این مقاله به‌طور کامل توضیح می‌دهیم Memcached چیست، چطور کار می‌کند، چه مزایایی دارد، چگونه از آن استفاده کنید، و با Redis چه تفاوتی دارد.

Memcached چیست؟

Memcached یک سیستم کش توزیع‌شده در حافظه (In-Memory Distributed Cache) است که در سال ۲۰۰۳ توسط Brad Fitzpatrick برای LiveJournal ساخته شد. هدف اولیه آن کاهش بار روی دیتابیس با ذخیره نتایج کوئری‌های پرتکرار در RAM بود.

Memcached یک سیستم Key-Value Store است—به هر تکه داده یک کلید (key) منحصربه‌فرد می‌دهید و بعداً با همان کلید داده را بازیابی می‌کنید. ذخیره‌سازی در RAM است، نه دیسک—به همین دلیل سرعت بازیابی داده بسیار بالاست.

یک تشبیه ساده: به جای اینکه هر بار برای گرفتن یک لیوان آب به چاه بروید، یک ظرف آب در آشپزخانه نگه می‌دارید. Memcached همان ظرف آب آشپزخانه است—دسترسی سریع‌تر به داده‌ای که قبلاً از منبع اصلی (دیتابیس) گرفته‌اید.

چرا Memcached اهمیت دارد؟

برای درک اهمیت Memcached باید یک واقعیت فنی ساده را بدانید: خواندن از RAM هزاران برابر سریع‌تر از خواندن از دیتابیس است.

یک کوئری SQL ساده روی یک جدول بزرگ ممکن است ۵۰–۲۰۰ میلی‌ثانیه طول بکشد. همان داده در RAM با Memcached در کمتر از ۱ میلی‌ثانیه بازیابی می‌شود. این تفاوت وقتی صدها یا هزاران کاربر همزمان دارید، بسیار معنادار می‌شود.

وقتی داده‌های پرکاربرد کش می‌شوند:

  • تعداد کوئری‌ها به دیتابیس کاهش می‌یابد—به MySQL فرصت استراحت می‌دهید
  • صفحات سریع‌تر لود می‌شوند—TTFB و LCP بهبود می‌یابند
  • سرور می‌تواند ترافیک بیشتری مدیریت کند با همان منابع
  • مصرف CPU کاهش می‌یابد—کوئری‌های کمتر = پردازش کمتر

معماری Memcached: چطور کار می‌کند؟

Memcached به‌عنوان یک سرویس مستقل روی سرور اجرا می‌شود و از طریق شبکه (TCP/IP) قابل دسترسی است. اپلیکیشن از طریق کتابخانه‌های مختلف (PHP، Python، Java و غیره) با آن ارتباط برقرار می‌کند.

جریان کار (Cache Flow)

  1. Cache Miss: اپلیکیشن داده‌ای می‌خواهد. ابتدا Memcached را با کلید مشخص چک می‌کند.
  2. اگر داده در کش نیست (Cache Miss)، از دیتابیس می‌خواند.
  3. نتیجه را در Memcached با یک کلید و مدت انقضا (TTL) ذخیره می‌کند.
  4. Cache Hit: در درخواست بعدی، داده مستقیماً از Memcached بازیابی می‌شود—دیتابیس درگیر نمی‌شود.
  5. بعد از انقضای TTL، داده از کش حذف می‌شود و در درخواست بعدی مجدداً از دیتابیس خوانده و کش می‌شود.

الگوریتم LRU (Least Recently Used)

وقتی حافظه Memcached پر می‌شود، قدیمی‌ترین داده‌هایی که کمتر استفاده شده‌اند (LRU) حذف می‌شوند تا جا برای داده‌های جدید باز شود. این مکانیزم به‌صورت خودکار کار می‌کند و نیازی به مدیریت دستی ندارد.

چه داده‌هایی را کش کنیم؟

Memcached برای هر داده‌ای مناسب نیست. بهترین کاندیداها:

نتایج کوئری‌های سنگین دیتابیس

کوئری‌هایی که روی جداول بزرگ اجرا می‌شوند، JOIN‌های پیچیده دارند، یا زمان قابل توجهی می‌برند. اگر این کوئری هر ثانیه ۱۰۰ بار اجرا می‌شود اما داده تغییر نمی‌کند، کش کردن آن بسیار سودمند است.

Session‌های کاربران

اطلاعات session کاربران لاگین‌شده یکی از پرتکررترین داده‌هاست. به جای ذخیره در فایل یا دیتابیس، Memcached گزینه بسیار سریع‌تری است. این به‌خصوص در محیط‌های چند سرور مزیت دارد—همه سرورها به همان کش مشترک دسترسی دارند.

نتایج API های خارجی

اگر از API خارجی (مثلاً سرویس پرداخت، نرخ ارز، یا هر سرویس دیگری) استفاده می‌کنید و داده‌های آن به‌طور مکرر تغییر نمی‌کند، کش کردن نتایج چند دقیقه‌ای می‌تواند سرعت پاسخ را بسیار بهبود دهد.

HTML محاسبه‌شده

بخش‌هایی از صفحه که ساختن‌شان زمان می‌برد—مثل ویجت‌های sidebar، لیست محصولات پرفروش، یا نتایج جستجو—می‌توانند به‌صورت HTML آماده کش شوند.

آبجکت‌های سنگین

آبجکت‌هایی که پردازش زیادی برای ساخت نیاز دارند—مثلاً نتیجه پردازش یک configuration پیچیده یا parse کردن یک فایل XML بزرگ.

چه چیزهایی را کش نکنیم؟

داده‌هایی که به‌طور مکرر تغییر می‌کنند (مثل موجودی لحظه‌ای)، داده‌های حساس که نباید در RAM مشترک باشند، و داده‌هایی که فقط یک بار استفاده می‌شوند.

Memcached در مقابل Redis

Redis هم یک سیستم کش در حافظه است که اغلب با Memcached مقایسه می‌شود. انتخاب بین آن‌ها به نیازهای پروژه بستگی دارد:

Memcached

  • سادگی بالا—فقط Key-Value رشته‌ای
  • بدون Persistence—با ریستارت سرور همه داده‌ها پاک می‌شوند
  • مصرف حافظه کمتر برای سناریوهای ساده
  • پشتیبانی از Multi-threading—از چند هسته CPU بهتر استفاده می‌کند
  • ایده‌آل برای: کش ساده، session store با حجم بالا

Redis

  • ساختارهای داده پیشرفته: Lists، Sets، Sorted Sets، Hashes، Streams
  • Persistence—می‌تواند داده‌ها را روی دیسک ذخیره کند
  • Pub/Sub برای messaging بین سرویس‌ها
  • Scripting با Lua
  • Transactions
  • ایده‌آل برای: Message Queue، Rate Limiting، Leaderboard، Session با قابلیت‌های پیشرفته

نتیجه: برای کش ساده، هر دو مناسب هستند. اگر به ساختارهای داده پیچیده یا Persistence نیاز دارید، Redis انتخاب بهتری است. اگر فقط به کش ساده و سریع نیاز دارید و می‌خواهید از چند thread استفاده کنید، Memcached هنوز گزینه خوبی است.

استفاده از Memcached در وردپرس

وردپرس از یک سیستم Object Cache داخلی دارد که به‌صورت پیش‌فرض فقط در طول یک درخواست داده‌ها را نگه می‌دارد (In-Request Cache). برای استفاده از Memcached به‌عنوان Object Cache دائمی بین درخواست‌ها:

  1. Memcached را روی سرور نصب کنید
  2. افزونه PHP memcached را نصب کنید
  3. فایل object-cache.php را در wp-content/ نصب کنید (معمولاً افزونه‌هایی مثل W3 Total Cache یا WP Memcached این کار را می‌کنند)
  4. در تنظیمات افزونه، Object Cache Backend را روی Memcached تنظیم کنید

با این تنظیم، نتایج کوئری‌های وردپرس (مثل get_posts، get_terms، و get_option) بین درخواست‌های مختلف کش می‌شوند و هر page load نیازی به تکرار همه کوئری‌ها ندارد.

نصب و پیکربندی Memcached

نصب روی Ubuntu/Debian

apt update
apt install memcached php-memcached
systemctl enable memcached
systemctl start memcached

نصب روی CentOS/RHEL

yum install memcached php-pecl-memcached
systemctl enable memcached
systemctl start memcached

تنظیمات اصلی (/etc/memcached.conf یا /etc/sysconfig/memcached)

  • -m: مقدار RAM اختصاصی به مگابایت (مثلاً -m 256 برای ۲۵۶ مگابایت)
  • -p: پورت (پیش‌فرض ۱۱۲۱۱)
  • -l: آدرس bind—برای امنیت باید 127.0.0.1 باشد
  • -c: حداکثر اتصالات همزمان

تست اتصال Memcached

می‌توانید با دستور زیر به‌صورت مستقیم با Memcached ارتباط برقرار کنید:

telnet 127.0.0.1 11211

سپس دستورات ساده‌ای مثل stats برای مشاهده آمار یا set mykey 0 60 5 hello برای ذخیره داده آزمایشی استفاده کنید.

نکات امنیتی مهم

Memcached به‌صورت پیش‌فرض هیچ احراز هویتی ندارد—هر کسی که به پورت ۱۱۲۱۱ دسترسی داشته باشد می‌تواند داده‌ها را بخواند یا بنویسد. رعایت نکات امنیتی زیر الزامی است:

  • فقط به localhost بایند کنید: -l 127.0.0.1 در پیکربندی — هرگز Memcached را روی آدرس public گوش ندهید
  • فایروال پورت ۱۱۲۱۱ را ببندید: با iptables یا ufw مطمئن شوید پورت از خارج قابل دسترس نیست
  • در محیط چند سرور: از شبکه خصوصی (private network) برای ارتباط بین سرورها استفاده کنید
  • اطلاعات حساس نگذارید: رمزعبور، کدهای اعتبارسنجی، و اطلاعات حساس نباید بدون رمزنگاری در Memcached ذخیره شوند

مانیتورینگ Memcached

برای بررسی عملکرد Memcached، دستور stats اطلاعات مفیدی می‌دهد. مهم‌ترین معیارها:

  • get_hits و get_misses: نسبت hit/miss. Hit Rate بالاتر از ۹۰٪ ایده‌آل است
  • evictions: تعداد آیتم‌هایی که به دلیل کمبود حافظه حذف شده‌اند—اگر زیاد است، باید RAM بیشتری به Memcached اختصاص دهید
  • curr_connections: تعداد اتصالات فعال
  • bytes: حجم داده‌های کش‌شده

سوالات متداول

آیا Memcached برای تمام سایت‌ها مفید است؟

نه—Memcached بیشترین تأثیر را روی سایت‌هایی دارد که کوئری‌های دیتابیس تکراری زیاد دارند یا داده‌های ثابتی که مکرراً خوانده می‌شوند. برای سایت‌های بسیار کوچک یا سایت‌هایی که هر صفحه‌شان کاملاً منحصربه‌فرد است، مزیت محسوسی ندارد.

با ریستارت سرور داده‌های Memcached پاک می‌شود؟

بله، Memcached Persistence ندارد و تمام داده‌های کش با ریستارت سرویس یا سرور پاک می‌شوند. این مشکل نیست—چون کش فقط نسخه‌های موقت داده‌هاست و همیشه می‌توان آن‌ها را از دیتابیس مجدداً بارگذاری کرد. فقط بعد از ریستارت باید مدتی صبر کنید تا کش مجدداً پر شود (Warm-up).

آیا Memcached و OPcache فرق دارند؟

بله، کاملاً متفاوت هستند. OPcache کد PHP را به‌صورت compiled در حافظه نگه می‌دارد تا Parse و Compile در هر درخواست تکرار نشود—عملاً سرعت اجرای PHP را بهبود می‌دهد. Memcached نتایج کوئری‌ها و داده‌های برنامه را کش می‌کند—یعنی اجرا می‌شود اما نتیجه از کش برمی‌گردد. هر دو را با هم استفاده کنید—تأثیرات مکمل یکدیگرند.

Memcached یا Redis برای وردپرس؟

هر دو برای Object Cache وردپرس مناسب هستند. Redis کمی محبوب‌تر شده چون قابلیت‌های بیشتری دارد و افزونه‌های وردپرس بیشتری از آن پشتیبانی می‌کنند. اما اگر VPS با منابع محدود دارید و فقط به Object Cache نیاز دارید، Memcached گزینه سبک‌تری است.

جمع‌بندی

Memcached یک ابزار قدرتمند و ساده برای کاهش بار دیتابیس و سرعت بخشیدن به سایت است. با کش کردن نتایج کوئری‌های تکراری در RAM، می‌توانید سرعت پاسخ را چند برابر کنید و ترافیک بیشتری را با همان منابع مدیریت کنید. اگر VPS یا سرور اختصاصی دارید و سایت شما از دیتابیس به‌طور مکرر استفاده می‌کند، نصب و پیکربندی Memcached یکی از ارزشمندترین کارهایی است که می‌توانید برای بهبود عملکرد انجام دهید—فقط نکات امنیتی را جدی بگیرید.