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

अपस्टैश रेडिस के साथ अपने नेक्स्ट.जेएस ब्लॉग में एक व्यू काउंटर जोड़ें

<पी> ली के ब्लॉग से प्रेरित होकर, जहां प्रत्येक ब्लॉग पोस्ट उसे देखे जाने की संख्या दिखाता है, मैं अपने पेज के लिए भी कुछ ऐसा ही करना चाहता था। मैं नए ऐप राउटर के साथ Next.js 13 का भी उपयोग कर रहा हूं, लेकिन पेज व्यू को MySQL डेटाबेस में संग्रहीत करने के बजाय, मैं अपस्टैश रेडिस का उपयोग करूंगा।

<पी> यहां एक उदाहरण दिया गया है कि हम क्या बना रहे हैं। होम पेज पर प्रत्येक कार्ड उसे देखे जाने की संख्या दिखाएगा।

<पी> अपस्टैश रेडिस के साथ अपने नेक्स्ट.जेएस ब्लॉग में एक व्यू काउंटर जोड़ें

रेडिस क्यों?

<पी> रेडिस पहले से ही 2 बेहतरीन कमांड के साथ आता है जो डुप्लिकेट को हटाना और काउंटर को बढ़ाना आसान बनाता है।

<पी> अधिक सटीक काउंटर पाने के लिए, मैं काउंटर की वृद्धि की आलोचना करना चाहता हूं। यदि कोई उपयोगकर्ता पृष्ठ को ताज़ा करता है, तो काउंटर को केवल एक बार बढ़ाया जाना चाहिए। हम इसे Redis' SET के साथ वास्तव में आसानी से कर सकते हैं आदेश. इसमें NX है विकल्प जो केवल कुंजी सेट करेगा यदि वह अभी तक मौजूद नहीं है और एक EX विकल्प जो एक निश्चित सेकंड के बाद कुंजी को समाप्त कर देगा। इन दोनों विकल्पों को मिलाकर हम यह सुनिश्चित कर सकते हैं कि एक एकल उपयोगकर्ता किसी दिए गए समय सीमा के भीतर काउंटर मल्टीपल बार वृद्धि न करे।

<पी> दूसरा कमांड INCR है जो किसी दी गई कुंजी को परमाणु रूप से 1 बढ़ा देगा।

रेडिस की स्थापना

<पी> अपस्टैश पर डेटाबेस स्थापित करना आसान है और इसमें प्रतिदिन 10 हजार अनुरोध निःशुल्क शामिल हैं! आप यहां एक नया डेटाबेस बना सकते हैं। इसमें वस्तुतः केवल कुछ ही सेकंड लगते हैं। बाद में नीचे स्क्रॉल करें और REST को कॉपी करें आपके .env.local के कनेक्शन रहस्य फ़ाइल:

.env.local
UPSTASH_REDIS_REST_URL=
UPSTASH_REDIS_REST_TOKEN=

Next.js

<पी> अब जब हमारे पास रेडिस डेटाबेस है, तो हम काउंटर को लागू करना शुरू कर सकते हैं। हमें पहले @upstash/redis इंस्टॉल करना होगा:

pnpm add @upstash/redis
<पी> पृष्ठ दृश्यों को संग्रहीत करने के लिए, हमें दो घटकों की आवश्यकता है। एक एपीआई मार्ग और एक क्लाइंट घटक। आइए एपीआई रूट से शुरुआत करें।

/api/incr.ts

<पी> अपस्टैश और @upstash/redis वर्सेल के एज फ़ंक्शंस के साथ संगत है, इसलिए सबसे पहले, हम अपनी ज़रूरत की हर चीज़ आयात करेंगे, रेडिस सेटअप करेंगे और रनटाइम को edge पर कॉन्फ़िगर करेंगे। .

<पी> एक नई फ़ाइल /api/incr.ts बनाएं और निम्नलिखित कोड जोड़ें:

/api/incr.ts
import { NextRequest, NextResponse } from "next/server";
 
import { Redis } from "@upstash/redis";
 
const redis = Redis.fromEnv();
 
export const config = {
 runtime: "edge",
};
<पी> आगे हमें रिक्वेस्टबॉडी में पारित करने के लिए एक स्लग या समान पहचानकर्ता की आवश्यकता होगी। यदि यह मौजूद नहीं है, तो हम 400 लौटा देंगे स्थिति कोड.

/api/incr.ts
export default async function incr(req: NextRequest): Promise<NextResponse> {
 const body = await req.json();
 const slug = body.slug as string | undefined;
 if (!slug) {
 return new NextResponse("Slug not found", { status: 400 });
 }
 
 // more to come here
}
<पी> फिर हमें उपयोगकर्ता का आईपी पता भी प्राप्त करना होगा। हम req.ip का उपयोग करके ऐसा कर सकते हैं संपत्ति. हम SHA-256 का उपयोग करके आईपी पते को हैश करेंगे एल्गोरिदम और इसे डेटाबेस में संग्रहीत करें। इस तरह हमें आईपी एड्रेस को सीधे स्टोर नहीं करना पड़ेगा, जो एक सुरक्षा चिंता का विषय हो सकता है।

/api/incr.ts
const ip = req.ip;
// Hash the IP and turn it into a hex string
const buf = await crypto.subtle.digest("SHA-256", new TextEncoder().encode(ip));
const hash = Array.from(new Uint8Array(buf))
 .map((b) => b.toString(16).padStart(2, "0"))
 .join("");
<पी> अब ऊपर उल्लिखित पहले रेडिस कमांड का उपयोग करते हैं। SET का उपयोग करना NX के साथ और EX यह हमें यह जांचने का एक आसान तरीका देता है कि कोई विशिष्ट आईपी पता पिछले 24 घंटों के भीतर किसी पृष्ठ को देख रहा है या नहीं:

/api/incr.ts
const isNew = await redis.set(["deduplicate", hash, slug].join(":"), true, {
 nx: true,
 ex: 24 * 60 * 60,
});
if (!isNew) {
 new NextResponse(null, { status: 202 });
}
<पी> आखिरी काम यह है कि दिए गए स्लग के लिए काउंटर को बढ़ाया जाए। हम INCR का उपयोग करेंगे इसके लिए आदेश:

/api/incr.ts
await redis.incr(["pageviews", "projects", slug].join(":"));
return new NextResponse(null, { status: 202 });
<पी> संदर्भ के लिए, आप पूरा कोड यहां पा सकते हैं

/app/[slug]/view.tsx

<पी> इसके बाद, आइए एक छोटा क्लाइंट घटक बनाएं, जो माउंट होने पर हमारे द्वारा अभी बनाए गए एपीआई रूट पर एक अनुरोध भेजता है। इस घटक को किसी भी पेज में एम्बेड किया जा सकता है जिसे हम ट्रैक करना चाहते हैं।

/app/[slug]/view.tsx
"use client";
 
import { useEffect } from "react";
 
export const ReportView: React.FC<{ slug: string }> = ({ slug }) => {
 useEffect(() => {
 fetch("/api/incr", {
 method: "POST",
 headers: {
 "Content-Type": "application/json",
 },
 body: JSON.stringify({ slug }),
 });
 }, [slug]);
 
 return null;
};

/app/[slug]/page.tsx

<पी> आखिरी चीज़ जो हमें करने की ज़रूरत है वह है ReportView जोड़ना उस पृष्ठ का घटक जिसे हम ट्रैक करना चाहते हैं:

/app/[slug]/page.tsx
import { ReportView } from "./view";
 
type Props = {
 params: {
 slug: string;
 };
};
 
export default function Page({ params }: Props) {
 return (
 <div>
 <ReportView slug={params.slug} />
 {/* Add your page content here */}
 </div>
 );
}
<पी> अब से /app/[slug] की सभी विज़िटें ट्रैक किया जाएगा और पिछले 24 घंटों में प्रत्येक अद्वितीय आगंतुक के लिए काउंटर बढ़ाया जाएगा।

दृश्य प्रदर्शित करना

<पी> दृश्यों को ट्रैक करना अच्छा है, लेकिन हम उन्हें सार्वजनिक रूप से प्रदर्शित भी करना चाहते हैं। आइए देखें कि हम यह कैसे कर सकते हैं।

<पी> दृश्यों की संख्या प्रदर्शित करने के लिए, हमें उन्हें डेटाबेस से देखना होगा। हम GET का उपयोग करके ऐसा कर सकते हैं आदेश. हमें एक revalidate भी जोड़ना चाहिए पृष्ठ घटक में कॉन्फ़िगर करें, ताकि पृष्ठ हर 60 सेकंड में पुनः मान्य हो, न कि हर अनुरोध के लिए।

/app/[slug]/page.tsx
type Props = {
 params: {
 slug: string;
 };
};
 
export const revalidate = 60
 
export default function Page({ params }: Props) {
 const views = await redis.get<number>(["pageviews", "projects", params.slug].join(":")) ?? 0
 
 return ...
}

अंतिम शब्द

<पी> इसका पूरा उदाहरण chronark.com पर देखें। कोड GitHub पर उपलब्ध है। विशेष रूप से, यहां प्रासंगिक बिट्स हैं:

  • एपीआई मार्ग
  • ट्रैकिंग घटक
  • दृश्यों की संख्या लोड हो रही है
<पी> यदि आप अधिक पृष्ठ दृश्य विश्लेषण में रुचि रखते हैं, तो कृपया हमें ट्विटर या डिस्कॉर्ड पर बताएं।


  1. हम JTextField को जावा में केवल संख्याएँ कैसे स्वीकार कर सकते हैं? हम JTextField को जावा में केवल संख्याएँ कैसे स्वीकार कर सकते हैं?

    डिफ़ॉल्ट रूप से, एक JTextField संख्याओं की अनुमति दे सकते हैं , अक्षर , और विशेष अक्षर . JTextField . में टाइप किए गए उपयोगकर्ता इनपुट को मान्य करना मुश्किल हो सकता है, खासकर अगर इनपुट स्ट्रिंग को एक संख्यात्मक मान जैसे कि एक int में परिवर्तित किया जाना चाहिए। नीचे दिए गए उदाहरण में, JTextField

  1. प्लॉट की क्षैतिज और ऊर्ध्वाधर, प्रमुख और छोटी ग्रिडलाइनों को स्वतंत्र रूप से कैसे सेट करें? प्लॉट की क्षैतिज और ऊर्ध्वाधर, प्रमुख और छोटी ग्रिडलाइनों को स्वतंत्र रूप से कैसे सेट करें?

    प्लॉट की क्षैतिज और ऊर्ध्वाधर, बड़ी और छोटी ग्रिड लाइनें सेट करने के लिए, हम ग्रिड () . का उपयोग कर सकते हैं विधि। कदम आकृति का आकार सेट करें और सबप्लॉट के बीच और आसपास पैडिंग समायोजित करें। एक आकृति और सबप्लॉट का एक सेट बनाएं। प्रमुख टिकों के लिए क्षैतिज ग्रिड लाइनें बनाएं। कुल्हाड़ियों पर लघु लोक

  1. आईओएस ऐप की बिल्ड/संस्करण संख्या कैसे प्राप्त करें? आईओएस ऐप की बिल्ड/संस्करण संख्या कैसे प्राप्त करें?

    इस पोस्ट में हम सीखेंगे कि आईओएस बिल्ड और वर्जन नंबर कैसे लाएं और दिखाएं चरण 1 − ओपन एक्सकोड → नया प्रोजेक्ट → सिंगल व्यू एप्लीकेशन → चलो इसे ShowBuildAndVersion नाम दें चरण 2 - Main.storyboard खोलें और नीचे दिखाए अनुसार दो लेबल जोड़ें। चरण 3 - दो लेबल के लिए @IBOutLets संलग्न करें @IBOutlet we