ویرگول
ورودثبت نام
مصطفی رستگار
مصطفی رستگاربرنامه نویس کامپیوتر و ازین جور مسخره بازی ها!
مصطفی رستگار
مصطفی رستگار
خواندن ۲ دقیقه·۳ ماه پیش

28- Cache Invalidation استراتژی‌ها (بر اساس tags و paths)

برای مصاحبه فنی، بهترین روش این است که اول مسئله را توضیح دهی، بعد راه‌حل را، و در آخر مثال عملی بزنی. در ادامه یک متن آماده و روان برای بیان شفاهی آماده کرده‌ام:


متن آماده برای مصاحبه (بیان شفاهی)

«در Next.js، ما برای افزایش سرعت، داده‌ها را کش (Cache) می‌کنیم. اما مشکل اینجاست که وقتی داده‌ها در بک‌اند تغییر می‌کنند، کش ما قدیمی می‌شود. به این مشکل Stale Data می‌گوییم. برای حل این مشکل، از استراتژی‌های Cache Invalidation استفاده می‌کنیم که یعنی «چه زمانی کش را باطل و داده‌های تازه را جایگزین کنیم».»

«در Next.js دو رویکرد اصلی داریم: بر اساس مسیر (Path-based) و بر اساس تگ (Tag-based).»


۱. استراتژی بر اساس مسیر (Path-based Revalidation)

«در این روش، به Next.js می‌گوییم که هر چند ثانیه یک‌بار، یک صفحه‌ی خاص را دوباره بساز. این کار با دو مقدار انجام می‌شود:»

  • time-based در fetch یا revalidate در صفحه:

    «مثلاً اگر بنویسم revalidate: 60، یعنی هر ۶۰ ثانیه یک‌بار، این صفحه در پس‌زمینه ری‌جنریت می‌شود و دفعه‌ی بعد که کاربر بیاید، نسخه‌ی تازه را می‌بیند.»

  • revalidatePath در سرور اکشن‌ها:

    «وقتی کاربر کاری انجام می‌دهد (مثل ثبت نظر)، من با revalidatePath('/posts') به Next.js می‌گویم که مسیر مربوطه را پاک کن و در دفعه‌ی بعد که درخواست شد، از نو بساز.»

«مزیتش سادگی است، اما عیبش این است که اگر مسیرهای زیادی داشته باشیم، باید تک‌تک آن‌ها را مدیریت کنیم.»


۲. استراتژی بر اساس تگ (Tag-based Revalidation)

«روش دقیق‌تر، استفاده از تگ است. من هنگام دریافت داده، یک برچسب (تگ) به آن attach می‌کنم. مثلاً:»

javascript

fetch('https://api.example.com/posts', { next: { tags: ['posts'] } })

«حالا هر جا که داده‌ی مربوط به پست‌ها تغییر کند، مثلاً یک پست جدید اضافه شود، من با دستور revalidateTag('posts') به Next.js می‌گویم: هر درخواستی که این تگ را دارد، کشش را باطل کن.»

«مزیت بزرگ این روش این است که من نیازی نمی‌دانم داده در کدام مسیر استفاده شده است. Next.js خودش تمام مسیرهایی که از این تگ استفاده کرده‌اند را پیدا کرده و آن‌ها را ری‌جنریت می‌کند.»

«این روش برای اپلیکیشن‌های بزرگ خیلی مناسب‌تر است، چون کش را به‌صورت دانه‌دانه (Granular) و بر اساس موضوع داده مدیریت می‌کنیم، نه بر اساس صفحه.»


نکته‌ی کلیدی برای مصاحبه (جمع‌بندی)

«نکته‌ی مهم این است که در Next.js 14 به‌بعد، هر دو روش در سرور کامپوننت‌ها و سرور اکشن‌ها قابل استفاده هستند. انتخاب بین این دو به این بستگی دارد که: اگر داده‌ی ما در چندین صفحه پراکنده است، Tag-based بهتر است و اگر فقط یک صفحه‌ی خاص را داریم، Path-based کافی است. همچنین می‌توانیم هر دو را با هم ترکیب کنیم.»


اگر مصاحبه‌کننده سوال عمیق‌تر پرسید:

  • تفاوت revalidatePath و revalidateTag چیست؟

    revalidatePath یک مسیر خاص را پاک می‌کند، ولی revalidateTag تمام مسیرهایی که از آن تگ استفاده کرده‌اند را پیدا کرده و پاک می‌کند.

  • آیا می‌توانیم درخواست‌های client-side را هم مدیریت کنیم؟

    در سمت کلاینت، از کتابخانه‌هایی مثل React Query یا SWR استفاده می‌کنیم که با useQuery و invalidateQueries کار مشابهی را انجام می‌دهند، اما در Next.js بحث ما روی کش سرور است.


بر اساسمصاحبه فنیcache
۰
۰
مصطفی رستگار
مصطفی رستگار
برنامه نویس کامپیوتر و ازین جور مسخره بازی ها!
شاید از این پست‌ها خوشتان بیاید