Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> Redis

QStash का उपयोग करके Redis स्टेट को अपने डेटाबेस के साथ निर्बाध रूप से सिंक्रोनाइज़ करें

पिछले लेख में, हमने चर्चा की थी कि हम फुल-स्टैक Next.js ऐप पर अपने यूजर के कोटा की स्थिति को स्टोर करने के लिए Redis का उपयोग कैसे कर सकते हैं। ऐसा करने से हम अपने एप्लिकेशन के प्रदर्शन में सुधार कर सकते हैं, क्योंकि Redis आमतौर पर डेटाबेस की तुलना में बहुत तेज है।

Upstash Redis विशेष रूप से इस उपयोग के मामले के लिए एक बढ़िया विकल्प है, क्योंकि यह एक पूरी तरह से प्रबंधित Redis डेटाबेस है और HTTP के माध्यम से सुलभ है। इसका मतलब है कि हम Vercel जैसे एज रनटाइम का उपयोग करके अपने कोड को न्यूनतम विलंबता के साथ यूजर के करीब चला सकते हैं।

QStash क्या है?

QStash सर्वरलेस और एज रनटाइम के लिए एक HTTP-आधारित मैसेजिंग और शेड्यूलिंग समाधान है। दूसरे शब्दों में, यह आपको HTTP अनुरोध भेजकर CRON जॉब चलाने की अनुमति देता है।

CRON जॉब विशिष्ट समय पर चलाने के लिए कार्यों को शेड्यूल करने का एक शानदार तरीका है। यह CRON जॉब जितना चाहे उतना समय ले सकता है बिना आपके एप्लिकेशन या एंड-यूजर्स के प्रदर्शन को प्रभावित किए।

इस लेख में हमारे CRON जॉब का लक्ष्य Redis से हमारे डेटाबेस में अपने यूजर्स के कोटा की स्थिति को सिंक करना है। हम इस कार्य को हर घंटे चलाएंगे।

QStash के साथ CRON जॉब एंडपॉइंट बनाना

यहां पिछले लेख का एक त्वरित पुनर्कथन है कि हम Redis में अपने यूजर्स के कोटा की स्थिति को कैसे संभालते हैं:

// Redis में संग्रहीत कुंजी। प्रत्येक यूजर के लिए एक कुंजी बनाई जाती है, और उनकी ID द्वारा अद्वितीय बनाई जाती है।
const quotaKey = `user:${userId}:quota`;
// कुंजी के मान को 1 से बढ़ाने के लिए INCR कमांड कॉल करें।
const quota = await redis.incr(quotaKey);
// यदि कुंजी का मान 1 है, तो इसका मतलब है कि कुंजी बनाई गई है।
// हम EXPIRE कमांड का उपयोग करके इस कुंजी पर 24 घंटे की समाप्ति तिथि सेट कर सकते हैं।
if (quota === 1) {
  await redis.expire(quotaKey, 60 * 60 * 24);
}

इस कोड को देखते हुए, हम अब QStash का उपयोग करके एक CRON जॉब एंडपॉइंट बना सकते हैं। हमारा CRON जॉब एंडपॉइंट URL /api/cron/update-usage पर ट्रिगर होगा।

आइए अपने Next.js एंडपॉइंट के लिए एक नई फाइल बनाएं:

touch pages/api/cron/update-usage.ts

फिर, हम यह सुनिश्चित करना चाहते हैं कि केवल QStash इस एंडपॉइंट को ट्रिगर कर सके, यही @upstash/qstash हमारे लिए संभालता है। यदि हम ऐसा नहीं करते हैं, तो कोई भी संभावित रूप से CRON जॉब एंडपॉइंट को ट्रिगर कर सकता है जिससे सुरक्षा समस्याएं हो सकती हैं।

आइए @upstash/qstash इंस्टॉल करें:

npm install @upstash/qstash

अब हम अपने CRON जॉब एंडपॉइंट के कोड पर ध्यान केंद्रित कर सकते हैं।

यहां हम क्या करेंगे इसका एक त्वरित पुनर्कथन:

  • SCAN का उपयोग करके Redis से सभी यूजर्स के कोटा कुंजी प्राप्त करें (परफॉर्मेंट कर्सर-आधारित पेजिनेशन)।
  • SCAN से मिली प्रत्येक कुंजी के लिए, यूजर की ID और उनके कोटा वाले ऑब्जेक्ट की एक users सरणी बनाएं।
  • users सरणी के अंदर प्रत्येक यूजर के लिए एक ट्रांजैक्शन बनाएं ताकि डेटाबेस में उनका कोटा अपडेट हो सके। यह Prisma का उपयोग करके किया जाता है।
  • @upstash/qstash/nextjs से verifySignature फंक्शन के साथ एंडपॉइंट फंक्शन निर्यात करें ताकि यह सुनिश्चित हो सके कि केवल QStash एंडपॉइंट को ट्रिगर कर सकता है।

पूरा कोड एंडपॉइंट यहां है, मैंने कोड के हर पहलू पर टिप्पणी करना सुनिश्चित किया है:

// /pages/api/cron/update-usage.ts
import type { NextApiRequest, NextApiResponse } from "next";
import { verifySignature } from "@upstash/qstash/nextjs";
import prisma from "@/lib/prisma";
// एनवायरनमेंट वेरिएबल का उपयोग करके Upstash Redis इंस्टेंस जेनरेट करें।
// सुनिश्चित करें कि वे आपकी .env फाइल में परिभाषित हैं।
const redis = new Redis({
  url: process.env.UPSTASH_REDIS_REST_URL!,
  token: process.env.UPSTASH_REDIS_REST_TOKEN!,
});
// `@upstash/qstash` द्वारा आवश्यक।
export const config = {
  api: { bodyParser: false }
};
// Redis डेटाबेस से Prisma डेटाबेस में डेटा खींचकर हर यूजर के उपयोग को अपडेट करें।
async function handler(req: NextApiRequest, res: NextApiResponse) {
  // `SCAN` के दौरान मिली सभी कुंजियों को समाहित करता है।
  const keys: string[] = [];
  // कर्सर की वर्तमान स्थिति, प्रत्येक `SCAN` के बाद अपडेट की जाती है।
  let cursor = 0;
  // `SCAN` कमांड का उपयोग करके कर्सर-आधारित पेजिनेशन निष्पादित करें।
  // Redis `0` लौटाता है जब कर्सर पेजिनेशन के अंत में होता है।
  do {
    const [nextCursor, newKeys] = await redis.scan(cursor, {
      // उन कुंजियों के पैटर्न से मिलान करें जिन्हें हम ढूंढना चाहते हैं, जहां `*` वाइल्डकार्ड है।
      match: "user:*:quota",
      // `SCAN` कमांड द्वारा लौटाई गई कुंजियों की संख्या सीमित करें।
      count: 10,
    });
    cursor = nextCursor;
    keys.push(...newKeys);
  } while (cursor !== 0);
  // ऑब्जेक्ट की सरणी जिसमें यूजर की ID और उनका कोटा होता है।
  const users: { id: number; quota: number }[] = [];
  // मिली कुंजियों के आधार पर Redis से प्रत्येक यूजर का उपयोग प्राप्त करें।
  for (const key of keys) {
    // एक कुंजी `user:${id}:quota` फॉर्मेट में होनी चाहिए। ID प्राप्त करने के लिए कुंजी को विभाजित करें।
    const id = key.split(":")[1];
    // `GET` कमांड का उपयोग करके यूजर का वर्तमान कोटा प्राप्त करें।
    const quota = await redis.get(`user:${id}:quota`);
    users.push({ id: parseInt(id, 10), quota });
  }
  // डेटाबेस में उनके कोटा को अपडेट करने के लिए प्रत्येक यूजर के लिए एक ट्रांजैक्शन बनाएं।
  const promises = users.map((user) =>
    prisma.user.update({
      where: { id: user.id },
      data: { quota: user.quota },
    }),
  );
  // सभी ट्रांजैक्शन चलाएं।
  await Promise.all(promises);
  return res.status(200).json({ message: "OK" });
}
// हैंडलर को `verifySignature` फंक्शन के साथ निर्यात करें ताकि यह सुनिश्चित हो सके कि केवल
// QStash CRON जॉब को ट्रिगर करने के लिए प्रमाणित कर सकता है।
export default verifySignature(handler);

सबसे कठिन हिस्सा हो गया!

QStash सेटअप करना

अब अपना कोड पुश करने से पहले, हमें QStash सेटअप करने की आवश्यकता है। QStash एक उदार फ्री टियर प्रदान करता है, हम प्रति दिन 500 अनुरोध तक उपयोग कर सकते हैं।

अपने Upstash Console में लॉगिन करें और QStash टैब पर क्लिक करें।

फिर, आइए Request Builder का उपयोग करके एक नया शेड्यूल्ड CRON जॉब बनाएं। सहज UI के लिए धन्यवाद यह बहुत सरल है:

QStash का उपयोग करके Redis स्टेट को अपने डेटाबेस के साथ निर्बाध रूप से सिंक्रोनाइज़ करें

Schedule बटन पर क्लिक करने के बाद, यदि आप नीचे स्क्रॉल करते हैं, तो आप Scheduled Jobs सेक्शन पर अपना CRON जॉब देखेंगे:

QStash का उपयोग करके Redis स्टेट को अपने डेटाबेस के साथ निर्बाध रूप से सिंक्रोनाइज़ करें

अंतिम चरण, हमें अपने Next.js एप्लिकेशन में 2 एनवायरनमेंट वेरिएबल सेटअप करने की आवश्यकता है। वे वेरिएबल वहां जोड़े जाएंगे जहां हमारा Next.js एप्लिकेशन होस्ट किया गया है, इस मामले में Vercel पर।

Request Builder सेक्शन में, कॉपी करने के लिए तैयार 2 एनवायरनमेंट वेरिएबल हैं:

  • QSTASH_CURRENT_SIGNING_KEY
  • QSTASH_NEXT_SIGNING_KEY

ये आने वाले संदेश को प्रमाणित करने के लिए आवश्यक हैं। अन्यथा कोई भी आपके एंडपॉइंट को कॉल करने में सक्षम होगा।

QStash का उपयोग करके Redis स्टेट को अपने डेटाबेस के साथ निर्बाध रूप से सिंक्रोनाइज़ करें

एक बार जब आपके पास ये वेरिएबल हों, तो आप उन्हें अपने Vercel प्रोजेक्ट में जोड़ सकते हैं।

ऐसा करने के लिए, अपने Vercel प्रोजेक्ट पर जाएं, Settings पर क्लिक करें और फिर Environment Variables पर:

QStash का उपयोग करके Redis स्टेट को अपने डेटाबेस के साथ निर्बाध रूप से सिंक्रोनाइज़ करें

2 एनवायरनमेंट वेरिएबल जोड़ने के बाद, अब आप अपना कोड पुश कर सकते हैं।

QStash समय-समय पर CRON जॉब एंडपॉइंट को ट्रिगर करेगा और हर घंटे हर यूजर के उपयोग को अपडेट करेगा।

निष्कर्ष

Upstash सर्वरलेस वातावरण के लिए बहुत सारे टूल प्रदान करता है। हम QStash और Redis का एक साथ उपयोग करके कई उपयोग के मामलों के लिए प्रदर्शनकारी और स्केलेबल एप्लिकेशन बना सकते हैं।

यदि आप इसे लाइव देखना चाहते हैं, तो वही सिस्टम fastsheet पर लागू किया गया है, एक टूल जो आपकी स्प्रेडशीट को API में बदल देता है।

  1. CSS के साथ लिस्ट्स स्टाइल करना CSS के साथ लिस्ट्स स्टाइल करना

    CSS से लिस्ट स्टाइलिंग लिस्ट्स ऑर्डर्ड (ol) और अनऑर्डर्ड (ul) होती हैं। CSS से आप लिस्ट आइटम मार्कर्स का प्रकार सेट कर सकते हैं या मार्कर्स के लिए इमेज उपयोग कर सकते हैं। साथ ही लिस्ट-आइटम मार्कर्स की पोजिशन भी सेट कर सकते हैं। 1. list-style-type list-style-type लिस्ट-आइटम मार्कर का प्रकार सेट करत

  1. Android में प्रोग्रामेटिकली इनबॉक्स से SMS कैसे डिलीट करें? Android में प्रोग्रामेटिकली इनबॉक्स से SMS कैसे डिलीट करें?

    यह उदाहरण दर्शाता है कि Android में ContentResolver का उपयोग करके इनबॉक्स से SMS को प्रोग्रामेटिकली कैसे डिलीट किया जाए। चरण 1: नया प्रोजेक्ट बनाएं Android Studio में नया प्रोजेक्ट बनाएं। चरण 2: लेआउट XML res/layout/activity_main.xml: <?xml version=1.0 encoding=utf-8?> <RelativeLayout xml

  1. JavaFX में पथ तत्व रेखा (Line) कैसे बनाएं? JavaFX में पथ तत्व रेखा (Line) कैसे बनाएं?

    javafx.scene.shape.LineTo क्लास पथ तत्व रेखा (line) को दर्शाता है। यह आपको वर्तमान निर्देशांक से निर्दिष्ट (नए) निर्देशांक तक एक सीधी रेखा खींचने में मदद करता है। रेखा पथ तत्व बनाने के चरण LineTo क्लास को इंस्टेंटिएट करें। इस क्लास के गुणों को सेटर मेथड्स या कंस्ट्रक्टर के माध्यम से मान निर्दिष्ट