کش (Caching) چیست؟ راهنمای کامل + مقایسه Redis، Memcached، Varnish و CDN

اگر سایت شما کند است یا سرور زیر بار زیاد نفسنفس میزند، احتمالاً بزرگترین راهحلتان یک کلمه است: کش (Caching). کش یکی از مؤثرترین تکنیکهای افزایش سرعت است که با ذخیرهی نتایج پرتکرار، از انجام دوبارهی کارهای سنگین جلوگیری میکند. اما کش فقط «یک افزونه» نیست؛ یک لایهی معماریِ کامل با انواع، استراتژیها و ظرافتهای فنیِ خاص خودش است. در این راهنمای جامع و فنی، از مکانیزم کش و هدرهای HTTP گرفته تا Redis و Varnish و ابزارهای کش وردپرس (مثل LiteSpeed Cache و WP Rocket) را کامل بررسی میکنیم.
کش (Caching) چیست؟
کش یعنی ذخیرهی موقتِ دادههایی که زیاد استفاده میشوند، در جایی سریعتر و نزدیکتر، تا دفعهی بعد بهجای تولید دوباره، فوراً از همان نسخهی ذخیرهشده استفاده شود. بدون کش، هر بار که کسی صفحهی سایت شما را باز میکند، سرور باید کد را اجرا کند، به دیتابیس کوئری بزند و صفحه را از نو بسازد. با کش، این نتیجه یکبار ساخته و ذخیره میشود و دفعات بعد بدون این پردازش سنگین تحویل داده میشود.
تشبیه ساده: کش مثل این است که یک آشپز بهجای پختنِ دوبارهی غذا برای هر مشتری، چند پرس آماده در دسترس داشته باشد. سریعتر و کمهزینهتر.
کش چطور کار میکند؟ Hit، Miss و نرخ برخورد
دو مفهوم پایهای اینجا مطرح است:
- برخورد (Cache Hit): نسخهی معتبرِ درخواست در کش وجود دارد و مستقیم و سریع تحویل داده میشود.
- عدمبرخورد (Cache Miss): نسخهای در کش نیست (یا منقضی شده)؛ پس درخواست به سرور اصلی میرود، نتیجه ساخته و در کش ذخیره میشود تا دفعهی بعد Hit شود.
معیار کلیدیِ سنجش، نرخ برخورد کش (Cache Hit Ratio) است: نسبت برخوردها به کل درخواستها، یعنی برخوردها ÷ (برخوردها + عدمبرخوردها). برای فایلهای استاتیک روی یک CDNِ درست، این نرخ معمولاً بالای ۹۰٪ و اغلب ۹۵ تا ۹۹٪ است. نکتهی مهم: نرخِ ۱۰۰٪ همیشه هدف نیست؛ سایتهایی با محتوای پویا و شخصی، بهطور طبیعی نرخ پایینتری دارند و این اشکالی ندارد.
چرا کش اینقدر مهم است؟
- سرعت بیشتر: صفحات و دادهها بسیار سریعتر تحویل میشوند.
- کاهش بار سرور: پردازش و کوئریهای تکراری حذف میشوند و سرور ظرفیت بیشتری پیدا میکند.
- مقیاسپذیری: با کش، سرور میتواند کاربران بیشتری را همزمان سرویس دهد.
- بهبود سئو و تجربهی کاربری: سرعت روی Core Web Vitals و رتبه اثر مستقیم دارد.
انواع کش و توضیح هرکدام
کش در لایههای مختلفی از یک سیستم رخ میدهد و هر نوع، کارِ متفاوتی انجام میدهد. بیایید هرکدام را دقیق بشناسیم:
- کش مرورگر (Browser Cache): فایلهای استاتیک (عکس، CSS، JavaScript، فونت) روی دستگاهِ خودِ کاربر ذخیره میشوند تا در بازدیدهای بعدی دوباره دانلود نشوند. این کش با هدرهای HTTP کنترل میشود و نزدیکترین لایه به کاربر است.
- کش CDN / لبه (Edge Cache): نسخههایی از محتوا در سرورهایی در سراسر جهان (نقاط حضور یا PoP) ذخیره میشود تا از نزدیکترین نقطه به کاربر تحویل داده شود؛ هم سریعتر و هم با فشار کمتر روی سرور اصلی.
- کش پروکسی معکوس (Reverse Proxy): کل پاسخِ HTTP در یک لایهی جلوییِ سرور اپلیکیشن ذخیره میشود (مثل Varnish یا Nginx FastCGI). در صورت برخورد، اصلاً سرور اصلی و PHP درگیر نمیشوند.
- کش صفحه (Full-Page Cache): کل HTMLِ ساختهشدهی یک صفحه ذخیره میشود تا بدون اجرای PHP و کوئری دیتابیس، مستقیم تحویل داده شود. مناسب صفحات عمومی و پربازدید.
- کش آبجکت (Object Cache): نتیجهی عملیاتهای پرهزینه (کوئری دیتابیس، پاسخ API، قطعات محتوا) بهصورت کلید-مقدار در حافظه ذخیره میشود (معمولاً Redis یا Memcached). مزیت مهم: به صفحات پویا و کاربرانِ لاگینشده هم کمک میکند، جایی که کش صفحه کارایی ندارد.
- کش اپکد (PHP OPcache): کدِ PHP یکبار به بایتکدِ کامپایلشده تبدیل و در حافظه نگه داشته میشود تا در هر درخواست دوباره تفسیر و کامپایل نشود. این کش داخلِ خودِ رانتایم PHP است و تأثیر زیادی دارد.
- کش دیتابیس (Database Cache): نتیجهی کوئریهای پرتکرار ذخیره میشود. (نکته: کشِ داخلیِ کوئریِ MySQL از نسخهی ۸ حذف شده و امروز این نقش را کشهای بیرونی مثل Redis بر عهده دارند.)
لایههای کش؛ داده چطور سریع میرسد؟
ایدهی کلی این است: هرچه درخواست در لایهای نزدیکتر به کاربر پاسخ داده شود، سریعتر و ارزانتر است. اگر پاسخ در کش مرورگر یا CDN باشد، اصلاً به سرور شما نمیرسد. اگر نباشد، کش صفحه و سپس کش آبجکت (Redis) بررسی میشوند و تنها در نهایت به دیتابیس مراجعه میشود.
کش مرورگر و هدرهای HTTP
کش مرورگر با هدرهای HTTP کنترل میشود؛ همان دستورهایی که به مرورگر و CDN میگویند یک پاسخ را چقدر و چطور نگه دارند. مهمترین هدر، Cache-Control است:
| دستور (Directive) | معنی |
|---|---|
max-age=N | پاسخ تا N ثانیه «تازه» است |
s-maxage=N | مثل max-age اما فقط برای کشهای اشتراکی (CDN)؛ آنها را جدا تنظیم میکند |
public | اجازهی ذخیره در کش اشتراکی |
private | فقط در کش خصوصیِ مرورگر ذخیره شود (محتوای شخصی هر کاربر) |
no-cache | ذخیره میشود اما پیش از هر استفاده باید با سرور اعتبارسنجی شود |
no-store | اصلاً در هیچ کشی ذخیره نشود (معنیِ واقعیِ «کش نکن») |
stale-while-revalidate=N | نسخهی قدیمی سرو شود و در پسزمینه تازهسازی شود |
immutable | محتوا تا زمان تازگی تغییر نمیکند؛ مرورگر حتی با رفرش، اعتبارسنجی نمیکند |
⭐ نکتهی مهمی که اغلب اشتباه میشود:no-cacheبهمعنای «کش نکن» نیست! یعنی «ذخیره کن اما قبل از استفاده اعتبارسنجی کن». دستوری که واقعاً میگوید هرگز ذخیره نشود،no-storeاست.
اعتبارسنجی و پاسخ ۳۰۴: وقتی نسخهی کششده منقضی میشود، مرورگر بهجای دانلود دوباره، میپرسد «آیا تغییر کرده؟». این کار با دو ابزار انجام میشود:
- ETag: یک «اثر انگشت» که سرور برای هر نسخه میسازد. مرورگر آن را با
If-None-Matchمیفرستد؛ اگر تغییر نکرده باشد، سرور304 Not Modifiedبدون بدنه برمیگرداند (صرفهجویی در پهنای باند). - Last-Modified: زمانِ آخرین تغییر؛ مرورگر با
If-Modified-Sinceهمان جریان ۳۰۴/۲۰۰ را انجام میدهد. وقتی هر دو موجود باشند، ETag اولویت دارد.
ترکیب هوشمندانه مثل Cache-Control: public, max-age=300, s-maxage=3600 یعنی مرورگر ۵ دقیقه و CDN یک ساعت نگه دارد.
کش صفحه و پروکسی معکوس: Varnish و Nginx
Varnish یک «شتابدهندهی HTTP» یا پروکسی معکوس است که جلوی وبسرور قرار میگیرد و کل صفحات را کش میکند. اگر نسخهی کششده داشته باشد، بدون درگیرکردن وبسرور و PHP فوراً پاسخ میدهد. Varnish با زبان قدرتمندِ VCL پیکربندی میشود (که به C کامپایل و در حافظه اجرا میشود) و با ESI میتواند یک صفحه را از قطعاتِ کششده و پویا کنار هم بسازد. نکته: نسخهی متنبازِ Varnish بهتنهایی HTTPS ندارد و به یک لایهی جداگانه برای TLS نیاز دارد.
Nginx FastCGI Cache جایگزینِ محبوب دیگری است: پاسخِ PHP-FPM را کش میکند و در صورت برخورد، اصلاً PHP اجرا نمیشود. با قوانین Bypass میتوان صفحات لاگینشده و سبد خرید را از کش مستثنا کرد.
کش آبجکت: Redis در برابر Memcached
دو ابزار محبوب برای کش آبجکت در حافظه (In-Memory)، Redis و Memcached هستند. هر دو داده را در RAM نگه میدارند و بسیار سریعاند، اما تفاوتهای مهمی دارند:
| ویژگی | Redis | Memcached |
|---|---|---|
| ساختار داده | غنی: رشته، لیست، هش، مجموعه، Sorted Set، Stream و... | فقط کلید-مقدار ساده |
| ذخیرهی دائمی (Persistence) | دارد (RDB و AOF) | ندارد (با ریاستارت پاک میشود) |
| پردازش | تکرشتهای برای اجرا (اتمیک) + I/O چندرشتهای | کاملاً چندرشتهای |
| حداکثر اندازهی مقدار | تا ۵۱۲ مگابایت | پیشفرض ۱ مگابایت |
| مقیاسپذیری | Replication، Cluster و Sentinel | بدون کلاسترِ بومی (شاردینگ سمت کلاینت) |
در بیشتر پروژههای امروزی، Redis بهخاطر انعطاف و امکاناتش انتخاب اول است؛ Memcached برای کش ساده، سبک و پرسرعتِ کلید-مقدار هنوز گزینهی خوبی است. یک نکتهی مهمِ ۲۰۲۶: بهدلیل تغییر مجوز Redis در سالهای اخیر، یک نسخهی متنبازِ کاملاً سازگار به نام Valkey (تحت حمایت بنیاد لینوکس و ابرشرکتها) شکل گرفته که حالا در بسیاری از سرویسهای ابری، گزینهی پیشفرض است.
کش اپکد (OPcache) و کش دیتابیس
OPcache یک افزونهی داخلیِ PHP است که کدِ کامپایلشده را در حافظه نگه میدارد تا در هر درخواست دوباره کامپایل نشود. فعالبودن OPcache یکی از سادهترین و مؤثرترین بهینهسازیها برای هر سایتِ PHP (از جمله وردپرس) است. در سمت دیتابیس هم، چون کشِ داخلیِ کوئریِ MySQL حذف شده، امروز نتایج کوئریهای سنگین را در یک کش آبجکت مثل Redis نگه میدارند.
کش CDN و لبه (Edge) در ۲۰۲۶
CDN (شبکهی توزیع محتوا) محتوای شما را در نقاط حضورِ پراکنده در جهان کش میکند تا از نزدیکترین نقطه به کاربر تحویل داده شود (برای آشنایی بیشتر: CDN چیست). یک مفهوم مهم، Origin Shield است: یک لایهی کشِ میانی بین لبهها و سرور اصلی که درخواستهای تکراری را ادغام میکند و فشار روی سرور اصلی را بهشدت کاهش میدهد. CDNهای مدرن مثل Cloudflare حالا امکاناتی مثل کشِ لایهای، ذخیرهی پایدار و محاسبات لبه (Edge Compute) هم دارند که کد را نزدیک کاربر اجرا میکند.
استراتژیهای نوشتن در کش
وقتی دادهای تغییر میکند، چطور همزمان کش و پایگاهداده بهروز شوند؟ سه استراتژی اصلی وجود دارد:
| استراتژی | چطور کار میکند | نکته |
|---|---|---|
| Write-through | همزمان کش و پایگاهداده بهروز میشوند | سازگاری بالا، اما نوشتن کندتر |
| Write-back | اول کش، سپس بهصورت ناهمگام در پایگاهداده | نوشتن سریع، اما ریسک از دست رفتن داده |
| Write-around | نوشتن مستقیم در پایگاهداده و دورزدن کش | از آلودگیِ کش جلوگیری میکند، اما خواندنِ بعدی Miss میشود |
سیاستهای حذف (Eviction Policy)
حافظهی کش محدود است؛ وقتی پر میشود، کش باید تصمیم بگیرد چه چیزی را حذف کند. رایجترین سیاستها:
| سیاست | چه چیزی را حذف میکند |
|---|---|
| LRU (کماستفادهترین اخیر) | موردی که مدتهاست استفاده نشده |
| LFU (کمتکرارترین) | موردی که کمترین دفعات استفاده شده |
| FIFO | قدیمیترین موردِ واردشده، صرفنظر از استفاده |
| TTL (زمان انقضا) | موردی که زمان اعتبارش تمام شده |
| Random | یک مورد تصادفی (سربارِ کم) |
برای مثال، Redis سیاستهای متنوعی مثل allkeys-lru و volatile-ttl دارد که با تنظیم maxmemory-policy انتخاب میشوند.
باطلسازی کش و چالشهای آن
کش یک چالش کلاسیک دارد: «چه زمانی نسخهی قدیمی را دور بریزیم؟» روشهای باطلسازی:
- انقضای TTL: سادهترین راه؛ برای صفحات پویا معمولاً ۶۰ تا ۳۰۰ ثانیه.
- پاکسازی دستی (Purge): حذف یک آدرس مشخص هنگام تغییر محتوا.
- برچسب کش (Cache Tags): باطلکردن یک گروه از صفحات با یک برچسب.
- نسخهگذاری فایل (Cache-Busting): بهترین روش برای فایلهای استاتیک؛ با اثرانگشت در نام فایل (مثل
app.9a7f3.js)، هر تغییر یک آدرسِ جدید میسازد و اصلاً نیازی به باطلسازی نیست.
چند چالش رایج که هر مهندسی باید بشناسد:
- هجوم به کش (Cache Stampede): وقتی یک کلیدِ پرطرفدار منقضی میشود و دهها درخواست همزمان میخواهند آن را بازسازی کنند و سرور را از پا درمیآورند. راهحل: قفلگذاری، ادغام درخواستها،
stale-while-revalidateو پخشکردن زمانهای انقضا. - نفوذ به کش (Cache Penetration): درخواستهای مکرر برای کلیدهای ناموجود که هر بار به دیتابیس میرسند. راهحل: کشکردن نتیجهی «یافت نشد» یا استفاده از Bloom Filter.
- بهمن کش (Cache Avalanche): وقتی کلیدهای زیادی همزمان منقضی میشوند و هجوم به دیتابیس میآید. راهحل: زمانهای انقضای متفاوت (Jitter) و کلاسترِ پرقابلیتدسترس.
یک ضربالمثل معروف در برنامهنویسی میگوید: «دو کار سخت وجود دارد؛ نامگذاری و باطلسازی کش.» بهترین باطلسازی، پرهیز از باطلسازی است: فایلهای استاتیک را نسخهگذاری کنید و برای محتوای پویا از TTL کوتاه استفاده کنید.
کش در وردپرس و ابزارهای آن
وردپرس محبوبترین سیستم مدیریت محتواست و خوشبختانه ابزارهای قدرتمندی برای کش دارد. مهمترین نکته این است که بدانید کش در دو سطح رخ میدهد: سطح افزونه (که PHP تا حدی اجرا میشود) و سطح سرور (که کاملاً جلوی وردپرس میایستد و پیش از اجرای PHP پاسخ میدهد و سریعترین است). بیایید مهمترین افزونهها را بشناسیم:
- LiteSpeed Cache (LSCache): افزونهی رایگان و متنبازِ بسیار قدرتمند. ⭐ نکتهی کلیدی: کش صفحهی خودکار و سریعِ آن، یک کش در سطح سرور است و فقط روی وبسرورِ LiteSpeed یا OpenLiteSpeed (یا از طریق CDNِ QUIC.cloud) فعال میشود. علاوه بر کش صفحه، امکاناتی مثل کش آبجکت (Redis/Memcached)، فشردهسازی CSS/JS، تولید Critical CSS، بهینهسازی تصویر (WebP/AVIF) و lazy load دارد که روی هر سروری کار میکنند. اگر هاست شما LiteSpeed دارد، این بهترین گزینهی رایگان است.
- WP Rocket: افزونهی پولی و بسیار آسان؛ بهمحض فعالشدن، کش را روشن میکند و ۸۰٪ بهینهسازیها را خودکار انجام میدهد (پیشبارگذاری، lazy load، حذف CSS بلااستفاده، تأخیر در اجرای JS). انتخاب عالی برای کسانی که راحتی میخواهند.
- W3 Total Cache: رایگان + نسخهی Pro؛ «چاقوی همهکاره» با کش صفحه، آبجکت، دیتابیس، مرورگر و قطعه، و اتصال به Redis/Memcached/CDN. بسیار قدرتمند اما برای مبتدیها پیچیده است.
- WP Super Cache: رایگان و ساختهی Automattic (شرکت پشت وردپرس)؛ فقط یک کار را خوب انجام میدهد: کشِ صفحهی استاتیک. گزینهی مطمئن و بیدردسر برای وبلاگها.
- WP Fastest Cache: رایگان + نسخهی پرمیوم با پرداختِ یکباره (Lifetime)؛ رابط ساده، کش صفحه، minify، WebP و پاکسازی دیتابیس.
- Redis Object Cache: افزونهی رایگان که یک کش آبجکتِ پایدار روی Redis اضافه میکند. توجه: این کش صفحه نیست، بلکه نتایج کوئریهای سنگین را کش میکند و دقیقاً برای سایتهای پویا، فروشگاهی و کاربرانِ لاگینشده (مثل WooCommerce) مفید است، جایی که کش صفحه کارایی ندارد.
جدول مقایسهی افزونههای کش وردپرس
| افزونه | رایگان/پولی | بهترین برای |
|---|---|---|
| LiteSpeed Cache | رایگان (متنباز) | سایتهای روی سرور LiteSpeed — بهترین عملکردِ رایگان |
| WP Rocket | پولی | کاربران غیرفنی که نتیجهی عالی با کمترین تنظیم میخواهند |
| W3 Total Cache | رایگان + Pro | مدیرانِ فنی که کنترل کامل هر لایه را میخواهند |
| WP Super Cache | رایگان | وبلاگها و سایتهای ساده، بیدردسر |
| WP Fastest Cache | رایگان + پرمیوم (یکباره) | بودجهی محدود و رابط ساده |
| Redis Object Cache | رایگان | سایتهای پویا/فروشگاهی که گلوگاهشان کوئری دیتابیس است |
قیمتها و جزئیات محصولات مدام تغییر میکنند؛ پیش از خرید، سایت رسمی هر افزونه را بررسی کنید.
نکتهی مهم دربارهی هاستهای مدیریتشده: بسیاری از هاستهای خوبِ وردپرس، خودشان کشِ سطحِ سرور (LiteSpeed یا Nginx) را فعال دارند. در این حالت، افزونهی کشِ اضافه نهتنها سرعت نمیآورد، بلکه ممکن است تداخل ایجاد کند. توصیه: روی این هاستها به کشِ خودِ سرور تکیه کنید و از افزونه فقط برای بهینهسازیهای غیرکشی (minify، lazy load، کش آبجکت) استفاده کنید. راهکارهای بیشترِ سرعت را در افزایش سرعت وردپرس ببینید.
بهترین شیوهها و اشتباهات رایج
- چه چیزی را کش کنیم: فایلهای استاتیک با TTL طولانی + نسخهگذاری، صفحات عمومی برای کاربرانِ ناشناس، و نتایج کوئریِ سنگین در کش آبجکت.
- چه چیزی را کش نکنیم: صفحات پویا و شخصی، سبد خرید، تسویهحساب، حساب کاربری و پیشخوان مدیریت. اینها را با
private/no-storeیا قوانین Bypass مستثنا کنید. - اشتباهات رایج: اشتباهگرفتنِ
no-cacheباno-store؛ کشکردن صفحاتِ دارای کوکیِ نشست (که دادهی یک کاربر به دیگری نشت میکند)؛ رویهمگذاشتنِ چند لایهی کشِ متداخل؛ و فراموشکردن نسخهگذاری هنگام انتشار (که نسخهی قدیمی نمایش داده میشود).
سوالات متداول
کش واقعاً سرعت سایت را زیاد میکند؟
بله، بهشدت؛ کش یکی از مؤثرترین راههای افزایش سرعت و کاهش بار سرور است، بهخصوص وقتی چند لایه با هم به کار روند.
Redis بهتر است یا Memcached؟
برای بیشتر پروژهها Redis بهخاطر انعطاف، ساختارهای داده و ذخیرهی دائمی بهتر است؛ Memcached برای کش ساده و سبک هنوز خوب است.
برای وردپرس کدام افزونهی کش را انتخاب کنم؟
اگر هاستتان LiteSpeed دارد، LiteSpeed Cache بهترین گزینهی رایگان است. برای راحتی و بدون دردسر، WP Rocket؛ برای کنترل فنی، W3 Total Cache؛ و برای سایتهای فروشگاهی/پویا، افزودن Redis Object Cache.
تفاوت کش سطح سرور و سطح افزونه چیست؟
کش سطح سرور (مثل LiteSpeed یا Nginx) پیش از اجرای PHP پاسخ میدهد و سریعتر است؛ کش افزونهای PHP را تا حدی اجرا میکند. رویهمگذاشتنشان معمولاً تداخل میآورد نه سرعت.
تفاوت no-cache و no-store چیست؟no-cache یعنی ذخیره کن اما قبل از استفاده اعتبارسنجی کن؛ no-store یعنی اصلاً ذخیره نکن. برای محتوای واقعاً حساس از no-store استفاده کنید.
آیا کش میتواند مشکل ایجاد کند؟
بله، اگر درست مدیریت نشود ممکن است محتوای قدیمی نشان دهد یا دادهی کاربران را نشت دهد. با تنظیم درست انقضا، قوانین Bypass و نسخهگذاری، این مشکلات حل میشوند.
جمعبندی
کش یکی از قدرتمندترین ابزارها برای سریعتر و مقیاسپذیرترکردن سایت شماست، اما یک «دکمهی جادویی» نیست؛ یک معماریِ چندلایه است که از هدرهای HTTP و کش مرورگر شروع میشود و تا CDN، Varnish، Redis و کش سطح سرور ادامه مییابد. با شناخت انواع کش، استراتژیهای نوشتن و باطلسازی، و انتخاب ابزار درست — بهخصوص در وردپرس با گزینههایی مثل LiteSpeed Cache و WP Rocket — میتوانید هم تجربهی کاربری و هم سئوی سایتتان را بهشکل چشمگیری بهبود دهید. فقط یادتان باشد: محتوای پویا و شخصی را کش نکنید و باطلسازی را درست مدیریت کنید تا کاربران همیشه محتوای تازه و درست ببینند.

علی کارشناس زیرساخت و شبکه است و سالها تجربهی مدیریت سرور و میزبانی وب دارد. در مقالههایش تجربههای عملیِ انتخاب و مدیریت سرور را به زبانی ساده به اشتراک میگذارد تا انتخاب درستی برای هر پروژه ممکن شود.
مقالههای بیشتر از علی محمدی ←

