इस लेख में, मैं PlanTripAI के विकास में Upstash की महत्वपूर्ण भूमिका का पता लगाता हूं, एक AI-संचालित ट्रिप प्लानिंग स्टार्टअप। Upstash Redis का उपयोग उपयोगकर्ता पहुंच के लिए प्रमुख लाइसेंस स्टोर करने और ट्रिप कंटेंट को कुशलतापूर्वक सहेजने और कैश करने जैसे आवश्यक पहलुओं के प्रबंधन के लिए महत्वपूर्ण रहा है। इसके अलावा, Upstash की रेट लिमिट सुविधा हमारे सिस्टम की सुरक्षा में महत्वपूर्ण भूमिका निभाती है। यह अनुरोध आवृत्तियों को प्रभावी ढंग से प्रबंधित करता है, संभावित सुरक्षा खतरों के खिलाफ मजबूत सुरक्षा प्रदान करता है और हमारे उपयोगकर्ताओं के लिए एक सहज, निर्बाध सेवा सुनिश्चित करता है।
plantripai.com एक AI-आधारित ट्रिप प्लानर है जो उपयोगकर्ता प्राथमिकताओं जैसे गंतव्य, ठहरने की अवधि, यात्रा शैली और बजट के आधार पर त्वरित रूप से व्यक्तिगत यात्रा कार्यक्रम बनाता है। यह असीमित यात्रा कार्यक्रम निर्माण और विभिन्न डाउनलोड प्रारूप प्रदान करता है।
- @upstash/redis
- @upstash/ratelimit
- next.js
यह कैसे काम करता है
AI कंपनियां आमतौर पर उपयोगकर्ताओं को अपने उत्पादों को आजमाने के कई तरीके प्रदान करती हैं। PlanTripAI पर, हम फ्रीमियम और सशुल्क योजना दोनों प्रदान करते हैं।
हमारे फ्रीमियम, और सबसे लोकप्रिय योजना में: हर बार जब कोई उपयोगकर्ता वैध लाइसेंस के बिना एक ट्रिप बनाता है, तो एक नई यादृच्छिक कुंजी उत्पन्न होती है और एक Redis हैश (redis.hset(trip:${key}, data)) में ट्रिप कंटेंट के साथ संग्रहीत की जाती है। यह कुंजी ट्रिप के विवरण पृष्ठ तक अस्थायी पहुंच प्रदान करती है। एक बार यह पहुंच समाप्त हो जाने पर, उपयोगकर्ता तय कर सकता है कि ट्रिप तक स्थायी पहुंच बनाए रखनी है या नहीं।
इसके अलावा, फ्रीमियम उपयोगकर्ता fixedWindow का उपयोग करके 3 अनुरोध प्रति 10 सेकंड की रेट लिमिट के अधीन हैं, जो एप्लिकेशन पर संभावित हमलों को रोकने में मदद करता है।

सशुल्क योजना के संबंध में, उपयोगकर्ता भुगतान गेटवे के माध्यम से उत्पाद खरीद सकते हैं। सफल लेनदेन पर, भुगतान गेटवे का वेबहुक एक सफलता इवेंट उत्सर्जित करता है, और एक कुंजी को Redis में वैध कुंजी के रूप में संग्रहीत किया जाता है (redis.set(${licenseKey}, true))।
जब एक वैध लाइसेंस वाला उपयोगकर्ता एक ट्रिप बनाता है, तो एक यादृच्छिक कुंजी अभी भी उत्पन्न होती है और Redis में संग्रहीत होती है। इसके अलावा, नई ट्रिप को उनके उपयोगकर्ता ऑब्जेक्ट में संग्रहीत किया जाता है और उनके लाइसेंस कुंजी से जोड़ा जाता है।
सशुल्क उपयोगकर्ता फ्रीमियम उपयोगकर्ताओं की तुलना में अधिक उदार रेट लिमिट का आनंद लेते हैं। यह उन्नत सुविधा Redis में वैध कुंजी की जांच करके गतिशील रूप से प्रदान की जाती है।

ट्रिप डेटा संग्रहीत करना
PlanTripAI उपयोगकर्ता-निर्मित ट्रिप को संग्रहीत करने के लिए Redis का लाभ उठाता है। Redis हमारे लिए एक आदर्श विकल्प है क्योंकि यह एक तेज़ कुंजी-मूल्य स्टोर के रूप में अपनी दक्षता के कारण है। चूंकि एक बार बनने के बाद ट्रिप अपरिवर्तनीय होते हैं, और हैश का उपयोग हमें प्रमुख डेटा के साथ मेटाडेटा संग्रहीत करने में सक्षम बनाता है।
ट्रिप डेटा Redis हैश में निम्नानुसार संरचित है:
{
"itinerary": [
{ "day": "Day 1", "data": [...] }
],
"info": "This itinerary is designed for a city explorer visiting Paris, France for 2 days.",
"inputs": {
"city": "Paris, France",
"days": 2,
"accommodation": "Paris France Hotel",
"kind": "city explorer",
"currency": "USD",
"budget": 3000,
"transportation": "bus"
},
"createdAt": ...,
"shareable": false
}
HTTP पर Upstash Redis API का उपयोग करके, डेटा को मुफ्त Redis डेटाबेस में संग्रहीत किया जाता है, जो प्रति दिन 10,000 अनुरोध मुफ्त में प्रदान करता है, जो हमारी आवश्यकताओं के लिए पर्याप्त से अधिक है।
import { Redis } from "@upstash/redis";
const redis = new Redis({
url: "..." // UPSTASH_REDIS_REST_URL
token: "..." // UPSTASH_REDIS_REST_TOKEN
});
redis.hset(`trip:${id}`, data);
वैध लाइसेंस कुंजियाँ संग्रहीत करना
जैसा कि पहले उल्लेख किया गया है, PlanTripAI की सभी सुविधाओं तक पहुंचने का एक तरीका सशुल्क सदस्यता के माध्यम से है, जहां प्रत्येक सशुल्क उपयोगकर्ता को Redis में संग्रहीत एक वैध लाइसेंस कुंजी सौंपी जाती है। यह सेटअप त्वरित सत्यापन जांच के लिए आदर्श है, Redis की कुंजी-मूल्य डेटाबेस के रूप में दक्षता को देखते हुए।
उपयोगकर्ता को वैध के रूप में चिह्नित करने के लिए, हम निम्न कमांड निष्पादित करते हैं:
import { Redis } from "@upstash/redis";
const redis = new Redis({
url: "..." // UPSTASH_REDIS_REST_URL
token: "..." // UPSTASH_REDIS_REST_TOKEN
});
await redis.set(licenseKey, true);
उपयोगकर्ता की वैधता सत्यापित करने के लिए, हम इस कमांड का उपयोग करते हैं:
import { Redis } from "@upstash/redis";
const redis = new Redis({
url: "..." // UPSTASH_REDIS_REST_URL
token: "..." // UPSTASH_REDIS_REST_TOKEN
});
const redisLicenseKey = await redis.get(licenseKey);
const valid = Boolean(redisLicenseKey);
if (!valid) {
return new Response(
JSON.stringify({ message: "The license key is invalid!" }),
{ status: 401, }
);
}
// सफल कोड यहां...
रेट लिमिट लागू करना
हमारे एप्लिकेशन की सुरक्षा में एक प्रमुख विशेषता रेट लिमिट लॉजिक है, जिसे Upstash Rate Limit द्वारा समर्थित किया जाता है। अधिक जानकारी यहां पाई जा सकती है। यह सेवा मुफ्त और सशुल्क दोनों उपयोगकर्ताओं के लिए एक सहज अनुभव बनाए रखने के लिए महत्वपूर्ण है, जिसने समग्र एप्लिकेशन को प्रभावित किए बिना दुर्भावनापूर्ण उपयोगकर्ताओं के हमलों को सफलतापूर्वक विफल कर दिया है।
नीचे next.js का उपयोग करके मिडलवेयर के रूप में एक कोड स्निपेट है। यह कोड उपयोगकर्ता IP जांच को प्रबंधित करने और यह तय करने में मदद करता है कि बाद के अनुरोधों के साथ आगे बढ़ना है या नहीं।
import { NextResponse, type NextFetchEvent, type NextRequest, } from "next/server";
import { Ratelimit } from "@upstash/ratelimit";
import { Redis } from "@upstash/redis";
const cache = new Map();
const ratelimit = new Ratelimit({
redis: Redis.fromEnv(),
limiter: Ratelimit.fixedWindow(3, "10s"),
ephemeralCache: cache,
analytics: true,
});
export default async function middleware(
request: NextRequest,
event: NextFetchEvent
): Promise<Response | undefined> {
const id = request.ip ?? "anonymous";
// वैकल्पिक हार्ड कोडेड IPs
const blockeds = [];
if (blockeds.includes(id.trim())) {
new NextResponse(
JSON.stringify({ message: "Blocked :)" }),
{ status: 429, headers: { "Content-Type": "application/json" } }
);
}
const { success, pending, limit, reset, remaining } = await ratelimit.limit(id);
event.waitUntil(pending);
request.headers.set("X-RateLimit-Limit", limit.toString());
request.headers.set("X-RateLimit-Remaining", remaining.toString());
request.headers.set("X-RateLimit-Reset", reset.toString());
return success ? NextResponse.next() : new NextResponse(
JSON.stringify({ message: "Request cannot be processed! You sent too many requests in a given amount of time." }),
{ status: 429, headers: { "Content-Type": "application/json" } }
);
}
export const config = {
matcher: ["/api/generate-trip", "/api/get-license/(.*)"],
};
अंतिम शब्द
पढ़ने के लिए समय निकालने के लिए धन्यवाद! PlanTripAI एक साइड प्रोजेक्ट के रूप में शुरू हुआ, जो Next.js के साथ SaaS फ्रेमवर्क में Upstash Redis को एकीकृत करने की मेरी जिज्ञासा से पैदा हुआ।
मैं ईमानदारी से आशा करता हूं कि आपने इसे जानकारीपूर्ण और व्यावहारिक पाया। आपके प्रश्न या प्रतिक्रिया की बहुत सराहना की जाती है। किसी भी प्रश्न या टिप्पणी के लिए Twitter पर मुझसे जुड़ने के लिए स्वतंत्र महसूस करें।