<पी> इस गाइड में, हम अपस्टैश रेडिस का उपयोग करके नेक्स्ट.जेएस ऐप में सत्र प्रबंधन के बारे में सीखेंगे और सीखेंगे कि वेब एप्लिकेशन में "सत्र" का क्या अर्थ है, रेडिस सत्र प्रबंधन के लिए एक पसंदीदा विकल्प क्यों है, अपस्टैश रेडिस डेटाबेस कैसे सेट करें, और अंत में, इसे नेक्स्ट.जेएस एप्लिकेशन में कैसे एकीकृत किया जाए।पी> "सत्र" क्या है?
<पी> एक वेब एप्लिकेशन में, "सत्र" एक अस्थायी, सर्वर-साइड स्टोरेज तंत्र है जिसका उपयोग एक निश्चित समय अंतराल में कई HTTP अनुरोधों में एप्लिकेशन के साथ उपयोगकर्ता की बातचीत की स्थिति को बनाए रखने के लिए किया जाता है। <पी> चूंकि HTTP एक स्टेटलेस प्रोटोकॉल है, जिसका अर्थ है कि प्रत्येक अनुरोध स्वतंत्र है और पिछले इंटरैक्शन को "याद" नहीं करता है, सत्र सर्वर को उपयोगकर्ता-विशिष्ट डेटा जैसे प्रमाणीकरण स्थिति, प्राथमिकताएं, या वेबसाइट पर अपने समय के दौरान उपयोगकर्ता की किसी भी प्रकार की गतिविधियों को ट्रैक और संग्रहीत करने की अनुमति देता है। <पी> सत्र आम तौर पर क्लाइंट साइड पर, आमतौर पर कुकी में एक अद्वितीय सत्र आईडी संग्रहीत करके काम करते हैं। सर्वर इस आईडी का उपयोग सत्र भंडारण से उपयोगकर्ता सत्र से संबंधित डेटा पुनर्प्राप्त करने के लिए करता है, जैसे इस ब्लॉग में रेडिस, हर बार जब उपयोगकर्ता साइट के साथ इंटरैक्ट करता है। <पी> वेब एप्लिकेशन में सत्र निम्नलिखित उपयोगकर्ता इंटरैक्शन और स्थिति प्रबंधन को संभालने का एक शानदार तरीका है: - उपयोगकर्ता प्रमाणीकरण :सत्र उपयोगकर्ताओं को प्रमाणित करने और सभी पृष्ठों पर या ताज़ा करने के बाद भी उनकी लॉग-इन स्थिति को याद रखने में मदद करते हैं।
- निजीकरण :सत्र सर्वर को उपयोगकर्ता प्राथमिकताएं, प्रमाणीकरण स्थिति इत्यादि जैसे डेटा को संग्रहीत और पुनर्प्राप्त करने की अनुमति देते हैं।
- सुरक्षा :उचित सत्र प्रबंधन ऐप सुरक्षा को बढ़ा सकता है, जैसे सीएसआरएफ से सुरक्षा और यह सुनिश्चित करना कि अनधिकृत उपयोगकर्ता प्रतिबंधित क्षेत्रों तक न पहुंचें।
सत्र प्रबंधन के लिए Redis क्यों?
<पी> क्यों नहीं :) <पी> सत्र प्रबंधन के लिए रेडिस को सत्र स्टोर के रूप में उपयोग करने के कई कारण हैं। रेडिस की संरचना से उत्पन्न होने वाले कुछ लाभ यहां दिए गए हैं: - <पी> डेटा आर्किटेक्चर :रेडिस एक इन-मेमोरी की-वैल्यू स्टोर है। कुंजी-मूल्य जोड़े को हैश में संग्रहीत किया जा सकता है, जहां हैश फ़ील्ड-मूल्य जोड़े के संग्रह के रूप में संरचित एक रिकॉर्ड प्रकार है। यह संरचना सत्र प्रबंधन डेटा प्रकार के लिए पूरी तरह से फिट बैठती है ताकि सभी सत्र डेटा, जैसे उपयोगकर्ता नाम, उपयोगकर्ता प्राथमिकता इत्यादि को प्रति उपयोगकर्ता सत्र हैश में कुंजी-मूल्य प्रारूप में बनाए रखा जा सके।
- <पी> डेटा समाप्ति :Redis में समाप्त हो चुके डेटा को हटाने के लिए एक अंतर्निहित कार्यक्षमता है। यह वेब एप्लिकेशन को उपयोगकर्ता सत्रों को समयबद्ध रखने में मदद करता है।
- <पी> कम विलंबता :अपनी "इन-मेमोरी" प्रकृति के कारण, रेडिस बेहद तेज़ है। इसीलिए इसका उपयोग आमतौर पर उपयोगकर्ता सत्र और कैश डेटा के लिए किया जाता है।
- <पी> स्केलेबिलिटी :रेडिस को बड़ी मात्रा में डेटा और उच्च-थ्रूपुट ट्रैफ़िक को संभालने के लिए बनाया गया है।
<पी> इसके अलावा, हम रेडिस की तुलना उपयोगकर्ता सत्र डेटा, क्लाइंट-साइड कुकीज़ को संग्रहीत करने के सबसे सामान्य तरीकों में से एक के साथ कर सकते हैं, ताकि यह तय किया जा सके कि हम अपने वेब अनुप्रयोगों में किस तरीके का पालन करना चाहते हैं। क्लाइंट-साइड कुकीज़ की तुलना में सत्र भंडारण के रूप में रेडिस के कुछ फायदे: - <पी> उपयोगकर्ता द्वारा छेड़छाड़ के प्रति कम संवेदनशील :कुकीज़ उपयोगकर्ताओं को दिखाई देती हैं और उपयोगकर्ता द्वारा उनमें हेरफेर किया जा सकता है। रेडिस हमें उपयोगकर्ता डेटा को उपयोगकर्ताओं द्वारा हेरफेर किए जाने से बचाने की अनुमति देता है।
- <पी> क्लाइंट और सर्वर के बीच कम डेटा स्थानांतरित: चूंकि हम सभी सत्र की जानकारी रेडिस में संग्रहीत करते हैं, इसलिए हमें क्लाइंट मशीन में कुछ भी संग्रहीत करने की आवश्यकता नहीं है।
- <पी> क्लाइंट मशीन में केवल "SessionId" संग्रहीत करना: यदि हम रेडिस का उपयोग करते हैं, तो हमें प्रत्येक अनुरोध के लिए केवल sessionId की आवश्यकता होती है ताकि यह पता चल सके कि यह अनुरोध किस सत्र में है।
अपस्टैश रेडिस डेटाबेस बनाना
<पी> अपस्टैश रेडिस सेटअप में कूदने से पहले, हमें पहले अपस्टैश रेडिस के फायदों को समझना चाहिए। हम जिन उपकरणों का उपयोग करने जा रहे हैं, उनका उपयोग क्यों किया जाना चाहिए, इसे समझे बिना उपयोग करने का कोई मतलब नहीं होगा, है ना? <पी> आइए अपस्टैश रेडिस का उपयोग करने के मुख्य लाभ देखें: - <पी> सर्वर रहित: अपस्टैश रेडिस एक सर्वर रहित डेटाबेस है। आपको बुनियादी ढांचे को बनाए रखने, डेटाबेस के स्केलिंग या किसी अन्य निम्न-स्तरीय कॉन्फ़िगरेशन के बारे में चिंता करने की आवश्यकता नहीं है। आप बस डेटाबेस बनाएं और उसका उपयोग करें।
- <पी> वैश्विक डेटा वितरण: अपस्टैश आपको अपने रेडिस इंस्टेंस को अपने उपयोगकर्ताओं के नजदीकी क्षेत्रों में तैनात करने की अनुमति देता है, जिससे विलंबता और भी कम हो जाती है। यह विश्व स्तर पर वितरित अनुप्रयोगों के लिए विशेष रूप से फायदेमंद है, यह सुनिश्चित करता है कि सत्र भंडारण उपयोगकर्ता के स्थान की परवाह किए बिना तेज़ और प्रतिक्रियाशील है।
- <पी> जाते समय भुगतान करें: कोई प्रवेश शुल्क नहीं है. आप केवल उसी के लिए भुगतान करते हैं जिसका आप उपयोग करते हैं। आप मूल्य निर्धारण विवरण देख सकते हैं।
<पी> ठीक है, यदि हमारे पास इस बारे में कोई प्रश्न नहीं है कि हम सत्र प्रबंधन के लिए अपस्टैश रेडिस का उपयोग क्यों करते हैं, तो हम अपस्टैश रेडिस डेटाबेस बना सकते हैं। <पी> हम अपस्टैश कंसोल के माध्यम से एक रेडिस डेटाबेस बनाएंगे। <पी> आइए "डेटाबेस बनाएं" बटन पर क्लिक करके एक रेडिस डेटाबेस बनाएं। यह ट्यूटोरियल एक बार फिर दिखाएगा कि अपस्टैश रेडिस डेटाबेस बनाना कितना आसान और तेज़ है। <पी> दिखाई देने वाले मोडल में, हम अपने डेटाबेस के लिए एक नाम का चयन करेंगे और इसके लिए एक क्षेत्र का चयन करेंगे। अपनी सेवा के साथ उसी क्षेत्र का चयन करना बेहतर हो सकता है। <पी> अगले बटन पर क्लिक करने के बाद, हम मूल्य निर्धारण योजना का चयन करेंगे। अधिकतम बजट सीमा के साथ भुगतान करना मेरा पसंदीदा है! <पी> अब, हमारा रेडिस डेटाबेस तैयार है। हम रेडिस डैशबोर्ड पर डेटाबेस एंडपॉइंट, डेटाबेस से कनेक्ट करने के लिए पासवर्ड और उसके पोर्ट को देख सकते हैं। जब हम वेब एप्लिकेशन से डेटाबेस से जुड़ना चाहेंगे तो हमें इस जानकारी की आवश्यकता होगी। <पी>
<पी> बस इतना ही! नेक्स्टजेएस ऐप में अपस्टैश रेडिस का उपयोग करना
<पी> आइए देखें कि रेडिस वेब एप्लिकेशन इंफ्रास्ट्रक्चर के भीतर कैसे काम करेगा: - <पी> हमें सबसे पहले क्लाइंट ब्राउज़र से बिना किसी sessionId के अनुरोध प्राप्त होता है।
- <पी> चूँकि अनुरोध में कोई sessionId नहीं है, हम एक sessionId बनाते हैं और Redis में एक हैश बनाते हैं।
- <पी> क्लाइंट मशीन की प्रतिक्रिया में सेशनआईडी को कुकी के रूप में लौटाएँ।
- <पी> जब हमें sessionId के साथ एक नया HTTP अनुरोध प्राप्त होता है, तो हम Redis से आवश्यक सत्र डेटा पुनर्प्राप्त करते हैं और क्लाइंट को जवाब देते समय इसका उपयोग करते हैं।
<पी> प्रक्रिया को बेहतर ढंग से देखने के लिए सेवा का अनुक्रम आरेख और रेडिस के साथ इसका कनेक्शन यहां दिया गया है: <पी>
<पी> यदि सब कुछ अच्छा है, तो हम टर्मिनल में निम्नलिखित कमांड चलाकर एक Nextjs ऐप बना सकते हैं, जब तक कि आपके पास Nextjs ऐप न हो। npx create-next-app@latest <project-name>
<पी> अब हमें अपस्टैश रेडिस टाइपस्क्रिप्ट एसडीके इंस्टॉल करना होगा। cd <project-name>
npm install @upstash/redis
<पी> आवश्यक निर्भरता स्थापित करने के बाद, अब हम उपयोगकर्ता के ब्राउज़र की कुकीज़ में सत्र आईडी को प्रबंधित करने और हमारे ऐप के सत्र भंडारण, अपस्टैश रेडिस के साथ बातचीत करने के लिए एक इंटरफ़ेस बना सकते हैं। <पी> हम इस इंटरफ़ेस को /app/lib/sessionManager.tsx में लागू करेंगे फ़ाइल. import { Redis } from '@upstash/redis'
import { cookies } from 'next/headers'
export const redis = new Redis({
url: '<UPSTASH-REDIS-URL>',
token: 'UPSTASH-REDIS-TOKEN',
})
type SessionId = string;
type Key = 'userName' | 'sessionStatus'; // other keys of the session data can be added.
export async function getSessionId(): SessionId | undefined {
const cookieStore = await cookies();
return cookieStore.get("session-id")?.value;
}
async function setSessionId(sessionId: SessionId): void {
const cookieStore = await cookies();
cookieStore.set("session-id", sessionId);
}
export async function getSessionIdAndCreateIfMissing() {
const sessionId = await getSessionId();
if (!sessionId) {
const newSessionId = crypto.randomUUID();
await setSessionId(newSessionId);
return newSessionId;
}
return sessionId;
}
export async function get(key: Key, username: string = "") {
const sessionId = await getSessionId();
if (!sessionId) {
return null;
}
return await redis.hget(`session-${username}-${sessionId}`, key);
}
export async function getAll(username: string = "") {
const sessionId = await getSessionId();
if (!sessionId) {
return null;
}
return await redis.hgetall(`session-${username}-${sessionId}`);
}
export async function set(key: Key, value: string, username: string = "") {
const sessionId = await getSessionIdAndCreateIfMissing();
await redis.hset(`session-${username}-${sessionId}`, { [key]: value });
return redis.expire(`session-${username}-${sessionId}`, 900);
}
<पी> आइए इन कार्यों की जाँच करें। - <पी> getSessionId :हम सत्र आईडी को उपयोगकर्ताओं के ब्राउज़र की कुकीज़ में संग्रहीत करेंगे। यह फ़ंक्शन HTTP कॉल के अंदर एपीआई को भेजे गए ब्राउज़र कुकीज़ से सत्र आईडी प्राप्त करना है।
- <पी> setSessionId :यह फ़ंक्शन सत्र आईडी कुकी को दिए गए सत्र आईडी पैरामीटर पर सेट करता है।
- <पी> getSessionIdAndCreateIfMissing :यह फ़ंक्शन
getSessionId को कॉल करता है कुकीज़ से मौजूदा सत्र आईडी प्राप्त करने के लिए और नए यादृच्छिक यूयूआईडी को नए सत्र आईडी के रूप में सेट करने के लिए जब तक कि उपयोगकर्ता के ब्राउज़र में पहले से ही एक सत्र आईडी न हो। यह फ़ंक्शन ब्राउज़र पर वापस भेजने के लिए कुकीज़ में नई सत्र आईडी भी जोड़ता है।
- <पी> सत्रडेटा प्राप्त करें :हम रेडिस से सत्र डेटा प्राप्त करने के लिए इस फ़ंक्शन को कॉल करेंगे। यह अपस्टैश रेडिस से दी गई कुंजी का सत्र डेटा प्राप्त करेगा और उसे वापस कर देगा।
- <पी> सभी सत्र डेटा प्राप्त करें :यह फ़ंक्शन सभी सत्र डेटा प्राप्त करता है। यह अपस्टैश रेडिस से सत्र हैश के सभी कुंजी-मूल्य जोड़े प्राप्त करता है।
- <पी> सेटसेशनडेटा :हम इस फ़ंक्शन में दिए गए सत्र के कुंजी-मूल्य जोड़े सेट करेंगे।
<पी> चूंकि उपयोगिता अपस्टैश रेडिस के माध्यम से सत्र आईडी और सत्र भंडारण को प्रबंधित करने के लिए कार्य करती है, अब हम एक एपीआई लागू कर सकते हैं जो इन कार्यों का उपयोग करता है। <पी> एपीआई बहुत सरल होगी. यह पथ से उपयोगकर्ता नाम प्राप्त करेगा. एक बार अनुरोध प्राप्त होने पर, यह पहले जांच करेगा कि कुकीज़ में सत्र आईडी मौजूद है या नहीं। यदि कुकीज़ में कोई सत्र आईडी नहीं है, तो यह एक नई आईडी उत्पन्न करेगा और इसे प्रतिक्रिया में कुकीज़ में सेट करेगा। यदि सत्र आईडी मौजूद है, तो यह जांच करेगा कि हैश में अपस्टैश रेडिस में कोई कुंजी है जो सत्र का प्रतिनिधित्व करती है। यदि नहीं है, तो यह उस हैश में कुंजी-मूल्य जोड़े बनाएगा। <पी> आइए कोड करें! <पी> एपीआई Nextjs के ऐप राउटर्स का उपयोग करके बनाया जाएगा। <पी> हमें app/api/user/ के अंतर्गत एक फ़ाइल बनानी चाहिए [उपयोगकर्ता नाम]named रूट.tsx`. import * as sessionStore from '../../lib/session'
export async function GET(request: Request,{ params }: { params: Promise<{ user: string }> }){
const userName = (await params).user;
const sessionId = await sessionStore.getSessionIdAndCreateIfMissing();
const sessionStatus = await sessionStore.get('sessionStatus', userName);
if(sessionStatus == null) {
console.log('There is no active session.');
await sessionStore.set('sessionStatus', 'ACTIVE', userName);
}
return Response.json({ userName: userName, sessionId: sessionId });
}
<पी> यह रूट फ़ाइल Nextjs को <URL>:3000/api/user/<username> पर भेजे गए अनुरोध को हल करने की अनुमति देगी स्वयं के अंदर परिभाषित HTTP विधियों के लिए। <पी> अब, हम इसे क्रियान्वित होते देखेंगे। आइए टर्मिनल से रूट डायरेक्टरी पर जाकर और निम्नलिखित कमांड चलाकर नेक्स्टजेएस ऐप चलाएं: npm run dev
<पी> अब, हम एपीआई एंडपॉइंट, http://localhost:3000/api/user/noah खोल सकते हैं एक ब्राउज़र पर. जब आप इसे खोलते हैं, तो आपको उपयोगकर्ता नाम और सत्र आईडी दिखाई देनी चाहिए: {"userName":"noah","sessionId":"804814dc-10fc-4b0a-a4c1-321f4b54d399"}
<पी> यदि आप राइट-क्लिक करते हैं और निरीक्षण करते हैं, तो आप "एप्लिकेशन" टैब पर जाकर कुकीज़ में सत्र-आईडी सेट देखेंगे। <पी>
<पी> हम अपस्टैश रेडिस की भी जांच कर सकते हैं कि डेटाबेस में सत्र बनाया गया है या नहीं। इसे जांचने के लिए, हमें अपस्टैश रेडिस कंसोल पर वापस जाना चाहिए, रेडिस डेटाबेस खोलना चाहिए और Data Browser खोलना चाहिए। टैब. <पी> Data Browser टैब सत्र डेटा दिखाएगा जैसा कि नीचे दिखाया गया है। <पी>
निष्कर्ष
<पी> अपस्टैश रेडिस के साथ Next.js ऐप में सत्र प्रबंधित करना एक स्केलेबल और कुशल समाधान प्रदान करता है। इस ब्लॉग पोस्ट में, हमने एक Nextjs ऐप बनाया और इसे सत्र प्रबंधन भंडारण के रूप में उपयोग करने के लिए अपस्टैश रेडिस के साथ एकीकृत किया। <पी> रेडिस डेटाबेस स्थापित करके और इसे नेक्स्ट.जेएस के साथ सहजता से एकीकृत करके, आप पारंपरिक सर्वर-साइड जटिलताओं के बिना सत्र भंडारण को प्रभावी ढंग से संभाल सकते हैं। यह दृष्टिकोण सत्र प्रबंधन में प्रदर्शन और सरलता चाहने वाले डेवलपर्स के लिए आदर्श है। <पी> उम्मीद है, इस गाइड ने अपस्टैश रेडिस को आपके Next.js अनुप्रयोगों में एक विश्वसनीय सत्र स्टोर के रूप में लागू करने के लिए एक स्पष्ट मार्ग प्रदान किया है।