Next.js آپ کو بنیادی طور پر کیا فراہم کرتا ہے

  • Data cache – Next.js 13+ میں ہر fetch() کال ایک per-request memory cache میں جاتی ہے۔ revalidate آپشن شامل کرنے سے runtime کو ایک مقررہ وقفے کے بعد ڈیٹا کو ریفریش کرنے کا حکم ملتا ہے، جس سے ایک 'hot' API کال صرف ضرورت پڑنے پر ہی 'cold' کال میں تبدیل ہوتی ہے۔
  • Full-route cache – یہ فریم ورک رینڈر شدہ HTML اور پورے روٹ (route) کے لیے درکار ڈیٹا کو محفوظ رکھتا ہے۔ دوبارہ آنے والے صارفین کو فوری تبدیلی (instant transition) نظر آتی ہے کیونکہ سرور re-rendering کو چھوڑ دیتا ہے۔
  • ISR – پرانا ورژن ٹریفک فراہم کرتا رہتا ہے جبکہ پس منظر (background) میں اسٹیٹک صفحات دوبارہ جنریٹ ہوتے ہیں۔ یہ آپ کو ہر بار مواد تبدیل ہونے پر مکمل ری بلڈ کیے بغیر ایک بڑی سائٹ کو اسٹیٹک رکھنے کی اجازت دیتا ہے۔
  • Server Component cache() – React کا cache ہیلپر ایک ہی درخواست (request) کے دورانیے کے لیے مہنگے حساب کتاب (expensive calculations) یا ڈیٹا بیس کنکشنز کو میموائز (memoize) کرتا ہے، جس سے پیج کے کمپوننٹ ٹری کے اندر دوہرا کام کرنے سے بچا جا سکتا ہے۔

یہ کیشز "first-hit" کے مسئلے کو حل کرتے ہیں لیکن یہ اب بھی Node پروسیس کے اندر رہتے ہیں۔ سرور اور ڈیٹا بیس کی حفاظت کے لیے، کیشنگ کو باہر کی طرف (outward) منتقل کریں۔

بیرونی تہیں (External layers) جو آپ شامل کر سکتے ہیں

تہہ (Layer) یہ کیا محفوظ کرتا ہے عام طور پر استعمال ہونے والے ٹولز یہ کیسے مدد کرتا ہے
CDN اسٹیٹک اثاثے (assets)، HTML، API JSON Cloudflare, Akamai, AWS CloudFront مواد کو edge locations پر منتقل کرتا ہے، جس سے صارف تک پہنچنے کا دورانیہ (round-trip) کم ہو جاتا ہے
Reverse proxy Node تک پہنچنے سے پہلے پورے پیج کے رسپانسز Nginx, Varnish کیش شدہ صفحات کو براہ راست فراہم کرتا ہے، جس سے Next.js instance پر بوجھ کم ہو جاتا ہے
Application-level cache مہنگے DB queries یا API calls کے نتائج Redis, Memcached ایک تیز رفتار key-value اسٹور فراہم کرتا ہے جو سرور ری اسٹارٹ ہونے کے بعد بھی برقرار رہتا ہے اور اسے متعدد app instances کے درمیان شیئر کیا جا سکتا ہے

ہر تہہ اصل ڈیٹا بیس سے مزید دور ہوتی ہے، اس لیے اگر ایک سطح پر کیش نہیں ملتا (miss)، تو وہ اگلی سطح پر جاتا ہے، اور آخر کار ڈیٹا بیس تک صرف اسی صورت میں پہنچتا ہے جب انتہائی ضروری ہو۔

کیشز کو تازہ (fresh) رکھنا

Invalidation (کیش کو ختم کرنا) زیادہ تر ٹیموں کے لیے مشکل ثابت ہوتا ہے۔ تین عملی طریقے (patterns) بہت اچھا کام کرتے ہیں:

  • Time-based (TTL) – کیش انٹری کو ایک مقررہ میعاد (expiration) دیں۔ اسے کنفیگر کرنا آسان ہے لیکن ٹائمر ختم ہونے تک یہ پرانا ڈیٹا فراہم کر سکتا ہے۔
  • Event-driven – اپنے CMS یا کسی بھی ڈیٹا سورس کے ساتھ منسلک ہوں جو مواد تبدیل ہونے پر webhook بھیجتا ہے۔ ویب ہک متعلقہ کیش انٹری کو صاف (purge) کرنے کا عمل شروع کرتا ہے۔
  • Tag-based – فیکچز (fetches) کے ایک گروپ کے ساتھ ایک منطقی ٹیگ منسلک کریں (مثلاً product-list)۔ جب اس گروپ کی کوئی بھی چیز تبدیل ہوتی ہے، تو revalidateTag('product-list') کا ایک ہی کال اس ٹیگ کو شیئر کرنے والی ہر انٹری کو صاف کر دیتا ہے۔

ان طریقوں کو ملا کر آپ تازگی (freshness) اور کیش-ہٹ ریٹس (cache-hit rates) کے درمیان توازن برقرار رکھ سکتے ہیں۔

وہ درجہ بندی (hierarchy) جو زیادہ تر ٹیموں کے لیے کارآمد ہے

  1. Browser cache – اسٹیٹک اثاثوں (CSS, JS, تصاویر) کو ایک طویل max-age دیا جاتا ہے تاکہ صارف کا آلہ دوبارہ نیٹ ورک سے نہ پوچھے`
  2. CDN – Edge nodes مکمل HTML صفحات اور API JSON کو کیش کرتے ہیں، اور آپ کے Next.js میں سیٹ کیے گئے Cache-Control ہیڈرز کا احترام کرتے ہیں۔
  3. Reverse proxy – ایک Nginx یا Varnish instance Next.js سرور کے سامنے ہوتا ہے، جو ان روٹس کے لیے کیش شدہ رسپانسز فراہم کرتا ہے جو شاذ و نادر ہی تبدیل ہوتے ہیں۔
  4. Next.js internal cache – فریم ورک کے ڈیٹا اور روٹ کیشز per-request memoization اور ISR کو سنبھالتے ہیں۔
  5. Application cache – Redis بھاری ڈیٹا بیس کوئریز کے نتائج کو محفوظ کرتا ہے، جن کی کلید (key) کوئری پیرامیٹرز یا ٹیگز کے ذریعے ہوتی ہے۔
  6. Database – سچائی کا آخری ذریعہ، جس سے صرف اسی صورت میں پوچھا جاتا ہے جب ہر اعلیٰ سطح پر کیش نہیں ملتا (cache miss)۔

جب کوئی درخواست آتی ہے، تو یہ اس فہرست میں نیچے کی طرف جاتی ہے جب تک کہ کوئی تہہ اس کا جواب نہ دے دے۔ سب سے تیز جواب جیت جاتا ہے، اور وہ رسپانس مستقبل کے استعمال کے لیے واپس اوپر کی زنجیر میں لکھ دیا جاتا ہے۔

تمام حصوں کو یکجا کرنا

  1. اپنے API روٹس میں Cache-Control ہیڈرز سیٹ کریں
  2. اپنا CDN کنفیگر کریں – HTML اور JSON اینڈ پوائنٹس کے لیے edge caching کو فعال کریں، اور یقینی بنائیں کہ CDN Cache-Control کا احترام کرتا ہے۔
  3. ایک reverse proxy تعینات کریں – اپنے Next.js سرور کے سامنے Nginx لگائیں۔
  4. Redis شامل کریں – مہنگی ڈیٹا بیس کوئریز کے نتائج کو کیش کریں۔
  5. اپنے کمپوننٹس میں revalidateTag کا استعمال کریں – کسی مخصوص ٹیگ کے لیے Next.js کے اندرونی کیش کو صاف کرنے کے لیے revalidateTag کو کال کریں۔

خلاصہ

Next.js کے اندر ایک واحد کیش پہلی درخواست کی رفتار بڑھا دیتا ہے، لیکن حقیقی پیمائش (scalability) ایک منظم اسٹیک سے آتی ہے: browser → CDN → reverse proxy → framework → Redis → database۔ ہر تہہ کو کنفیگر کریں، وقت، واقعات (events) اور ٹیگز کے ذریعے invalidation کو سنبھالیں، اور اپنے میٹرکس (metrics) پر نظر رکھیں۔ اس سے لیٹنسی (latency) کم رہے گی جبکہ آپ کا بیک اینڈ ٹریفک کے اچانک دباؤ (spikes) کو برداشت کر سکے گا۔