কম্পিউটার

স্ট্রিম সহ Redis-এ টাইমসিরিজ

রেডিসকে প্রায়শই একটি "ডেটা স্ট্রাকচার সার্ভার" হিসাবে ভাবা হয়, যা কিছু সাধারণ ডেটা স্ট্রাকচার আদিমকে একটি নেটওয়ার্ক ইন্টারফেস প্রদান করে। রেডিস বহু বছর আগে সাজানো সেট চালু করার পর থেকে স্ট্রিমগুলি হল প্রথম প্রধান নতুন সাধারণ-উদ্দেশ্য ডেটা কাঠামো। আসুন এই নতুন কাঠামোর প্রধান ব্যবহারগুলির মধ্যে একটির দিকে নজর দেওয়া যাক:মডেলিং টাইম সিরিজ ডেটা৷

স্ট্রিম:নতুন রেডিস ডেটা স্ট্রাকচার

রেডিস স্ট্রীমগুলি কী-মান জোড়াগুলির একটি শুধুমাত্র-সংযোজিত টাইমসিরিজ উপস্থাপন করে৷

যেকোন সংখ্যক ক্লায়েন্ট একটি স্ট্রীমে লিখতে পারে এবং প্রতিবার তারা টাইমসিরিজে ঢোকানো আইটেমের একটি অনন্য আরোহী আইডি পায়।

নতুন ডেটা আসার সময় ক্লায়েন্টরা ডেটা পড়ার সময় ব্লক করতে পারে, ব্যাচ প্রসেসিংয়ের জন্য পড়া শেষ বার্তাটির একটি "বুকমার্ক" রাখতে পারে, বা কাজের চাপ শেয়ার করার জন্য এবং বার্তাগুলি স্বীকার করার জন্য আরও জটিল "ভোক্তা গোষ্ঠী"তে সংগঠিত হতে পারে।

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

কোড উদাহরণের জন্য এখানে আমরা node.js:

এর জন্য theioredis ক্লায়েন্ট ব্যবহার করব
var Redis = require('ioredis');
var redis = new Redis();

একটি স্ট্রীমে ডেটা পাঠানো হচ্ছে

স্ট্রীমগুলি কেবল-সংযোজন করা হয়, তাই সাধারণত আপনার শুধুমাত্র বিশদ বিবরণের প্রয়োজন হয় রেডিস কী এর নাম যা আপনি লিখতে চান এবং আপনার কী-মান জোড়ার সেট৷

আমি আমার বায়ুর গুণমান সেন্সর থেকে পরিমাপ রেকর্ড করতে যাচ্ছি, site:pdx-এ কী-মানের জোড়ার একটি স্ট্রিম পাঠাচ্ছি কী - বিশেষ করে আমি বর্তমান এয়ার কোয়ালিটি ইনডেক্স এবং সেলসিয়াসে তাপমাত্রা পাঠাচ্ছি:

redis.xadd('site:pdx', '*',
           'aqi', 37,
           'tempc', 5.1).then(function(id) {
  console.log("id:", id);
});

> 1527974818120-0

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

একটি * সরবরাহ করা হচ্ছে রাইট কমান্ডের দ্বিতীয় যুক্তি হিসাবে, উপরে দেখানো হিসাবে, রেডিসকে তার নিজস্ব টাইমস্ট্যাম্পের সাথে ডেটা সংরক্ষণ করতে জানাতে দেয়

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

সরল পড়া

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

redis.xrange('site:pdx',
             '1527974818120-0',
             '+',
             'COUNT', 5).then(function(resp) {

  // resp now holds 5 readings, pass them to the open graph:
  // console.log(resp);
});

> [ [ '1543947167906-0', [ 'aqi', '31', 'tempc', '5.1' ] ],
> [ '1543947168312-0', [ 'aqi', '31', 'tempc', '5.3' ] ],
> [ '1543947168901-0', [ 'aqi', '31', 'tempc', '5.4' ] ],
> [ '1543947170033-0', [ 'aqi', '31', 'tempc', '5.4' ] ],
> [ '1543947171460-0', [ 'aqi', '31', 'tempc', '5.6' ] ] ]

স্ট্রীমের যেকোন জায়গা থেকে সংখ্যার রেঞ্জের নমুনা নেওয়া যেতে পারে, অ্যাগ্রাফিং সিস্টেমকে পারফরম্যান্স পেনাল্টি ছাড়াই ঐতিহাসিক ডেটা জিজ্ঞাসা করার অনুমতি দেয়।

ব্লকিং এবং পোলিং

ডেটার ব্যাপ্তি অনুসন্ধান করা গ্রাফ এবং ঐতিহাসিক পর্যবেক্ষণের জন্য উপযোগী, কিন্তু কখনও কখনও আপনি এমন একটি সিস্টেম তৈরি করতে চান যা ডেটা আসাতে অবিলম্বে প্রতিক্রিয়া জানাতে পারে - রেডিস স্ট্রীমগুলি এর জন্যও উপযুক্ত, XREAD ব্যবহার করে :

redis.xread('BLOCK', 10000,
            'STREAMS', 'site:pdx', '$').then(function(resp) {

  // close the windows if aqi > 50
  console.log(resp);
});

এই ধরনের একটি ব্লকিং অপারেশন ডেটা না আসা পর্যন্ত বা টাইম আউট হওয়া পর্যন্ত অপেক্ষা করবে (এখানে 1000 মি.), তাই ডেটা উপলব্ধ না হওয়া পর্যন্ত আপনি উপরের উদাহরণের মতো একটি ক্রমাগত পোলকে অবরুদ্ধ করতে, এবং একই XREAD কল করুন। ডেটা প্রাপ্তির পরে বা কমান্ড টাইমআউটের পরে প্রতিবার আবার কমান্ড দিন।

আপনার স্ট্রীমের সংযোগগুলির মধ্যে কোনও ডেটা মিস না হয় তা নিশ্চিত করার জন্য, আপনি এটি থেকে পড়ার সময় আপনার স্ট্রীমের শেষ পড়া আইডি সরবরাহ করতে পারেন এবং এইভাবে আপনি ঠিক যেখান থেকে ছেড়েছিলেন সেখানেই শুরু করবেন৷

উপরের ক্ষেত্রে আমি শুধু চেয়েছিলাম যে স্ট্রীমে যাই হোক না কেন ডেটা আসে তাই "শুধুমাত্র নতুন ডেটা" নির্দেশ করতে বিশেষ টোকেন '$' ব্যবহার করে; একটি সরবরাহকৃত আইডির সাথে কমান্ডটি দেখতে কিছুটা আলাদা:

redis.xread('BLOCK', 10000,
            'STREAMS', 'site:pdx', '1543947171460-0');

আপনি একই সাথে অনেকগুলি বিভিন্ন স্ট্রীম জুড়ে পড়তে পারেন, প্রথম স্ট্রীম থেকে মান ফেরত যা ডেটা গ্রহণ করে:

redis.xread('BLOCK', 10000,
            'STREAMS',
              'site:pdx', 'site:global',
              '1543947171460-0', '$');

এই উদাহরণে কমান্ডটি ফিরে আসবে যখন ID1543947171460-0 এর চেয়ে সাম্প্রতিকতম ডেটা site:pdx-এ লেখা , অথবা যখন যে কোনো নতুন ডেটা site:global-এ লেখা হয় .

ভোক্তা সমন্বয়

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

স্ট্রিম কমান্ডের জন্য দ্রুত-রেফারেন্স

স্ট্রীমগুলির জন্য প্রচুর নতুন Redis কমান্ড উপলব্ধ আছে! এখানে একটি দ্রুত রেফারেন্স, আপনি অফিসিয়াল ডকুমেন্টেশনে আরো বিস্তারিত জানতে পারেন।

সহজ কমান্ড:

  • XADD:একটি স্ট্রীমে একটি আইটেম (কী-মানের জোড়ার একটি বান্ডিল) যোগ করুন
  • XRANGE এবং XREVRANGE:ব্যাপ্তি নির্বাচন করুন বা স্ট্রিম আইটেমগুলির উপর পুনরাবৃত্তি করুন
  • XREAD:কিছু আইডি (ঐচ্ছিকভাবে ব্লক করা) থেকে সাম্প্রতিক আইটেমগুলি আনুন
  • XTRIM:স্ট্রিম ট্রিম করতে পুরানো আইটেমগুলি বাতিল করুন
  • XDEL:একটি স্ট্রীম থেকে একটি নির্দিষ্ট আইটেম সরান
  • XLEN:একটি প্রবাহে আইটেমগুলি গণনা করুন
  • XINFO:স্ট্রিম মেটাডেটা পরিদর্শন করুন

ভোক্তা গ্রুপ কমান্ড:

  • XGROUP:ভোক্তা গোষ্ঠী তৈরি, মুছুন বা পুনরায় সেট করুন এবং তাদের সদস্যদের সরিয়ে দিন
  • XREADGROUP:XREAD এর মতো (উপরে), কিন্তু একটি ভোক্তা গ্রুপ ব্যবহার করে বার্তা গ্রহণ করুন
  • এক্সপেন্ডিং:একটি ভোক্তা গোষ্ঠীর কাছে বিতরণ করা হয়েছে কিন্তু স্বীকার করা হয়নি এমন বার্তাগুলি পরিদর্শন করুন৷
  • XACK:একটি ভোক্তা গোষ্ঠীর জন্য একটি বার্তা স্বীকার করুন, এটি মুলতুবি তালিকা থেকে সরিয়ে দিন
  • XCLAIM:একজন মৃত ভোক্তার কাছ থেকে একটি বার্তা গ্রহণ করুন

কেস ব্যবহার করুন

স্ট্রীমগুলির জন্য সবচেয়ে সাধারণভাবে উদ্ধৃত ব্যবহার হল IoT ওয়ার্কলোড যেখানে সেন্সরগুলি একটি স্ট্রীমে ডেটা রাখে যাতে গ্রাহকরা বিভিন্ন উপায়ে ব্যবহার করতে পারেন (বিশ্লেষণ, সংরক্ষণাগার থেকে কোল্ড স্টোরেজ, গ্রাফে প্রদর্শন)। ক্যাপড সাইজ সহ স্ট্রীমগুলি এখানে যথেষ্ট ব্যবহারযোগ্য, যা আপনাকে অনুমানযোগ্য মেমরি ফুটপ্রিন্ট সহ একটি নির্দিষ্ট আকারের স্ট্রীম বরাদ্দ করতে দেয়৷

স্ট্রীমগুলি এমন অ্যাপ্লিকেশনগুলিতে ব্যবহারের জন্যও উপযুক্ত যা পূর্বে অন্যান্য রেডিস ডেটা স্ট্রাকচার ব্যবহার করেছিল। Celery এবং Sidekiq-এর মতো অ্যাপ্লিকেশনগুলিকে সারিবদ্ধভাবে রেডিস-নেটিভ উপায়ে পঠিত রসিদ পরিদর্শন প্রদানের জন্য স্ট্রিমের ভোক্তা গোষ্ঠীর সুবিধা হতে পারে। রেডিস পাবসাব ব্যবহার করে সহজ চ্যাটপস প্রদর্শন করে এমন অনেক ব্লগ পোস্ট রয়েছে যা রেডিস স্ট্রিমগুলির সাথে আরও শক্তিশালী করা যেতে পারে, যেহেতু ক্লায়েন্টদের কাছে প্রকাশিত হওয়ার পরে পাবসাব বার্তাগুলি ধরে রাখে না৷

এটি চেষ্টা করার জন্য প্রস্তুত?

আপনি মাত্র কয়েকটি ক্লিকে একটি নতুন RedisGreen সার্ভারে Redis স্ট্রিমগুলি চেষ্টা করতে পারেন৷


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

  2. এজ ক্যাশিং সহ 5 ms গ্লোবাল রেডিস লেটেন্সি

  3. ক্লাউডফ্লেয়ার কর্মীদের সাথে রেডিস @ এজ

  4. REDIS (রিমোট ডিরেক্টরি সার্ভার) - Redis টিউটোরিয়াল