Redis-এর সেরা অনসাং ফিচারগুলির একটি হলো এর ওয়ায়ার প্রোটোকল। এটিই কারণ যে Redis-এ সবচেয়ে বড় ইকোসিস্টেম আছে হাই-কোয়ালিটি ক্লায়েন্ট লাইব্রেরির। Redis ওয়ায়ার প্রোটোকল রিমার্কেবলি সিম্পল, যা একটি ক্লায়েন্ট বিল্ড করা সহজ করে দেয় যেটি Redis-এর সব বড় ফিচার ইমপ্লিমেন্ট করে। এটি এমনভাবে ডিজাইন করা হয়েছে যা ফাস্ট এবং ইফিশিয়েন্ট ক্লায়েন্ট লাইব্রেরি লেখা সহজ করে দেয়।
RESP কী?
RESP (REdis Serialization Protocol) হলো টেক্সট-বейজড প্রোটোকলের নাম যা Redis ক্লায়েন্ট এবং সার্ভার TCP-ওয়ার একে অপর থেকে কমিউনিকেশন করতে ব্যবহার করে। সার্ভার এবং ক্লায়েন্টের মধ্যে সব কমিউনিকেশন পাঁচটি বেসিক টাইপ থেকে তৈরি:
- সিম্পল স্ট্রিংস সাধারণ সার্ভার রিপ্লাইর জন্য ব্যবহৃত হয় যেমন "OK" (সফল রাইট কমান্ডের পর) বা "PONG" (PING কমান্ডের সফল রেসপন্স)।
- বাল্ক স্ট্রিংস প্রায় সব সিঙ্গেল-ভ্যালু রিড কমান্ডের জন্য রিটার্ন হয় যেমন GET, LPOP, এবং HGET। বাল্ক স্ট্রিংস সিম্পল স্ট্রিংস থেকে আলাদা কারণ এগুলো যেকোনো কিছু ধারণ করতে পারে - নিউলাইন, কন্ট্রোল ক্যারেক্টার, বা এমনকি ভ্যালিড RESP, সব কিছুই এস্কেপ বা এনকোড ছাড়া।
- ইন্টিজার্স যেকোনো কাউন্টিং কমান্ডের রিপ্লাই হিসেবে ব্যবহৃত হয় যেমন STRLEN, HLEN, বা BITCOUNT।
- অ্যারে যেকোনো সংখ্যক RESP অবজেক্ট ধারণ করতে পারে, অন্যান্য অ্যারে সহ। এটি সার্ভারে কমান্ড পাঠাতে এবং একাধিক এলিমেন্ট রিটার্ন করা যেকোনো রিপ্লাইর জন্য ব্যবহৃত হয় যেমন HGETALL, LRANGE, বা MGET।
- এররস রিটার্ন হয় যখন Redis আপনার কমান্ড হ্যান্ডেল করার সময় এরর সামনা করে, যেমন ভুল টাইপের ডেটা ধারণকারী কীতে কমান্ড রান করার চেষ্টা করলে।
RESP লিখে ও পড়তে সময় আমাদের কী বা ভ্যালু এস্কেপ বা এনকোড করতে হয় না। RESP-র একমাত্র যে অংশটি আপনাকে পার্স করতে হবে সেটি হলো প্রতিটি RESP অবজেক্টের সাথে থাকা সিম্পল মেটাডেটা।
RESP কীভাবে দেখে?
সব RESP অবজেক্ট একটি প্রিফিক্স ক্যারেক্টারের সাথে শুরু হয় এবং লাইন টার্মিনেটর দিয়ে শেষ হয় (অ্যারে ছাড়া, যেটির নিজস্ব লাইন টার্মিনেটর নেই)। RESP অবজেক্টের সিম্পলেস্ট উদাহরণ হলো OK সিম্পল স্ট্রিং রেসপন্স:
+OK\r\n (RESP একটি হিউম্যান-রিডেবল প্রোটোকল কিন্তু ক্লারিটির জন্য আমি সব RESP উদাহরণে লাইন ব্রেক (\r\n) এক্সপ্লিসিটলি লিখব।)
উপরের সিম্পল স্ট্রিং-এ, + হলো সিম্পল স্ট্রিং প্রিফিক্স, OK হলো সিম্পল স্ট্রিং-এর বডি, এবং \r\n হলো লাইন টার্মিনেটর যা এই সিম্পল স্ট্রিং-এর শেষ চিহ্নিত করে।
একটি সিম্পল স্ট্রিং পড়তে, আমরা নেক্সট \r\n লাইন টার্মিনেটর পর্যন্ত পড়ি, প্রিডিং বাইটস (+ পর্যন্ত) রিটার্ন করি রিপ্লাই স্ট্রিং হিসেবে। এটি কাজ করে কারণ RESP সিম্পল স্ট্রিংতে কোনো নিউলাইন ক্যারেক্টার থাকতে পারে না।
এরর এবং ইন্টিজার একইভাবে ফরম্যাট করা হয় সিম্পল স্ট্রিংর মত, কিন্তু ভিন্ন প্রিফিক্স ব্যবহার করে। এররস - প্রিফিক্সড:
-ERR unknown command 'GETT'\r\n এবং ইন্টিজার : প্রিফিক্সড:
:99\r\n বাল্ক স্ট্রিংস অনন্য কারণ এদের দুটি অংশ থাকে। একটি লেথ স্পেসিফিকেশন এবং একটি বডি:
$13\r\nHello, World!\r\n $ হলো বাল্ক স্ট্রিং প্রিফিক্স, 13 হলো আসল স্ট্রিং বডির বাইট সংখ্যা, এবং তারপর \r\n লেথ স্পেসিফিকেশন টার্মিনেট করে। Hello, World! হলো ১৩ বাইটের স্ট্রিং বডি, এবং সেটিও \r\n দিয়ে টার্মিনেটেড (যে স্ট্রিং বডির অংশ নয়)।
কারণ বাল্ক স্ট্রিং কন্টেইনার বডির একজেক্ট লেথ দিয়ে থাকে, আমাদের কখনো আসল স্ট্রিং বডি পার্স করতে হয় না এন্ড খুঁজে বের করতে - আমরা সকেট থেকে আরো ১৩ বাইট (প্লাস ফাইনাল লাইন টার্মিনেটর) পড়তে পারি স্ট্রিং কন্টেন্টস ইন্সপেক্ট ছাড়া। এর মানে আমরা স্ট্রিং বডিতে যেকোনো ডেটা ব্যবহার করতে পারি এনকোডিং বা এস্কেপিং ছাড়া।
অ্যারে ও লেথ স্পেসিফিকেশন দিয়ে শুরু হয়, পার্থক্য হলো লেথ ফিল্ডটি অ্যারেতে অবজেক্টের সংখ্যা নির্দেশ করে বাইট সংখ্যা না।
*2\r\n$3\r\nfoo\r\n$3\r\nbar\r\n উপরের উদাহরণে, আমাদের একটি অ্যারে আছে যাতে দুটি বাল্ক স্ট্রিং (foo এবং bar) আছে। অ্যারে লেথ স্পেসিফিকেশন আমাদের আ্যালো করছে না বাল্ক স্ট্রিং পড়ার মত স্কিপ ফরওয়ার্ড করার জন্য, কিন্তু এটি আমাদের ক্লায়েন্টে অ্যারে ইমপ্লিমেন্ট করা সহজ করে দেয়। আমরা অ্যারে সাইজ পড়ি, ততগুলো অবজেক্ট পড়ি, এবং তারপর সেগুলো ফাইনাল অ্যারেতে রিটার্ন করি।
সব Redis কমান্ড অ্যারে অফ বাল্ক স্ট্রিং হিসেবে পাঠানো হয়। উদাহরণস্বরূপ, "SET mykey 'my value'" কমান্ডটি লেখা ও পাঠানো হয়beeld:
*3\r\n$3\r\nSET\r\n$5\r\nmykey\r\n$8\r\nmy value\r\n আরও RESP ডিটেইলস
RESP-এ ব্যবহৃত প্রিফিক্সড লেথস পার্সার ইমপ্লিমেন্ট করা সম্ভব করে কমপ্লিকেটেড স্টেট মডেলিং বা ডেটার মাধ্যমে একাধিক পাস ছাড়া, যা ভয়ানক ফাস্ট পার্সার বিল্ড করতে দেয়।
এখানে কিছু ডিটেইল আমি কভার করিনি, যেমন নাল বাল্ক স্ট্রিং এবং নাল অ্যারে। আরও ইনফরমেশনের জন্য, অফিসিয়াল ডকুমেন্টেশন (weichito) RESP-র জন্য খুব রিডেবল এবং কম্প্রিহেনসিভ ডকুমেন্টেশন পেজ আছে।
প্রোটোকল ভালোভাবে বুঝতে একটি দুর্দান্ত উপায় হলো নিজে একটি সিম্পল ক্লায়েন্ট ইমপ্লিমেন্ট করার চেষ্টা করা। Go-তে Redis প্রোটোকল পড়া ও লেখার গাইড দেখুন।