کشینگ (Caching) چیست؟ راهنمای ساده برای سازندگان برنامه
کشینگ یعنی نگه داشتن یک نسخه آماده از چیزی که گرفتنش کند یا پرهزینه بوده، تا درخواست بعدی برای آن سریع از همان کپی پاسخ داده شود. به کپی ذخیرهشده کش (cache) میگویند. مرورگر شما تصاویر را کش میکند تا سایت در بازدید دوم سریعتر باز شود؛ سرور نتیجه یک کوئری کند پایگاه داده را کش میکند تا برای هر بازدیدکننده مجبور نباشد آن را دوباره اجرا کند.
کشینگ برنامهها را سریعتر و اجرایشان را ارزانتر میکند. تنها معاوضه بزرگ آن این است که یک کپی ممکن است قدیمی شود.
چرا کشینگ وقتی با هوش مصنوعی میسازید مهم است
در برنامههای ساختهشده با هوش مصنوعی با کشینگ در سه حالت روبهرو میشوید:
- «برنامه را بهروز کردم اما هنوز نسخه قدیمی را میبینم.» این رایجترین لحظه کشینگ است و معمولاً بیخطر است — مرورگر یا یک CDN دارد یک کپی ذخیرهشده را نشان میدهد.
- سرعت. اگر صفحهای کند است چون برای هر بازدیدکننده همان اعداد را دوباره محاسبه میکند، کش کردن نتیجه میتواند آن را آنی جلوه دهد.
- هزینه. بسیاری از سازندگان برنامه و میزبانها برای محاسبات، زمان پایگاه داده و فراخوانیهای API بیرونی هزینه میگیرند. اگر هزار بازدیدکننده یک درخواست پرهزینه یکسان را فعال کنند، کش کردن به شما اجازه میدهد فقط یکبار هزینهاش را بدهید.
دانستن اصول پایه به شما امکان میدهد کشینگ را جایی که کمک میکند بخواهید و وقتی دلیل عجیببودن یک چیز است، آن را تشخیص دهید.
یک تشبیه روزمره
آشپزخانه یک کافه شلوغ را تصور کنید.
هر صبح، آشپز میتوانست هر قهوه را وقتی سفارش داده میشود، از دانه تازه آسیابشده دم کند. این کند است. بهجایش یک کتری قهوه فیلتری را از قبل روی گرمکن آماده نگه میدارد. بیشتر مشتریها در چند ثانیه فنجانی میگیرند — این یک کشهیت (cache hit) است. وقتی کتری تمام میشود، یکی دیگر قهوه تازه دم میکند — یک کشمیس (cache miss).
اما قهوهای که خیلی بماند بیات میشود، پس کافه قانونی دارد: هر کتری که بیش از ۳۰ دقیقه گذشته را دور بریزند. آن قانون زمان انقضای کش است. کسی یک کتری را تمام روز نگه نمیدارد، و کسی سفارش اختصاصی یک نفر با شیر جو و سه قاشق شکر را از قبل دم نمیکند — بعضی چیزها اصلاً نباید کش شوند.
کشها کجا قرار دارند
یک بارگذاری صفحه ممکن است از چند کش عبور کند، از نزدیکترین به کاربر تا دورترین:
| کش | کجاست | معمولاً چه چیزی ذخیره میکند | مثال |
|---|---|---|---|
| کش مرورگر | روی دستگاه بازدیدکننده | تصاویر، استایلشیتها، اسکریپتها، فونتها | لوگوی شما در صفحه دوم آنی بارگذاری میشود |
| کش CDN | سرورهایی در سراسر جهان، نزدیک بازدیدکنندهها | فایلهای ثابت و گاهی کل صفحات | بازدیدکنندهای در توکیو فایلها را از سرور نزدیک میگیرد، نه از سرور اصلی شما |
| کش برنامه (Application cache) | روی یا کنار سرور شما، اغلب در حافظه یا Redis | نتایج کوئریهای کند یا فراخوانیهای API بیرونی | نرخهای ارز امروز، که یکبار در ساعت گرفته میشوند |
| کش پایگاه داده | داخل خود پایگاه داده | دادههای اخیراً استفادهشده و برنامههای اجرای کوئری | سطرهای پرکاربرد در حافظه سریع میمانند |
CDN (شبکه توزیع محتوا) در واقع یک شبکه جهانی از کشها برای فایلهای سایت شماست.
کش چطور تصمیم میگیرد چه چیزی را نگه دارد
هر کش باید به همین پرسشها پاسخ دهد:
- چه چیزی میتواند کش شود؟ داده عمومی و مشترک (تصویر محصول، پست وبلاگ) — بله. داده خصوصی (صفحه حساب کاربر، پیامهای او) — هرگز در کش مشترک.
- برای چه مدتی؟ این TTL (مدت زمان زندهبودن) است. یک لوگو ممکن است یک سال کش شود؛ موجودی انبار ۳۰ ثانیه.
- چطور بهروز میشود؟ یا کپی منقضی میشود و دوباره گرفته میشود، یا برنامه وقتی داده تغییر میکند عمداً آن را حذف میکند — که به آن باطلسازی (invalidation) گفته میشود.
برای سایتها، سرور با هدر Cache-Control به مرورگرها و CDNها میگوید هر فایل را چطور کش کنند. برای مثال، Cache-Control: max-age=3600 یعنی «این کپی را تا یک ساعت میتوانی دوباره استفاده کنی».
ابزارهای ساخت مدرن سختترین بخش را برای فایلهای ثابت با cache busting انجام میدهند: هر بار که فایلی تغییر کند، یک نام جدید با اثرانگشت میگیرد، مثل app.3f9a2c.js. مرورگرها میتوانند نام قدیمی را مدت طولانی کش کنند، چون نسخه جدید صرفاً نام دیگری دارد.
یک مثال کامل: کاتالوگ محصولات
یک فروشگاه آنلاین کوچک دارید. صفحه اصلی ۵۰ محصول را با قیمت و موجودی از پایگاه داده نشان میدهد، بهعلاوه یک فهرست «پرطرفدار» که نیاز به یک محاسبه کند روی همه سفارشها دارد.
۱. تصاویر و اسکریپتها برای مدت طولانی توسط مرورگر و CDN کش میشوند. هر ساخت جدید به فایلهای تغییرکرده نام جدید میدهد، پس بهروزرسانیها همچنان دیده میشوند. ۲. فهرست پرطرفدار هر ۱۰ دقیقه یکبار محاسبه میشود و در یک کش برنامه ذخیره میشود. هر بازدیدکننده در آن ۱۰ دقیقه نتیجه ذخیرهشده را آنی میگیرد. ۳. قیمتها برای مدت کوتاهی کش میشوند و هر وقت محصولی را ویرایش کنید کش پاک میشود، پس مشتریها هرگز برای مدت طولانی قیمت قدیمی نمیبینند. ۴. موجودی در هنگام پرداخت هرگز کش نمیشود. وقتی کسی روی «خرید» کلیک میکند، برنامه پایگاه داده واقعی را بررسی میکند، پس نمیتواند کالایی را بفروشد که همین الان تمام شده. ۵. صفحات سبد خرید و حساب کاربری هرگز در کشهای مشترک ذخیره نمیشوند، چون شخصی هستند.
نتیجه: صفحه اصلی سریع است، پایگاه داده کار بسیار کمتری میکند، و هیچ چیزی که به پول یا حریم خصوصی مربوط است هرگز قدیمی نمیشود.
واژههای کلیدی
| واژه | معنی |
|---|---|
| کشهیت / کشمیس (Cache hit / miss) | داده در کش پیدا شد / باید از منبع گرفته میشد. |
| TTL (مدت زمان زندهبودن) | مدتی که یک کپی ذخیرهشده تازه در نظر گرفته میشود. |
| داده قدیمی (Stale data) | کپی ذخیرهشدهای که منسوخ شده است. |
| باطلسازی (Invalidation) | حذف عمدی یک کپی ذخیرهشده، چون اصل آن تغییر کرده. |
| Cache busting | تغییر نام یا آدرس فایل وقتی تغییر میکند، تا کشها نسخه جدید را بگیرند. |
| Cache-Control | هدر HTTP که به مرورگرها و CDNها میگوید یک پاسخ را چطور کش کنند. |
| رفرش کامل (Hard refresh) | بارگذاری مجدد صفحه با دستور به مرورگر برای نادیده گرفتن کشش. |
| Redis | یک پایگاه داده درونحافظهای محبوب که اغلب به عنوان کش برنامه استفاده میشود. |
برداشتهای غلط رایج
- «کشینگ همیشه خوب است.» کش کردن چیز اشتباه باعث باگهای واقعی میشود: قیمتهای قدیمی، پستهای جدید که نشان داده نمیشوند، یا — بدترین حالت — صفحه خصوصی یک کاربر که به کاربر دیگری نشان داده شود. عمدی کش کنید.
- «اگر نسخه قدیمی را میبینم، بهروزرسانیام شکست خورده.» معمولاً اینطور نیست. قبل از فرض خرابی، یک رفرش کامل (Ctrl+Shift+R، یا Cmd+Shift+R روی مک) یا یک پنجره خصوصی را امتحان کنید.
- «کشینگ یک برنامه کند را درست میکند.» فقط کندی را برای درخواستهای تکراری پنهان میکند. درخواست اول همچنان کند است، و اگر مشکل زیربنایی نبود یک ایندکس در پایگاه داده است، آن را هم رفع کنید.
- «باید هر چیزی را تا جایی که میشود طولانی کش کنم.» زمانهای طولانی کش برای فایلهایی مناسباند که وقتی تغییر میکنند نام جدید میگیرند. برای صفحات HTML و داده، زمانهای کوتاهتر امنترند.
- «پاک کردن کش من برای همه درست میکند.» فقط کش مرورگر خودتان را پاک میکند. بازدیدکنندهها و کشهای CDN هنوز کپیهای خودشان را دارند.
از سازنده هوش مصنوعی خود چه بپرسید
- «کدام بخشهای این برنامه کند هستند و کدامها را میتوان با خیال راحت کش کرد؟»
- «[فهرست پرطرفدار / نتیجه API] را برای [N] دقیقه کش کن و وقتی داده اصلی تغییر کرد آن را پاک کن.»
- «مطمئن شو هیچ صفحهای با داده شخصی یا حساب کاربری توسط CDN یا کش مشترک قابل ذخیره نباشد.»
- «برای فایلهای ثابت با اثرانگشت زمان کش طولانی و برای HTML زمان کوتاه تنظیم کن.»
- «پاسخهای [API بیرونی] را کش کن تا روی هر بارگذاری صفحه صدایش نزنیم — و بگو این داده ممکن است چقدر قدیمی شود.»
- «بعد از انتشار نسخه قدیمی میبینم. آیا این کش مرورگر من است، یا چیزی مستقر نشده؟»
کشینگ در Mythex
پس از انتشار بهروزرسانی یک برنامه Mythex، مستندات یادآوری میکنند که کشهای CDN ممکن است برای مدت کوتاهی عقب بمانند و یک رفرش کامل آدرس عمومی، نسخه جدید را نشان میدهد — ببینید چطور منتشر کنید. صفحه محدودیتهای میزبانی هم کش کردن فایلهای ثابت را توصیه میکند، چون میزبانی، زمان پایگاه داده و پهنای باند از موجودی اعتباری شما پرداخت میشوند. فراتر از آن — کش کردن نتایج کوئری یا پاسخهای API — چیزی است که از عامل میخواهید در برنامهتان بسازد.
مطالب مرتبط: CDN چیست، چطور سایتتان را سریعتر کنید و محدودسازی نرخ چیست.
پرسشها
کشینگ به زبان ساده چیست؟
کشینگ یعنی نگه داشتن یک کپی از چیزی که گرفتنش کند یا پرهزینه بوده، تا دفعه بعد که لازم شد، سریع از همان کپی ذخیرهشده ارائه شود. مرورگرها، CDNها، سرورها و پایگاههای داده همه از کش استفاده میکنند تا برنامهها سریعتر و اجرایشان ارزانتر باشد.
چرا بعد از بهروزرسانی سایتم هنوز نسخه قدیمی را میبینم؟
احتمالاً مرورگر شما یا یک CDN دارد یک کپی ذخیرهشده از فایلهای قدیمی را نشان میدهد. یک رفرش کامل (Ctrl+Shift+R در ویندوز، Cmd+Shift+R در مک) معمولاً مشکل را حل میکند. برای بازدیدکنندگان، سایتهای خوبساختهشده به فایلهای بهروزشده نام جدید میدهند تا کشها خودکار نسخه جدید را بگیرند.
پاک کردن کش چه کاری انجام میدهد؟
پاک کردن کش مرورگر، کپیهای ذخیرهشده فایلها و صفحاتی را که مرورگر نگه داشته حذف میکند، تا دفعه بعد همهچیز از نو دانلود شود. میتواند صفحاتی را که خراب یا قدیمی به نظر میرسند درست کند، و صفحات بعد از آن در بار اول کمی کندتر بارگذاری میشوند.
آیا کشینگ میتواند مشکل ایجاد کند؟
بله. ریسک اصلی ارائه داده قدیمی است — قیمت قدیمی، موجودی انبار منسوخ — یا بدتر از آن، ذخیره کردن صفحه خصوصی یک کاربر و نشان دادن آن به شخص دیگر. قواعد خوب کشینگ تعیین میکنند چه چیزی کش شود، برای چه مدتی، و هرگز داده شخصی را در کشهای مشترک ذخیره نمیکنند.