কম্পিউটার

ফ্লটার, সার্ভারলেস ফ্রেমওয়ার্ক এবং আপস্ট্যাশ (REDIS) সহ ফুলস্ট্যাক সার্ভারলেস অ্যাপ - পার্ট 1

এই পোস্টে, আমরা ডেটা সংরক্ষণের জন্য ফ্লটার, সার্ভারলেস ফ্রেমওয়ার্ক, আপস্ট্যাশ এবং রেডিস সহ একটি সার্ভারহীন মোবাইল অ্যাপ্লিকেশন তৈরি করব৷

Upstash কি?

Upstash হল Redis এর জন্য একটি সার্ভারহীন ডাটাবেস। Upstash-এর সাথে, আপনি প্রতি-অনুরোধে অর্থ প্রদান করেন। এর মানে ডাটাবেস ব্যবহার না হলে আপনাকে চার্জ করা হবে না।

Upstash আপনার জন্য ডাটাবেস কনফিগার করে এবং পরিচালনা করে

  • কম বিলম্ব
  • ব্যবহারের সহজলভ্য, ঠিক REDIS API-এর মতো।

বিকল্প ক্লাউড-ভিত্তিক সমাধানগুলির সাথে Upstash-এর তুলনা করার জন্য এখানে একটি বিশদ নথি রয়েছে, যা আপনাকে আপনার পরবর্তী প্রকল্পের জন্য কেন এটি বেছে নেওয়া উচিত তার একটি স্পষ্ট কারণ দেয়৷

আপনি সেখানে উপলব্ধ সমস্ত সার্ভারহীন ডাটাবেসের তুলনা করে এই নিবন্ধটিও দেখতে পারেন

Upstash এর সাথে,

  • আপনি বিনামূল্যে শুরু করুন এবং শুধুমাত্র আপনি যা ব্যবহার করেন তার জন্য অর্থ প্রদান করুন
  • এতে দ্রুত, টেকসই স্টোরেজ রয়েছে
  • গ্লোবাল ডাটাবেস এবং এজ ক্যাশিংয়ের কারণে কম লেটেন্সি সহ আপনি পৃথিবীর যেকোন জায়গা থেকে আপনার ডাটাবেস অ্যাক্সেস করতে পারেন।

আজই বিনামূল্যের জন্য Upstash-এ শুরু করুন

Upstash-এ কার্যকরভাবে অ্যাপ্লিকেশন তৈরি করার জন্য, আপনাকে অবশ্যই Redis বুঝতে হবে। তাই এটা ঠিক যে আমরা Redis-এর একটি সংক্ষিপ্ত পরিচিতি করি এবং দেখুন কিভাবে আমরা আমাদের Upstash অ্যাপের মধ্যে এটি ব্যবহার করব।

আপনি যদি আরও বিশদ এবং গভীরভাবে কিছু পছন্দ করেন তবে আমি অফিসিয়াল রেডিস ওয়েবসাইট সুপারিশ করি

রেডিস হল একটি ওপেন সোর্স (বিএসডি লাইসেন্সপ্রাপ্ত), ইন-মেমরি ডেটা স্ট্রাকচার স্টোর, ডাটাবেস, ক্যাশে এবং মেসেজ ব্রোকার হিসেবে ব্যবহৃত হয়।

এটি এক টন ডেটা স্ট্রাকচার সমর্থন করে যেমন

  • স্ট্রিংস
  • হ্যাশ
  • তালিকা
  • সেট
  • রেঞ্জ কোয়েরি সহ সাজানো সেট
  • বিটম্যাপ
  • হাইপারলগস
  • ভূ-স্থানিক সূচকগুলি

আপনি কমান্ড ব্যবহার করে একটি রেডিস ডাটাবেসের সাথে ইন্টারঅ্যাক্ট করেন এবং একটি কী মান বিন্যাসে ডেটা সংরক্ষণ করেন, যেখানে কী একটি স্ট্রিং এবং মান হতে পারে, রেডিস দ্বারা সমর্থিত যে কোনও ডেটা কাঠামো।

উদাহরণস্বরূপ, আমি Redis কমান্ড SET ব্যবহার করতে পারি আমার উপাধির মান এভাবে সংরক্ষণ করতে

SET surname Rosius

যেখানে সারনেম হল কী এবং রোসিয়াস হল মান৷

Redis-এর সাথে একটি খুব গুরুত্বপূর্ণ বিষয় খেয়াল রাখতে হবে, সর্বদা আপনার ডেটা এমনভাবে সংরক্ষণ করুন যাতে আপনি সহজেই এটি পুনরুদ্ধার করতে পারেন।

Redis-এ মান দ্বারা একটি কী অনুসন্ধান করার কোনো সরাসরি উপায় নেই৷

রেডিসে ডেটা স্থায়ীভাবে সংরক্ষণ করা হয়। তাই আমি কী সারনেম এ সংরক্ষিত ডেটা পুনরুদ্ধার করতে পারি তাই

GET surname

'রোসিয়াস'

এর ফলাফল

আমরা কী সারনেম এ সংরক্ষিত মানটিও মুছে ফেলতে পারি তাই

DEL surname

বলুন আমরা একটি পোস্টের লাইক বাড়াতে চাই। INCR ব্যবহার করে আমরা কীভাবে এটি সহজে করতে পারি তা এখানে কমান্ড, যা পারমাণবিক।

SET likes 10
INCR likes => 11
INCR likes => 12
INCR likes => 13

প্রথমত, আমরা লাইকের প্রারম্ভিক মান 10 এ সেট করি এবং তারপরে আমরা পারমাণবিকভাবে লাইকের মান বৃদ্ধি করি। এখন, আপনি সম্ভবত মনে করবেন যে লাইক বৃদ্ধি করাও সম্ভব। এই ভাবে।

x = GET likes
x = x + 1
SET likes x

এটি সম্পূর্ণভাবে ঠিক আছে, যতক্ষণ না আপনি আপনার অ্যাপ্লিকেশনটি ব্যবহার করছেন।

একবার সেখানে 2 জন লোক একইভাবে বৃদ্ধি পেলে, উপরের প্রক্রিয়াটি (GET,Increment,SET) আর পারমাণবিক থাকে না। তাই,

x = GET likes (yields 10)
y = GET likes (yields 10)
x = x + 1 (x is now 11)
y = y + 1 (y is now 11)
SET likes x (likes is now 11)
SET likes y (likes is now 11

উপরের কোড থেকে, ব্যবহারকারী 1 লাইকের মান পায় যা 10, এবং এটি একটি ভেরিয়েবল x এ সঞ্চয় করে এবং একই সময়ে, ব্যবহারকারী 2 লাইকের একই মান পায়, যা 10, এবং এটি একটি ভেরিয়েবলে সংরক্ষণ করে y।

ব্যবহারকারী 1 পছন্দ(x) এর মানতে 1 যোগ করে এবং নতুন মান সেট করে, যা এখন 11।

ব্যবহারকারী 2 একই কাজ করে৷

তাই লাইকের মান হল 11।

কিন্তু এটা কি সত্যিই সঠিক? মনে রাখবেন যে লাইকগুলি 2টি ভিন্ন ব্যবহারকারী দ্বারা দ্বিগুণ বৃদ্ধি পেয়েছে৷

লাইকের মান 12টি হতে হবে, 11টি নয়৷ তাই Redis INCR প্রদান করে কমান্ড, যা পারমাণবিক এবং এই ধরনের সমস্যার সমাধান করে।

হ্যাশ ডেটা টাইপ

রেডিস হ্যাশগুলি অন্যান্য প্রোগ্রামিং ভাষার হ্যাশগুলির সমতুল্য৷ মূলত, এগুলি মানগুলির সাথে যুক্ত ক্ষেত্রগুলির একটি সংগ্রহ দ্বারা গঠিত:

উদাহরণের জন্য, এখানে আমি কীভাবে ব্যবহারকারীর প্রোফাইল তথ্য হ্যাশে সংরক্ষণ করব।

HMSET userProfile:100034  "userId" 100034 "username" "Rosius Ndimofor"
            "firstName" "Rosius" "lastName" "Ndimofor" "profilePic" "rosius.jpeg"

প্রথমত, আমাদের হ্যাশের কী হল userProfile:100034 , তারপর আমাদের কী মান আছে সব মাধ্যমে জোড়া. যেমন "userId" হল কী এবং 100034' হল মান। আমরা ব্যবহার করে নির্দিষ্ট ব্যবহারকারীর প্রোফাইল তথ্য যেমন প্রথম নাম পুনরুদ্ধার করতে পারি HGETকমান্ড এবং userId` ভালো লাগে।

userId = 100034
HGET userProfile:{userId} firstName

অথবা আমরা GETALL ব্যবহার করে একটি নির্দিষ্ট ব্যবহারকারীর জন্য সমস্ত ব্যবহারকারীর প্রোফাইল তথ্য পুনরুদ্ধার করতে পারি এইরকম আদেশ

userId = 100034
HGETALL userProfile:{userId}

লিস্ট ডেটা টাইপ

এর আগে, আমি বলেছিলাম যে, রেডিসে, আপনি যেভাবে ডেটা পুনরুদ্ধার করার পরিকল্পনা করছেন সেভাবে ডেটা সংরক্ষণ করা খুবই গুরুত্বপূর্ণ৷

আমরা যদি আমাদের প্ল্যাটফর্মে সমস্ত ব্যবহারকারী পেতে চাই?

আমরা ব্যবহারকারীর প্রোফাইল তথ্য সংরক্ষণ করার জন্য একটি হ্যাশ ডেটা কাঠামো ব্যবহার করেছি। এখন আমাদের সিস্টেমে সমস্ত ব্যবহারকারীদের পেতে হবে৷

এটি সম্পন্ন করার সবচেয়ে সহজ উপায় হল LPUSH (বাম ধাক্কার অর্থ) কমান্ডটি ব্যবহার করে একটি তালিকার প্রতিটি ব্যবহারকারীর userId সংরক্ষণ করা

LPUSH "users" userId

আমাদের তালিকা থেকে সমস্ত ব্যবহারকারীকে আনার জন্য, আমরা LRANGE কমান্ডটি ব্যবহার করি তাই

LRANGE  "users" 0  -1

আমরা আমাদের অ্যাপ্লিকেশনে ব্যবহার করব এমন কয়েকটি কমান্ড। তবে বাকি কমান্ডগুলি দেখতে এবং কীভাবে সেগুলি ব্যবহার করতে হয় তা শিখতে আমি আপনাকে Redis অফিসিয়াল সাইটে যাওয়ার জন্য অনুরোধ করছি৷

তাহলে আমাদের ফুল-স্ট্যাক অ্যাপ্লিকেশনটি কীভাবে কাজ করবে?

আমি খুশি আপনি জিজ্ঞাসা. তাই আজ, আমরা একটি CRUD API তৈরি করে শুরু করব। এখানে ইউজ কেস।

আমাদের 2টি সত্তা আছে। ব্যবহারকারীরা এবং পোস্ট .

তারা এক থেকে বহু সম্পর্ক ভাগ করে নেয়। তাই একজন ব্যবহারকারীর একাধিক পোস্ট থাকতে পারে, এবং একটি পোস্ট শুধুমাত্র একজন ব্যবহারকারীর হতে পারে।

ফ্লটার, সার্ভারলেস ফ্রেমওয়ার্ক এবং আপস্ট্যাশ (REDIS) সহ ফুলস্ট্যাক সার্ভারলেস অ্যাপ - পার্ট 1

একজন ব্যবহারকারীকে অনুমতি দেওয়া হয়

  • একটি অ্যাকাউন্ট তৈরি করুন। কোন প্রমাণীকরণ. আপনি AWS Cognito বা Auth0 দিয়ে প্রমাণীকরণ যোগ করতে পারেন।
  • তাদের অ্যাকাউন্ট আপডেট করুন
  • তাদের অ্যাকাউন্ট পান
  • একটি পোস্ট তৈরি করুন
  • একটি পোস্ট আপডেট করুন
  • একটি পোস্টের মত
  • সমস্ত পোস্টের একটি তালিকা পান

এখানে সমাধান স্থাপত্য ভিউ

ফ্লটার, সার্ভারলেস ফ্রেমওয়ার্ক এবং আপস্ট্যাশ (REDIS) সহ ফুলস্ট্যাক সার্ভারলেস অ্যাপ - পার্ট 1 তাহলে চলুন শুরু করা যাক।

একটি Upstash অ্যাকাউন্ট তৈরি করুন

অনুগ্রহ করে এখানে একটি বিনামূল্যের Upstash অ্যাকাউন্ট তৈরি করুন Upstash লগইন করুন৷

আপনার অ্যাকাউন্ট তৈরি করার পরে, একটি Upstash ডাটাবেস তৈরি করুন৷

আপনি বিনামূল্যে স্তরে শুধুমাত্র একটি ডাটাবেস তৈরি করতে পারবেন৷

ফ্লটার, সার্ভারলেস ফ্রেমওয়ার্ক এবং আপস্ট্যাশ (REDIS) সহ ফুলস্ট্যাক সার্ভারলেস অ্যাপ - পার্ট 1 আপনার Redis ডাটাবেস এন্ডপয়েন্ট নোট করুন। এটি একরকম দেখতে হবে৷rediss://:2c9bb162c2444bf7ab689640bb2ead23@gusc1-smashing-bee-30249.upstash.io:00049

একটি সার্ভারহীন প্রকল্প তৈরি করা

পূর্বশর্ত

এগিয়ে যাওয়ার আগে দয়া করে এই নির্ভরতাগুলি ইনস্টল করুন

  • AWS CLI

  • নোডজেএস

  • সার্ভারহীন CLI

    নিচের কমান্ডটি ব্যবহার করে এবং প্রম্পট অনুসরণ করে একটি নতুন সার্ভারবিহীন প্রকল্প তৈরি করুন।

serverless

ফ্লটার, সার্ভারলেস ফ্রেমওয়ার্ক এবং আপস্ট্যাশ (REDIS) সহ ফুলস্ট্যাক সার্ভারলেস অ্যাপ - পার্ট 1

nodejs HTTP API নির্বাচন করুন, আপনার প্রকল্পের একটি নাম দিন এবং enter চাপুন .

এখানে আমার সার্ভারহীন প্রকল্পের প্রাথমিক কাঠামো।

ফ্লটার, সার্ভারলেস ফ্রেমওয়ার্ক এবং আপস্ট্যাশ (REDIS) সহ ফুলস্ট্যাক সার্ভারলেস অ্যাপ - পার্ট 1

সেই ফোল্ডারের ভিতরে, কমান্ড দিয়ে একটি নতুন নোড প্রকল্প শুরু করুন

npm init

এরপরে,

দিয়ে redis ক্লায়েন্ট ইনস্টল করুন
npm install ioredis

এছাড়াও, একটি সর্বজনীন অনন্য সনাক্তকারী (uuid) নির্ভরতা ইনস্টল করুন। আমরা এই প্রকল্পে এটি ব্যাপকভাবে ব্যবহার করব।

npm install uuid

এখন, serverless.yml-এ পরিবেশ পরিবর্তনশীল হিসাবে আপনার Redis ডেটাবেস এন্ডপয়েন্ট যোগ করুন এরকম ফাইল।

provider:
  name: aws
  region: us-east-1
  stage: dev
  runtime: nodejs12.x
  lambdaHashingVersion: "20201221"
  environment:
    REDIS_CLIENT: "rediss://:2c9bb162c2444bf7ab689640bb2ead23@gusc1-smashing-wasp-30249.upstash.io:30249"

এরপর, আপনার প্রোজেক্টের ভিতরে 2টি ফোল্ডার তৈরি করুন যার নাম users এবং পোস্ট . এই দুটি ফোল্ডারই তাদের নিজ নিজ ব্যবহারের ক্ষেত্রে ল্যাম্বডা ফাংশন ধারণ করবে।

ফ্লটার, সার্ভারলেস ফ্রেমওয়ার্ক এবং আপস্ট্যাশ (REDIS) সহ ফুলস্ট্যাক সার্ভারলেস অ্যাপ - পার্ট 1

আসুন আমাদের API এনপয়েন্ট তৈরি করা শুরু করি

ব্যবহারকারী তৈরি করুন

আমরা চাই ব্যবহারকারীরা নিজেদের জন্য একটি অ্যাকাউন্ট তৈরি করতে সক্ষম হোক৷

কোন প্রমাণীকরণ. তাদের যা করতে হবে তা হল তাদের জমা দেওয়া

  • ব্যবহারকারীর নাম
  • প্রথম নাম
  • শেষ নাম
  • প্রোফাইল ছবি

ব্যবহারকারী-এ একটি ফাইল তৈরি করুন create.js নামক ফোল্ডার .

ফাইলের শীর্ষে, আমরা serverless.yml-এ পরিবেশ পরিবর্তনশীল হিসাবে সংরক্ষিত redis ডাটাবেস URL ব্যবহার করে redis ক্লায়েন্টকে ইম্পোর্ট এবং ইনস্ট্যান্টিয়েট করুন। ফাইল।

"use strict";
const uuid = require("uuid");
var Redis = require("ioredis");
if (typeof client === "undefined") {
  var client = new Redis(process.env.REDIS_CLIENT);
}

আমরা uuid নির্ভরতাও আমদানি করি, কারণ আমরা ব্যবহারকারীদের জন্য অনন্য আইডি তৈরি করতে এটি ব্যবহার করব।

প্রথমত, ব্যবহারকারীর প্রোফাইল সংরক্ষণ করার জন্য আমাদের একটি ডেটা কাঠামো প্রয়োজন তথ্য, এবং userId's সংরক্ষণ করার জন্য অন্য ডেটা কাঠামো অ্যাপ্লিকেশানের সমস্ত ব্যবহারকারীদের মধ্যে৷

হ্যাশ এবং তালিকা ডেটাটাইপ মনে রাখবেন?

ব্যবহারকারীর প্রোফাইল তথ্য সংরক্ষণ করতে হ্যাশ ডেটাটাইপ। ডেটাটাইপ কী userItem:${userId} নোট করুন

await client.hmset(
  `userItem:${userId}`,
  "userId",
  userId,
  username,
  data.username,
  firstName,
  data.firstName,
  lastName,
  data.lastName,
  profilePic,
  data.profilePic,
  "timestamp",
  timestamp
);

তারপর আমরা তৈরি করা userId সংরক্ষণ করি ব্যবহারকারী নামের একটি তালিকায়

await client.lpush("users", userId);

আপনি যদি লক্ষ্য করেন, আমাদের 2টি অপারেশন পাঠাতে হবে। একের পর এক তাদের পাঠানো সম্ভব, কিন্তু এটি সর্বোত্তম নয়৷

Upstash ব্যাচ অপারেশন সমর্থন করে, পাইপলাইনিং নামে একটি বৈশিষ্ট্যের মাধ্যমে .

তাই একক কমান্ড পাঠানোর পরিবর্তে এবং একটি প্রতিক্রিয়ার জন্য অপেক্ষা করার পরিবর্তে, আমরা একাধিক কমান্ড পাঠাতে পারি এবং আমরা যেভাবে কমান্ড পাঠিয়েছিলাম সেভাবে প্রতিক্রিয়া ফিরে আসবে৷

তাই পাইপলাইন ব্যবহার করার পরে আমাদের অপারেশন কেমন হবে তা এখানে দেখুন

client.pipeline(
  await client.hmset(
    `userItem:${userId}`,
    "userId",
    userId,
    username,
    data.username,
    firstName,
    data.firstName,
    lastName,
    data.lastName,
    profilePic,
    data.profilePic,
    "timestamp",
    timestamp
  ),
  await client.lpush("users", userId)
);

তারপর আমরা সমস্ত ব্যবহারকারীর সংরক্ষণ প্রোফাইল তথ্য পেতে পারি এবং api-gateway এর মাধ্যমে প্রতিক্রিয়া হিসাবে এটি ফেরত দিতে পারি .

//get and display saved user item
const userItem = await client.hgetall(`userItem:${userId}`);

ফ্লটার, সার্ভারলেস ফ্রেমওয়ার্ক এবং আপস্ট্যাশ (REDIS) সহ ফুলস্ট্যাক সার্ভারলেস অ্যাপ - পার্ট 1

serverless.yml আপডেট করতে ভুলবেন না এই শেষ বিন্দু প্রতিফলিত করতে.

functions:
  createUser:
    handler: user/create.createUser
    events:
      - http:
          path: /user
          method: post

আমাদের ফাংশনের নাম হল createUser , এবং এটি create.js নামে একটি ফাইলে অবস্থিত যা user নামে একটি ফোল্ডারের ভিতরে থাকে তাই হ্যান্ডলার user/create.createUser .

পথটি নোট করুন /user

createUser ফাংশন পোস্ট ব্যবহার করে http পদ্ধতি।

এখানে users/create.js-এর সম্পূর্ণ কোড ফাইল

"use strict";
const uuid = require("uuid");
var Redis = require("ioredis");
const username = "username";
const firstName = "firstName";
const lastName = "lastName";
const profilePic = "profilePic";

if (typeof client === "undefined") {
  var client = new Redis(process.env.REDIS_CLIENT);
}

/**
 *
 * @param {username,firstName,lastName,profilePic} event
 * @returns
 */
module.exports.createUser = async (event) => {
  const timestamp = new Date().getTime();

  const data = JSON.parse(event.body);
  if (data == null) {
    return {
      statusCode: 400,
      body: JSON.stringify(
        {
          message: "Couldn't create the user item",
        },
        null,
        2
      ),
    };
  }

  const userId = uuid.v1();
  console.log(`userId is ${userId}`);
  // here, we use a pipeline to perform multiple requests
  // Firstly, we save the user details to a hash dataset with key (`userItem:${userId}`)
  //
  client.pipeline(
    await client.hmset(
      `userItem:${userId}`,
      "userId",
      userId,
      username,
      data.username,
      firstName,
      data.firstName,
      lastName,
      data.lastName,
      profilePic,
      data.profilePic,
      "timestamp",
      timestamp
    ),
    await client.lpush("users", userId)
  );

  //get and display saved user item
  const userItem = await client.hgetall(`userItem:${userId}`);

  console.log(userItem);

  return {
    statusCode: 200,
    body: JSON.stringify(userItem),
  };
};

ব্যবহারকারী আপডেট করুন

ব্যবহারকারীরা সময়ে সময়ে তাদের প্রোফাইল আপডেট করতে পছন্দ করবে। তাই এটা ঠিক যে আমরা একটি ব্যবহারকারী আপডেট এন্ডপয়েন্ট প্রদান করি।

এই ক্রিয়াকলাপের জন্য আমাদের একমাত্র কমান্ডটি হ'ল HMSET কমান্ড এবং userId .

Redis ডকুমেন্টেশন থেকে, এখানে ঠিক কিভাবে HMSET কমান্ড কাজ করে।

কী এ সংরক্ষিত হ্যাশে নির্দিষ্ট ক্ষেত্রগুলিকে তাদের নিজ নিজ মানগুলিতে সেট করে। এই কমান্ডটি আগে থেকেই হ্যাশে বিদ্যমান যে কোনো নির্দিষ্ট ক্ষেত্র ওভাররাইট করে।

কোডটি দেখতে কেমন তা এখানে।

"use strict";
const uuid = require("uuid");
var Redis = require("ioredis");
const username = "username";
const firstName = "firstName";
const lastName = "lastName";

if (typeof client === "undefined") {
  var client = new Redis(process.env.REDIS_CLIENT);
}

/**
 *
 * @param {username,firstName,lastName,age,profilePic} event
 * @returns
 */
module.exports.updateUser = async (event) => {
  const timestamp = new Date().getTime();
  const userId = event.pathParameters.id;
  const data = JSON.parse(event.body);
  if (userId == null) {
    return {
      statusCode: 400,
      body: JSON.stringify(
        {
          message: "Couldn't update the user item",
        },
        null,
        2
      ),
    };
  }

  //get

  await client.hmset(
    `userItem:${userId}`,
    username,
    data.username,
    firstName,
    data.firstName,
    lastName,
    data.lastName
  );

  //get and display saved user item
  const userItem = await client.hgetall(`userItem:${userId}`);

  console.log(userItem);

  return {
    statusCode: 200,
    body: JSON.stringify(userItem),
  };
};

তারপর, serverless.yml-এ ফাইল, ফাংশনের অধীনে, যোগ করুন...

updateUser:
  handler: user/update.updateUser
  events:
    - http:
        path: /user/{id}
        method: put

আমরা userId পাস করি একটি পাথ প্যারামিটার হিসাবে /user/{id}

ফ্লটার, সার্ভারলেস ফ্রেমওয়ার্ক এবং আপস্ট্যাশ (REDIS) সহ ফুলস্ট্যাক সার্ভারলেস অ্যাপ - পার্ট 1

ব্যবহারকারী পান

HGETALL ব্যবহার করে কমান্ড এবং হ্যাশ কী, আমরা একটি নির্দিষ্ট ব্যবহারকারীর জন্য ব্যবহারকারীর প্রোফাইল তথ্য পেতে পারি।

মনে রাখবেন যে আমরা HGETও ব্যবহার করতে পারি ব্যবহারকারীর নির্দিষ্ট তথ্য যেমন firstName বা lastName ইত্যাদি পেতে কমান্ড।

আসুন কোডটি দেখি

ব্যবহারকারী-এ একটি ফাইল তৈরি করুন get.js নামক ফোল্ডার

"use strict";
var Redis = require("ioredis");

if (typeof client === "undefined") {
  var client = new Redis(process.env.REDIS_CLIENT);
}

module.exports.getUserById = async (event) => {
  const userId = event.pathParameters.id;

  if (userId == null) {
    return {
      statusCode: 400,
      body: JSON.stringify(
        {
          message: "Couldn't get the user item",
        },
        null,
        2
      ),
    };
  }

  console.log(`userId is ${userId}`);

  //get and display saved user item
  const userItem = await client.hgetall(`userItem:${userId}`);

  console.log(userItem);

  return {
    statusCode: 200,
    body: JSON.stringify(userItem),
  };
};

তারপর serverless.yml-এ ফাইল,

getUser:
  handler: user/get.getUserById
  events:
    - http:
        path: /user/{id}
        method: get

ফ্লটার, সার্ভারলেস ফ্রেমওয়ার্ক এবং আপস্ট্যাশ (REDIS) সহ ফুলস্ট্যাক সার্ভারলেস অ্যাপ - পার্ট 1

তালিকা ব্যবহারকারী

যখন আমরা ব্যবহারকারী তৈরি করার জন্য হ্যান্ডলার লিখেছিলাম, তখন মনে রাখবেন আমরা পুশ করে রেখেছিলাম (LPUSH ) userId একটি users এর মধ্যে রয়েছে তালিকা।

এখন, আমাদের LRANGE কমান্ডটি ব্যবহার করে সেই সমস্ত আইডি ধরতে হবে .

দ্রষ্টব্য:যদি পোস্টের তালিকা খুব বড় হতে শুরু করে তাহলে LRANGE খুব কার্যকর নয়, এবং আমরা তালিকার মাঝখানে থাকা উপাদানগুলি অ্যাক্সেস করতে চাই, যেহেতু Redis তালিকাগুলি লিঙ্ক করা তালিকা দ্বারা সমর্থিত। যদি একটি সিস্টেম লক্ষ লক্ষ আইটেমের গভীর পৃষ্ঠায় স্থান নির্ধারণের জন্য ডিজাইন করা হয়, তবে এর পরিবর্তে সাজানো সেটগুলি অবলম্বন করা ভাল৷

সমস্ত userId পাওয়ার পর, আমরা প্রতিটি id লুপ করতে পারি এবং HGETALL ব্যবহার করে ব্যবহারকারীর প্রোফাইল তথ্য পান .

আসুন দেখে নেওয়া যাক এটি কোডে কেমন দেখাচ্ছে৷

"use strict";
var Redis = require("ioredis");

if (typeof client === "undefined") {
  var client = new Redis(process.env.REDIS_CLIENT);
}

module.exports.getAllUsers = async (event) => {
  let users = [];
  let response = await client.lrange("users", 0, -1);

  async function getAllUsers() {
    let users = [];

    await Promise.all(
      response.map(async (userId) => {
        const item = await client.hgetall(`userItem:${userId}`);
        users.push(item);
        console.log(users);
      })
    );

    return users;
  }
  users = await getAllUsers();

  return {
    statusCode: 200,
    body: JSON.stringify(users),
  };
};

তারপর serverless.yml এর জন্য

listUsers:
  handler: user/list.getAllUsers
  events:
    - http:
        path: /users
        method: get

ফ্লটার, সার্ভারলেস ফ্রেমওয়ার্ক এবং আপস্ট্যাশ (REDIS) সহ ফুলস্ট্যাক সার্ভারলেস অ্যাপ - পার্ট 1

এবং এটাই ব্যবহারকারীদের জন্য শেষ পয়েন্ট আপনি এগিয়ে যান এবং আপনার অ্যাপ স্থাপন করতে পারেন, যদি আপনি এটি ইতিমধ্যেই না করে থাকেন।

sls deploy

পোস্ট

একজন ব্যবহারকারী একটি অ্যাকাউন্ট তৈরি করার পরে, তাদের অনুমতি দেওয়া উচিত

  • একটি পোস্ট তৈরি করুন
  • আইডি অনুসারে একটি পোস্ট পান
  • তাদের পোস্টের একটি তালিকা পান
  • কোনও পোস্টকে লাইক বা লাইক (পোস্টে প্রতিক্রিয়া দেখান)

চলুন শুরু করা যাক।

একটি পোস্ট তৈরি করুন

একটি পোস্ট তৈরি করার জন্য প্রয়োজনীয় প্যারামিটারগুলি হল

  • userId
  • postId(UUID দ্বারা স্বয়ংক্রিয়ভাবে তৈরি)
  • পোস্ট টেক্সট
  • পোস্ট ইমেজ
  • তৈরি করা হয়েছে

৩টি ধাপ জড়িত।

  1. একটি হ্যাশ কী postItem:${postId} পোস্টের বিবরণ সেট করতে HMSET কমান্ড ব্যবহার করুন .
  2. পোস্ট-এর তালিকায় postId যোগ করতে LPUSH কমান্ড ব্যবহার করুন .
  3. userPost:${userId}-এর তালিকায় postId যোগ করতে LPUSH কমান্ড ব্যবহার করুন .

আমরা এই কাজটি কালানুক্রমিকভাবে চালানোর জন্য একটি পাইপলাইন ব্যবহার করব।

পোস্ট-এ একটি ফাইল তৈরি করুন create.js নামক ফোল্ডার এবং এতে নিম্নলিখিত কোড যোগ করুন।

"use strict";
const uuid = require("uuid");
var Redis = require("ioredis");

if (typeof client === "undefined") {
  var client = new Redis(process.env.REDIS_CLIENT);
}

/**
 *
 * @param {userId,postId,postText,postImage,createdOn} event
 * @returns
 */
module.exports.createPost = async (event) => {
  const timestamp = new Date().getTime();
  const postId = uuid.v1();
  const data = JSON.parse(event.body);
  if (data == null) {
    return {
      statusCode: 400,
      body: JSON.stringify(
        {
          message: "Couldn't create the Post item",
        },
        null,
        2
      ),
    };
  }

  console.log(`postId is ${postId}`);

  client.pipeline(
    await client.hmset(
      `postItem:${postId}`,
      "id",
      postId,
      "userId",
      data.userId,
      "postText",
      data.postText,
      "postImage",
      data.postImage,
      "createdOn",
      timestamp
    ),
    await client.lpush("posts", postId),
    await client.lpush(`userPost:${data.userId}`, postId)
  );

  //get and display saved post item
  const postItem = await client.hgetall(`postItem:${postId}`);

  console.log(postItem);

  return {
    statusCode: 200,
    body: JSON.stringify(postItem),
  };
};

তারপর, serverless.yml-এ ফাংশনের অধীনে , যোগ করুন

createPost:
  handler: post/create.createPost
  events:
    - http:
        path: /post
        method: post

স্থাপন করুন এবং পরীক্ষা করুন।

ফ্লটার, সার্ভারলেস ফ্রেমওয়ার্ক এবং আপস্ট্যাশ (REDIS) সহ ফুলস্ট্যাক সার্ভারলেস অ্যাপ - পার্ট 1

Id দ্বারা পোস্ট পান

আইডি দ্বারা পোস্ট পাওয়ার সময়, আমরা পোস্ট অ্যাডমিনের বিশদ বিবরণ পেতে এবং সংযুক্ত করতে চাই, পোস্টটিতে এখন পর্যন্ত কত প্রতিক্রিয়া (লাইক) হয়েছে।

আমি জানি যে আমরা এখনও একটি পোস্ট পছন্দ বা অপছন্দ করার দিকে নজর দিইনি, শুধু সেখানেই থাকুন, আমরা এটিতে পৌঁছে যাচ্ছি৷ get.js নামে একটি ফাইল তৈরি করুন পোস্ট ফোল্ডারে এবং এটি সংরক্ষণ করুন

"use strict";
var Redis = require("ioredis");

if (typeof client === "undefined") {
  var client = new Redis(process.env.REDIS_CLIENT);
}

module.exports.getPostById = async (event) => {
  const postId = event.pathParameters.id;
  if (postId == null) {
    return {
      statusCode: 400,
      body: JSON.stringify(
        {
          message: "Couldn't get the post item",
        },
        null,
        2
      ),
    };
  }

  console.log(`postId is ${postId}`);

  //get and display saved post item
  const postItem = await client.hgetall(`postItem:${postId}`);
  const userItem = await client.hgetall(`userItem:${postItem.userId}`);
  const postReactionsCount = await client.get(`postReactionsCount:${postId}`);
  postItem["postAdmin"] = userItem;
  postItem["reactionCount"] =
    postReactionsCount == null ? 0 : postReactionsCount;
  console.log(postItem);
  console.log(userItem);

  return {
    statusCode: 200,
    body: JSON.stringify(postItem),
  };
};

উপরের কোড থেকে, প্রথমে, আমরা hgetall ব্যবহার করে একটি নির্দিষ্ট পোস্টের জন্য সমস্ত পোস্টের বিবরণ পাই। কমান্ড এবং কী postItem:${postId} .

তারপর, যেহেতু পোস্ট অবজেক্টে সেই ব্যবহারকারীর ব্যবহারকারীর আইডি রয়েছে যিনি পোস্ট করেছেন (পোস্ট অ্যাডমিন), আমরা userItem:${postItem.userId} ব্যবহার করি সেই ব্যবহারকারীর জন্য ব্যবহারকারীর বিবরণ পেতে।

মনে রাখবেন যে এটি ঠিক একই কী যা আমরা উপরে তৈরি ব্যবহারকারীর এন্ডপয়েন্টে ব্যবহার করেছি।

তৃতীয়ত, আমরা get ব্যবহার করে postReactionCount পাই কমান্ড এবং একটি কী postReactionsCount:${postId} যা আমরা পরে পোস্ট রিঅ্যাকশনসকাউন্ট সংরক্ষণ করতে ব্যবহার করব।

স্থাপন করুন এবং পরীক্ষা করুন

ফ্লটার, সার্ভারলেস ফ্রেমওয়ার্ক এবং আপস্ট্যাশ (REDIS) সহ ফুলস্ট্যাক সার্ভারলেস অ্যাপ - পার্ট 1

একটি পোস্টে প্রতিক্রিয়া জানান

এটি পুরো অ্যাপ্লিকেশনটির সবচেয়ে আকর্ষণীয় শেষ পয়েন্ট। এটা লিখতে মজা ছিল.

একটি ব্যবহারকারী একটি পোস্ট পছন্দ বা অপছন্দ করার অনুমতি দেওয়া হয়. এখন, যখন একজন ব্যবহারকারী লাইক বোতামে ক্লিক করেন, আমরা প্রথমে পরীক্ষা করি যে এই ব্যবহারকারী পোস্টটি আগে পছন্দ করেছেন কিনা৷

যদি হ্যাঁ, আমরা, পোস্টটি ভিন্ন. অন্যথায়, আমরা পোস্ট পছন্দ করি।

বুঝতে পারছেন?

ঠিক ইনস্টাগ্রাম বা টুইটারের মতো৷

পোস্ট ফোল্ডারে react_to_post.js নামে একটি ফাইল তৈরি করুন

এন্ডপয়েন্ট userId নেয় এবং postId পাথ প্যারামিটার হিসাবে।

এর একটি নতুন কমান্ড তাকান. সাজানো সেট। যে ব্যবহারকারী পোস্টটি পছন্দ করছেন তাদের userId যোগ করতে আমরা একটি সাজানো সেট ব্যবহার করব এবং যখন তারা পোস্টটি পছন্দ করেছে তখন টাইমস্ট্যাম্প।

zadd(`postReactions:${postId}`, timestamp, data.userId)

কী হল postReactions:${postId} .

সাজানো সেট Z দিয়ে শুরু হয়। Redis ডকুমেন্টেশন থেকে, zadd

কী এ সংরক্ষিত সাজানো সেটে নির্দিষ্ট স্কোর সহ সমস্ত নির্দিষ্ট সদস্যকে যোগ করে। একাধিক স্কোর/সদস্য জোড়া নির্দিষ্ট করা সম্ভব। যদি একটি নির্দিষ্ট সদস্য ইতিমধ্যেই সাজানো সেটের সদস্য হয়, তাহলে স্কোর আপডেট করা হয় এবং সঠিক ক্রম নিশ্চিত করার জন্য উপাদানটি সঠিক অবস্থানে পুনরায় সন্নিবেশ করা হয়।

পরবর্তী ধাপ হল ব্যবহার করে postReactionsCount:${postId} বৃদ্ধি করা incr` কমান্ড।

মনে রাখবেন যে আমরা পোস্ট-রিঅ্যাকশন গণনা পেতে গেট পোস্ট বাই আইডি এন্ডপয়েন্টে উপরের কীটি ব্যবহার করেছি।

incr(`postReactionsCount:${postId}`),

অবশেষে, আমরা একটি হ্যাশ

-এ ব্যবহারকারীর পোস্ট প্রতিক্রিয়া বিবরণ সংরক্ষণ করি
hmset(`userPostReactions:${data.userId}`,
                "postId", postId,
                "userId", data.userId,
                "timestamp", timestamp
            ),

এই সবের উপর ভিত্তি করে, এখানে অ্যাক্সেস প্যাটার্নগুলি উপলব্ধ রয়েছে৷

  • আমরা পোস্টের প্রতিক্রিয়ার সংখ্যা পেতে পারি।
  • আমরা সমস্ত ব্যবহারকারী পেতে পারি যারা একটি পোস্টে প্রতিক্রিয়া জানিয়েছেন, ঊর্ধ্বমুখী বা অবরোহ ক্রমে
  • ব্যবহারকারীর প্রতিক্রিয়া করা সমস্ত পোস্ট আমরা পেতে পারি।

আমরা আগে উল্লেখ করেছি যে, কোনো ব্যবহারকারী আগে কোনো পোস্ট পছন্দ করেছে কিনা তা দেখতে আমাদের একটি চেক করতে হবে। যদি হ্যাঁ, আমরা সেই পোস্টটি অপছন্দ করি। অন্যথায় আমরা পোস্টটি পছন্দ করি

আমরা zscore ব্যবহার করব এর জন্য কমান্ড।

কী-এ সাজানো সেটে সদস্যের স্কোর ফেরত দেয়। যদি সাজানো সেটে সদস্যের অস্তিত্ব না থাকে, বা কী বিদ্যমান না থাকে, তাহলে শূন্য ফেরত দেওয়া হয়।

zscore(`postReactions:${postId}`, data.userId);

যদি zscore শূন্য, তাহলে ব্যবহারকারী এটি পছন্দ করেননি। অন্যথায়, ব্যবহারকারী এটি পছন্দ করেছেন৷

সম্পূর্ণ কোডটি কেমন দেখায় তা এখানে

"use strict";
const uuid = require("uuid");
var Redis = require("ioredis");

if (typeof client === "undefined") {
  var client = new Redis(process.env.REDIS_CLIENT);
}

/**
 *
 * @param {userId,postId,postText,postImage,createdOn} event
 * @returns
 */
module.exports.reactToPost = async (event) => {
  const timestamp = new Date().getTime();

  const data = JSON.parse(event.body);
  const postId = event.pathParameters.id;

  if (data == null || postId == null) {
    return {
      statusCode: 400,
      body: JSON.stringify(
        {
          message: "Couldn't react to the Post",
        },
        null,
        2
      ),
    };
  }

  console.log(`postId is ${postId}`);
  console.log(`userId is ${data.userId}`);
  // first check if user has already liked the post
  const hasUserReacted = await client.zscore(
    `postReactions:${postId}`,
    data.userId
  );
  if (hasUserReacted == null) {
    //user hasn't reacted.
    client.pipeline(
      await client.incr(`postReactionsCount:${postId}`),
      await client.zadd(`postReactions:${postId}`, timestamp, data.userId),
      await client.hmset(
        `userPostReactions:${data.userId}`,
        "postId",
        postId,
        "userId",
        data.userId,
        "timestamp",
        timestamp
      )
    );
  } else {
    //user already reacted, so unreact
    client.pipeline(
      await client.decr(`postReactionsCount:${postId}`),
      await client.zrem(`postReactions:${postId}`, data.userId),
      await client.hdel(
        `userPostReactions:${data.userId}`,
        "postId",
        postId,
        "userId",
        data.userId,
        "timestamp",
        timestamp
      )
    );
  }

  //return the post reaction count
  const postReactionsCount = await client.get(`postReactionsCount:${postId}`);

  console.log(postReactionsCount);

  return {
    statusCode: 200,
    body: JSON.stringify({
      postReactionCount: parseInt(postReactionsCount),
    }),
  };
};

তারপর serverless.yml-এ

reactToPosts:
  handler: post/react_to_post.reactToPost
  events:
    - http:
        path: /post/{id}/react
        method: post

স্থাপন করুন এবং পরীক্ষা করুন।

ফ্লটার, সার্ভারলেস ফ্রেমওয়ার্ক এবং আপস্ট্যাশ (REDIS) সহ ফুলস্ট্যাক সার্ভারলেস অ্যাপ - পার্ট 1

আপনার API পরীক্ষকের (আমি পোস্টম্যান ব্যবহার করি) পাঠান বোতামটি একাধিকবার টিপুন এবং দেখুন কিভাবে "postReactionCount" 0 এবং 1 এর মধ্যে টগল হয়৷

UserId পরিবর্তন করুন এবং আবার চেক করুন।

আপনি এই API এ যোগ করতে পারেন এমন অনেক অন্যান্য অ্যাক্সেস প্যাটার্ন এবং ফিক্স রয়েছে।

এটা সম্প্রসারিত করার জন্য এবং আরও শিখতে আপনি চ্যালেঞ্জ গ্রহণ করবেন কি না।

এখানে সম্পূর্ণ সোর্স কোডের লিঙ্ক আছে

আমি একেবারে Redis-এর শেখার বক্ররেখা খুব পছন্দ করি, এবং এটি আমাকে ডেটা সংরক্ষণ করতে দেয় যেভাবে আমি এটি পুনরুদ্ধার করব।

অ্যাপ ডেভেলপ করা শুরু করার আগে সর্বদা আপনার অ্যাক্সেস প্যাটার্ন জেনে নিন।

আমি এই লেখাটি লিখতে অনেক মজা পেয়েছি, আশা করি আপনি একটি বা দুটি জিনিস শিখেছেন।

আমি কি কোথাও ভুল করেছি? আপনার মত একজন সুপার সায়ান আমাকে জানাতে দ্বিধা করবে না।

পরবর্তী নিবন্ধে, আমরা এই API ব্যবহার করার জন্য একটি ফ্লাটার অ্যাপ তৈরি করব। সাথে থাকুন।

শুভ কোডিং কমরেড✌🏿

রেফারেন্স

  • Upstash ডক্স
  • রেডিস
  • ফ্লাটার
  • ইন্টারনেট থেকে ডেটা আনা হচ্ছে

  1. রেডিসের সাথে TODO অ্যাপ রিমিক্স করুন

  2. সার্ভারলেস রেডিস এবং প্রতিক্রিয়া নেটিভ সহ অ্যাপ-মধ্যস্থ ঘোষণা

  3. Nuxt 3 এবং সার্ভারলেস রেডিস দিয়ে শুরু করা

  4. ফ্লটার, সার্ভারলেস ফ্রেমওয়ার্ক এবং আপস্ট্যাশ (REDIS) সহ ফুলস্ট্যাক সার্ভারলেস অ্যাপ - পার্ট 2