কম্পিউটার টিউটোরিয়াল

RedisGraph ২.৮ এখন উপলব্ধ: নতুন ফিচার ও উন্নতি

আজ আমরা RedisGraph ২.৮-এর জেনারেল অভেইলেবিলিটি রিলিজ ঘোষণা করতে হर्षিত। এই ব্লগ পোস্টে এখন উপলব্ধ মূল নতুন ফিচারগুলো বর্ণনা করা হলো।

RedisGraph সম্পর্কে

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

RedisGraph ২.৮-এ মূল নতুন ফিচারসমূহ

  • সমৃদ্ধ গ্রাফ মডেল
    • মাল্টি-লেবেলড নোডস
  • উন্নত কোয়েরি قابিলিয়ত
    • উন্নত ফুল-টেক্সট সার্চ
    • আরও সাইফার কনস্ট্রাক্ট, ফাংশন এবং অপারেটর সমর্থন
  • পারফরম্যান্স উন্নতি
    • রিলেশনশিপ প্রপার্টির ওপর ইন্ডেক্স
    • ডেল্টা ম্যাট্রিক্স
    • নিয়ন্ত্রণযোগ্য নোড ক্রিয়েশন বাফার
    • বেঞ্চмар্ক

https://redis.com/blog/redisgraph-2-8-is-generally-available/(নতুন ট্যাবে খুলবে)

সমৃদ্ধ গ্রাফ মডেল

মাল্টি-লেবেলড নোডস

লেবেলড প্রপার্টি গ্রাফ (LPG) ডেটা মডেলের অনেক সংজ্ঞা (যেমন The Property Graph Database Model – Angles, 2018, এবং ISO/IEC JTC 1/SC 32 – GQL ড্রাফট) নির্দেশ করে যে একটি নোডের একাধিক লেবেল থাকতে পারে। v2.8 পর্যন্ত, RedisGraph শুধু একটি লেবেল সমর্থন করত। এখন থেকে, আমরা পারফরম্যান্স ডিগ্রেডেশন বা উল্লেখযোগ্য মেমরি বৃদ্ধি ছাড়া প্রতিটি নোডে একাধিক লেবেল যোগ করতে পারি।

একাধিক লেবেল সহ নোড তৈরি করতে, আপনাকে শুধু সকল লেবেল কলন (:) দিয়ে পৃথক করে লিস্ট করতে হবে:

GRAPH.QUERY g "CREATE (e:Employee:BoardMember {Name: 'Vincent Chan', Title: 'Web marketing lead'}) return e"

একাধিক লেবেল সহ নোড ম্যাচ করতে (AND শর্ত), আপনাকে একই কলন নোটেশন ব্যবহার করতে হবে:

GRAPH.QUERY g "MATCH (e:Employee:BoardMember) return e"

উন্নত কোয়েরি ক্ষমতা

উন্নত ফুল-টেক্সট সার্চ

RedisGraph রেডিসসার্চের সাথে এম্বেডেড আসে এবং সেকেন্ডারি ইন্ডেক্সিংয়ের জন্য এটি লিভারেজ করে, তবে এটি উন্নত ইন্ডেক্সিং এবং সার্চের জন্যও ব্যবহার করা যায়। উদাহরণস্বরূপ — পৃথিবীর একটি নির্দিষ্ট পয়েন্টের ভৌগোলিক সন্নিকর্ষের উপর ভিত্তি করে নোড খুঁজে বের করা, বা সম্পর্কিত আইটেমগুলোর স্কোর বাড়ানো।

ভার্সন ২.৮-এ ভাষা এবং স্টপওয়ার্ডস কনফিগারেশন অপশন যোগ করা হয়েছে। language নির্ধারণ করে টেক্সট স্টেমিংয়ের জন্য কোন ভাষা ব্যবহার করা হবে — অর্থাৎ একটি শব্দের বেস ফর্মকে ইন্ডেক্সে যোগ করা। এর ফলে "going" কোয়েরি করলে "go" এবং "gone"-র ফলাফলও পাওয়া যাবে। stopwords হলো খুব সাধারণ শব্দসমূহ (যেমন "is, the, an, and…") যা সার্চে জ্ঞান যোগ করে না কিন্তু ইন্ডেক্সে বড় জায়গা দখল করে। এই শব্দগুলো ইন্ডেক্স হয় না এবং সার্চের সময় উপেক্ষা করা হয়। "in Paris" মতো একটি স্টপওয়ার্ডসহ কোয়েরি টার্ম কেবল "Paris" হিসেবে দেখা হবে।

Movie লেবেলযুক্ত সকল নোডের title প্রপার্টির ওপর জার্মান ভাষা এবং কাস্টম স্টপওয়ার্ডস ব্যবহার করে একটি ফুল-টেক্সট ইন্ডেক্স তৈরি করতে:

GRAPH.QUERY DEMO_GRAPH "CALL db.idx.fulltext.createNodeIndex({ label: 'Movie', language: 'German', stopwords: ['a', 'ab'] }, 'title')"

RediSearch ৩টি অতিরিক্ত ফিল্ড কনফিগারেশন অপশন প্রদান করে:

  • weight — ফিল্ডের টেক্সটের গুরুত্ব
  • nostem — টেক্সট ইন্ডেক্স করার সময় স্টেমিং বাদ দিন
  • phonetic — টেক্সটের ওপর ফোনেটিক সার্চ সক্রিয় করুন

Movie লেবেলযুক্ত সকল নোডের title প্রপার্টির ওপর ফোনেটিক সার্চসহ একটি ফুল-টেক্সট ইন্ডেক্স তৈরি করতে:

GRAPH.QUERY DEMO_GRAPH "CALL db.idx.fulltext.createNodeIndex('Movie', {field: 'title', phonetic: 'dm:en'})"

আরও সাইফার কনস্ট্রাক্ট, ফাংশন এবং অপারেটর সমর্থন

RedisGraph ২.৮ সাইফার সমর্থন কভারেজ বড়িয়েছে:

  • প্যাটার্ন কমপ্রিহেনশন
  • allShortestPaths
    ফাংশন সমর্থন
  • সাইফার ফাংশন:
    keys, reduce, replace, none,
    এবং
    single
  • SET
    ক্লজে নোড অ্যাট্রিবিউট-সেট কপি করা
  • WHERE
    ক্লজে নোড লেবেল দ্বারা ফিল্টারিং
  • সাইফার অপারেটর:
    XOR
    এবং
    ^

প্যাটার্ন কমপ্রিহেনশন

প্যাটার্ন কমপ্রিহেনশন সাইফারে উপলব্ধ একটি সিনট্যাকটিক কনস্ট্রাক্ট। যাসময় লিস্ট কমপ্রিহেনশন আমাদের বিদ্যমান লিস্টের উপর ভিত্তি করে একটি লিস্ট তৈরি করতে দেয়, তখন প্যাটার্ন কমপ্রিহেনশন একটি প্যাটার্নের ম্যাচিং ফলাফল দিয়ে একটি লিস্ট পপুলেট করার পথ। এটি একটি স্ট্যান্ডার্ড

MATCH
ক্লজের মতো নির্দিষ্ট প্যাটার্ন ম্যাচ করে, স্ট্যান্ডার্ড
WHERE
ক্লজের মতো প্রিডিকেটসহ, কিন্তু একটি নির্দিষ্ট প্রজেকশন দেয়।

উদাহরণস্বরূপ, নিচের কোয়েরিটি মেইল কর্মচারীদের প্রাপ্ত সকল গ্রান্ট টাইপের একটি লিস্ট রিটার্ন করবে যেখানে গ্রান্ট অমাউন্ট ১০০০ ডলারের বেশি।

GRAPH.QUERY g "CREATE (e:Employee {gender:'Male'})-[:granted]->(g:Grant {type: 'Research', amount: 2000})"

GRAPH.QUERY g "MATCH (e:Employee {gender:'Male'}) RETURN [(e)-[:granted]->(g:Grant) WHERE g.amount > 1000 | g.type] AS grantTypes"

allShortestPaths
ফাংশন সমর্থন

allShortestPaths
ফাংশনটি সব চেয়ে ছোট পথগুলো রিটার্ন করে যেসব এক জোড়া এন্টিটি যেকোনো কRITEERIA ম্যাচ করে। দুটি এন্টিটি অবশ্যই একটি পূর্ববর্তী
WITH
-ডিমার্কেটেড স্কোপে বাউন্ড থাকতে হবে।

GRAPH.QUERY DEMO_GRAPH "MATCH (c:Actor {name: 'Charlie Sheen'}), (k:Actor {name: 'Kevin Bacon'}) WITH c, k MATCH p = allShortestPaths((c)-[:PLAYED_WITH*]->(k)) RETURN nodes(p) as actors"

এই কোয়েরিটি চার्ली শিনকে প্রতিনিধিত্বকারী এক্টর নোড থেকে কেভিন বেকনকে প্রতিনিধিত্বকারী এক্টর নোড পর্যন্ত সংযোগকারী ন্যূনতম দৈর্ঘ্যের সকল পথ উত্পন্ন করবে। দুজন এক্টরের মাঝপথে כמה ২-হপ পথ আছে, এবং এগুলো সব রিটার্ন হবে। পথের কম্পিউটেশন এখানেই থামবে, কারণ আমরা ২-এর চেয়ে বড় দৈর্ঘ্যের পথে আগ্রহী নই।

সার্চের জন্য একটি ন্যূনতম দৈর্ঘ্য (অবশ্যই ১) এবং সর্বোচ্চ দৈর্ঘ্য (অবশ্যই কমপক্ষে ১) নির্দিষ্ট করা যায়। শূন্য বা অধিক রিলেশনশিপ টাইপ নির্দিষ্ট করা যায় (যেমন

[:R|Q*1..3]
)। প্যাটার্নে কোনো প্রপার্টি ফিল্টার যোগ করা যাবে না।

keys
সাইফার ফাংশন সমর্থন

keys
ফাংশনটি একটি নোড, রিলেশনশিপ, বা ম্যাপ ইনপুট হিসেবে গ্রহণ করে এবং ইনপুটে থাকা সকল কীয়ের একটি অ্যারে রিটার্ন করে।

MATCH (a) RETURN keys(a)
MATCH ()-[e]->() RETURN keys(e)
RETURN keys({a:1, b:2})

reduce
সাইফার ফাংশন সমর্থন

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

GRAPH.QUERY g "RETURN reduce(sum = 0, n IN range(1,10) | sum + n)"

এই ফাংশনের আউটপুট হবে ৫৫ — ১ থেকে ১০ পর্যন্ত পূর্ণসংখ্যার যোগফল।

GRAPH.QUERY g "RETURN reduce(arr = [], n IN range(1,10) | arr + [n*n])"

এই ফাংশনের আউটপুট হবে ১ থেকে ১০ পর্যন্ত পূর্ণসংখ্যাগুলোর বর্গ ধারণকারী একটি অ্যারে।

রিপ্লেস সাইফার স্ট্রিং ফাংশন সমর্থন

একটি দেওয়া সাবস্ট্রিং-এর সকল উপস্থিতিকে অন্য একটি দিয়ে রিপ্লেস করে। ফাংশনটি ৩টি প্যারামিটার গ্রহণ করে: মূল স্ট্রিং, রিপ্লেস করা উপস্থিতিসমূহ, এবং কী দিয়ে রিপ্লেস করা হবে।

GRAPH.QUERY g "RETURN replace('abc*efg', '*', 'd')"

রিটার্ন ভ্যালু হবে ‘abcdefg’।

এই ফাংশনটি সাবস্ট্রিংকে খালি স্ট্রিং ('') দিয়ে সাবস্টিটিউট করে ডিলিট ও করতে পারে।

none
এবং
single
সাইফার ফাংশন সমর্থন

একটি লিস্ট দিয়ে, none রিটার্ন করে true যদি প্রিডিকেট কোনো এলিমেন্টের জন্য সত্য না হয়, আর single রিটার্ন করে true যদি প্রিডিকেট শুধু একটি এলিমেন্টের জন্য সত্য হয়।

GRAPH.QUERY g "RETURN none(x IN range(1,10) WHERE x>10)"
GRAPH.QUERY g "RETURN single(x IN range(1,10) WHERE x>9)"

এই ফাংশনগুলো all এবং any ফাংশনগুলির মতো।

একটি সম্ভাব্য ইউজ কেস হলো পাথ ফিল্টারিং:

graph.query DEMO_GRAPH “MATCH p = (a {name:’Johnny Depp’})-[*2..5]->(b {name:’Kevin Bacon’}) WHERE none(n IN nodes(p) WHERE n.year > 1970) RETURN p”

এই কোয়েরিটি জন্নি ডেপ থেকে কেভিন বেকন পর্যন্ত দৈর্ঘ্য ২ থেকে ৫-এর সকল পথ রিটার্ন করবে, যেগুলোতে ১৯৭০-এর পর জন্মগ্রহণ করা কোনো এক্টর নেই।

SET
ক্লজে নোড অ্যাট্রিবিউট সেট কপি করার সমর্থন

SET
ক্লজটি ব্যবহার করা যায় একটি নোডের সকল প্রপার্টি ভ্যালু অন্য একটি নোডের প্রপার্টি ভ্যালু দিয়ে রিপ্লেস বা অ্যাপেন্ড করতে।

নিচের কোয়েরিটি দুটি এন্টিটি ম্যাচ করবে, এবং তারপর a-এর সকল প্রপার্টি b-এর প্রপার্টি দিয়ে রিপ্লেস করবে:

GRAPH.QUERY g "MATCH (a {v: 1}), (b {v: 2}) SET a = b"

নিচের কোয়েরিটি দুটি এন্টিটি ম্যাচ করবে, এবং তারপর a-এর প্রপার্টি গুলোর ভ্যালু b-এর প্রপার্টি দিয়ে যোগ করবে (বা রিপ্লেস করবে)।

GRAPH.QUERY g "MATCH (a {v: 1}), (b {v: 2}) SET a += b"

আমরা প্রপার্টি ছাড়া রিলেশনশিপের টাইপও পরিবর্তন করতে পারি:

GRAPH.QUERY g "MATCH (a)-[b]->(c) WHERE ID(b)=0 CREATE (a)-[d:bar]->(c) SET d=b DELETE b RETURN d"

WHERE
ক্লজে নোড লেবেল দ্বারা ফিল্টারিং সমর্থন

এখন নোড লেবেল বা রিলেশনশিপ টাইপ দ্বারা WHERE ক্লজেও ফিল্টার করা সম্ভব:

GRAPH.QUERY g "MATCH (a) WHERE a:L RETURN a"
GRAPH.QUERY g "MATCH (a)-[b]-(c) WHERE b:L RETURN b"

সাইফার অপারেটর XOR এবং ^ সমর্থন

GRAPH.QUERY g "RETURN true XOR true”
GRAPH.QUERY g "RETURN 2 ^ 3”

ফলাফল যথাক্রমে

false
এবং
8
।

পারফরম্যান্স উন্নতি

রিলেশনশিপ প্রপার্টির ওপর ইন্ডেক্স

নোডের জন্য, আমরা নিচের কমান্ড দিয়ে একটি ইন্ডেক্স তৈরি করতে পারি

GRAPH.QUERY g "CREATE INDEX FOR (n:GRANTS) ON (n.GrantedBy)"

এখন রিলেশনশিপের জন্যও ইন্ডেক্স তৈরি করা সম্ভব:

GRAPH.QUERY g "CREATE INDEX FOR ()-[r:R]-() ON (r.prop)"

নিচের কোয়েরিটির ওপর বিবেচনা করুন:

GRAPH.QUERY g "MATCH (a)-[r:R {prop:5}]-(b) return *"

ইন্ডেক্স তৈরি করার আগে এক্সিকিউশন প্ল্যান দেখা যাক:

redis:6379> GRAPH.EXPLAIN g "MATCH (a)-[r:R {prop:5}]-(b) return *"

1) "Results"
2) " Project"
3) " Filter"
4) " Conditional Traverse | (a)-[r:R]->(b)"
5) " All Node Scan | (a)"

এবং একই কোয়েরিটির জন্য ইন্ডেক্স তৈরি করার পর এক্সিকিউশন প্ল্যান:

redis:6379> GRAPH.EXPLAIN g "MATCH (a)-[r:R {prop:5}]-(b) return *"

1) "Results"
2) " Project"
3) " Edge By Index Scan | [r:R]"

ডেল্টা ম্যাট্রিক্স

ভার্সন ২.৮ থেকে, গ্রাফ নোড এবং রিলেশনশিপ যোগ ও ডিলিট করা অনেক দ্রুত, কারণ এগুলো প্রথমে ছোট ডেল্টা ম্যাট্রিক্সে আপডেট হয়। মেন ম্যাট্রিক্সগুলো পরে বাল্ক-আপডেট হয়।

RedisGraph-এ, গ্রাফগুলো অ্যাডজেসেন্সি ম্যাট্রিক্স দিয়ে রিপ্রেজেন্ট করা হয়। গ্রাফের প্রতিটি নোড লেবেল এবং রিলেশনশIP টাইপের নিজস্ব ম্যাট্রিক্স থাকে। পূর্বে, প্রতিবার একটি নতুন নোড গ্রাফে যোগ হলে, সকল ম্যাট্রিক্স রিসাইজ করতে হতো, এবং ডেটাবেজ যত বড় হতো, তত বেশি সময় লাগত।

RedisGraph ২.৮ এখন উপলব্ধ: নতুন ফিচার ও উন্নতি

v2.8 থেকে, নতুন নোড এবং রিলেশনশIP ইনসার্ট করার সময় উল্লেখযোগ্যভাবে কম এবং এখন এটা গ্রাফের আকারের ওপর নির্ভ ocupada করে না। এই অপ্টিমাইজেশনটি গ্রাফের প্রতিটি ম্যাট্রিক্সের জন্য দুটি ডেল্টা ম্যাট্রিক্স চালু করে অর্জিত হয়েছে: একটি নোড অ্যাডিশনের জন্য (D+) এবং একটি নোড ডিলিশনের জন্য (D-)। নোড অ্যাডিশন এবং ডিলিশন তাদের উপযুক্ত ডেল্টা ম্যাট্রিক্সে প্রতিফলিত হয়, এবং একবার একটি ডেল্টা ম্যাট্রিক্স ১০০০০ নোডের থ্রেশহোল্ড পৌঁছালে (যা

DELTA_MAX_PENDING_CHANGES
কনফিগারেশন প্যারামিটার দিয়ে কনফিগার করা যায়), এটি একটি সিঙ্গেল বাল্ক অপারেশনে মেন ম্যাট্রিক্সের সাথে সিঙ্ক্রোনাইজ হয়, খালি হয়, এবং একই সাইকেল আবার শুরু হয়।

নিয়ন্ত্রণযোগ্য নোড ক্রিয়েশন বাফার

একটি নতুন লোড-টাইম কনফিগারেশন প্যারামিটার, NODE_CREATION_BUFFER, ভবিষ্যতের নোড ক্রিয়েশনের জন্য ম্যাট্রিক্সে রিজার্ভড মেমরির পরিমাণ নিয়ন্ত্রণ করে। উদাহরণস্বরূপ, ১৬,৩৮৪ সেট করলে, ম্যাট্রিক্সগুলো ক্রিয়েশনের সময় ১৬৩৮৪ নোডের জন্য এক্সট্রা স্পেস রাখবে। যাপুন এক্সট্রা স্পেসটি শেষ হলে, ম্যাট্রিক্সের আকার ১৬৩৮৪ করে বাড়বে।

এই মান কমালে মেমরি খরচ কমবে, কিন্তু ম্যাট্রিক্স রি-অ্যালোকেশনের फ्रিকোয়েন্সি বড়লে পারফরম্যান্স ডিগ্রেডেশন হবে। বিপরীতে, মান বড় করলে রাইট-হেভি ওয়ার্কলোডের জন্য পারফরম্যান্স উন্নত হতে পারে কিন্তু মেমরি খরচ বড়বে।

যদি পাস করা আর্গুমেন্ট ২-এর পাওয়ার না হয়, তবে মেমরি অ্যালাইনমেন্ট উন্নত করার জন্য এটি নেক্সট-গ্রেটেস্ট পাওয়ার অফ ২-এ রাউন্ড অফ হয়ে যাবে।

বেঞ্চмар্ক

ডেল্টা ম্যাট্রিক্সের পাশাপাশি আমরা আরও অনেক পারফরম্যান্স এনহ্যান্সমেন্ট যোগ করেছি। আমরা নিচে LDBC SNB বেঞ্চмар্ক ব্যবহার করে এই উন্নতিগুলো প্রদর্শন করছি।
LDBC SNB (Linked Data Benchmark Council – Social Network Benchmarks) হলো গ্রাফ ডেটাবেজের রিয়েল-ওয়ার্ল্ড রিড এবং রাইট ওয়ার্কলোড তুলনা করার ইন্ডাস্ট্রি-স্ট্যান্ডার্ড বেঞ্চмар্ক।

মোট ডেটা লোড RedisGraph ২.৮-এ অনেক দ্রুত:

  • LDBC স্কেল ফ্যাক্টর ১:
    RedisGraph ২.৮ RedisGraph ২.৪-এর চেয়ে ১.৯২ গুণ দ্রুত
  • LDBC স্কেল ফ্যাক্টর ১০:
    RedisGraph ২.৮ RedisGraph ২.৪-এর চেয়ে ২.০০ গুণ দ্রুত
RedisGraph ২.৮ এখন উপলব্ধ: নতুন ফিচার ও উন্নতি

LDBC কোয়েরি (রিড এবং রাইট দুটোই) RedisGraph ২.৮-এ অনেক দ্রুত এক্সিকিউট হয়:

  • রিড কোয়েরি:
    RedisGraph ২.৮ RedisGraph ২.৪-এর চেয়ে ২.৩২ গুণ দ্রুত
  • রাইট কোয়েরি:
    RedisGraph ২.৮ RedisGraph ২.৪-এর চেয়ে ১.০৯ গুণ দ্রুত
RedisGraph ২.৮ এখন উপলব্ধ: নতুন ফিচার ও উন্নতি

ডেটা রিস্টোর করা এবং সিঙ্ক করা (RDB এবং AOF)ও অনেক দ্রুত (কিছু পরিস্থিতিতে অনেক গুণ দ্রুত)।

RedisGraph Redis Stack-এর অংশ

RedisGraph এখন Redis Stack-এর অংশ। আপনি macOS, Ubuntu, বা Redhat-এর জন্য লেটেস্ট Redis Stack Server বাইনারি ডাউনলোড করতে পারেন, বা Docker, Homebrew, বা Linux-এ ইনস্টল করতে পারেন।

RedisInsight ব্যবহার করে RedisGraph অভিজ্ঞতা

RedisInsight ডেভেলপারদের জন্য একটি ভিজুয়াল টুল যা Redis বা Redis Stack ব্যবহার করে ডেভেলপমেন্টের সময় RedisTimes থেকে ডেটা এক্সপ্লোর করার একটি চমৎকার উপায় প্রদান করে।

RedisGraph ২.৮ এখন উপলব্ধ: নতুন ফিচার ও উন্নতি

আপনি গ্রাফ কোয়েরি এক্সিকিউট করতে পারেন এবং গ্রাফিক্যাল ইউজার ইন্টারফেস থেকে সরাসরি ফলাফল পর্যবেক্ষণ করতে পারেন। RedisInsight এখন RedisGraph কোয়েরি ফলাফল ভিজুয়ালাইজ করতে পারে।

RedisGraph ২.৮ এখন উপলব্ধ: নতুন ফিচার ও উন্নতি

উপরন্তু, RedisInsight-এ RedisGraph ইন্টারেক্টিভভাবে শেখার জন্য কুইক গাইড এবং টিউটোরিয়াল রয়েছে।

redis.io এবং developer.redis.com-এ RedisGraph সম্পর্কে আরও জানুন।


  1. পাইথনে গ্রাফ সবাই দ্বারা ট্রাভার্সেবল কিনা চেক করার প্রোগ্রাম

  2. পাইথনে গ্রাফে ক্রিটিকাল ও সিউডো-ক্রিটিকাল এজ খুঁজে বের করার প্রোগ্রাম

  3. পাইথনে গ্রাফ প্লটিং: matplotlib লাইব্রেরির ব্যবহার

  4. RedisTimeSeries 1.6 রিলিজ: হাই-পারফরম্যান্স টাইম সিরিজের জন্য নতুন ফিচার