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) جو زیادہ تر ٹیموں کے لیے کارآمد ہے
- Browser cache – اسٹیٹک اثاثوں (CSS, JS, تصاویر) کو ایک طویل
max-ageدیا جاتا ہے تاکہ صارف کا آلہ دوبارہ نیٹ ورک سے نہ پوچھے` - CDN – Edge nodes مکمل HTML صفحات اور API JSON کو کیش کرتے ہیں، اور آپ کے Next.js میں سیٹ کیے گئے
Cache-Controlہیڈرز کا احترام کرتے ہیں۔ - Reverse proxy – ایک Nginx یا Varnish instance Next.js سرور کے سامنے ہوتا ہے، جو ان روٹس کے لیے کیش شدہ رسپانسز فراہم کرتا ہے جو شاذ و نادر ہی تبدیل ہوتے ہیں۔
- Next.js internal cache – فریم ورک کے ڈیٹا اور روٹ کیشز per-request memoization اور ISR کو سنبھالتے ہیں۔
- Application cache – Redis بھاری ڈیٹا بیس کوئریز کے نتائج کو محفوظ کرتا ہے، جن کی کلید (key) کوئری پیرامیٹرز یا ٹیگز کے ذریعے ہوتی ہے۔
- Database – سچائی کا آخری ذریعہ، جس سے صرف اسی صورت میں پوچھا جاتا ہے جب ہر اعلیٰ سطح پر کیش نہیں ملتا (cache miss)۔
جب کوئی درخواست آتی ہے، تو یہ اس فہرست میں نیچے کی طرف جاتی ہے جب تک کہ کوئی تہہ اس کا جواب نہ دے دے۔ سب سے تیز جواب جیت جاتا ہے، اور وہ رسپانس مستقبل کے استعمال کے لیے واپس اوپر کی زنجیر میں لکھ دیا جاتا ہے۔
تمام حصوں کو یکجا کرنا
- اپنے API روٹس میں
Cache-Controlہیڈرز سیٹ کریں - اپنا CDN کنفیگر کریں – HTML اور JSON اینڈ پوائنٹس کے لیے edge caching کو فعال کریں، اور یقینی بنائیں کہ CDN
Cache-Controlکا احترام کرتا ہے۔ - ایک reverse proxy تعینات کریں – اپنے Next.js سرور کے سامنے Nginx لگائیں۔
- Redis شامل کریں – مہنگی ڈیٹا بیس کوئریز کے نتائج کو کیش کریں۔
- اپنے کمپوننٹس میں
revalidateTagکا استعمال کریں – کسی مخصوص ٹیگ کے لیے Next.js کے اندرونی کیش کو صاف کرنے کے لیےrevalidateTagکو کال کریں۔
خلاصہ
Next.js کے اندر ایک واحد کیش پہلی درخواست کی رفتار بڑھا دیتا ہے، لیکن حقیقی پیمائش (scalability) ایک منظم اسٹیک سے آتی ہے: browser → CDN → reverse proxy → framework → Redis → database۔ ہر تہہ کو کنفیگر کریں، وقت، واقعات (events) اور ٹیگز کے ذریعے invalidation کو سنبھالیں، اور اپنے میٹرکس (metrics) پر نظر رکھیں۔ اس سے لیٹنسی (latency) کم رہے گی جبکہ آپ کا بیک اینڈ ٹریفک کے اچانک دباؤ (spikes) کو برداشت کر سکے گا۔
