আন্দ্রেই চেরনিকভ
দ্বারারেডিস একটি জনপ্রিয় ইন-মেমরি গ্রিড যা আন্তঃপ্রক্রিয়া যোগাযোগ এবং ডেটা স্টোরেজের জন্য ব্যবহৃত হয়। আপনি হয়তো শুনেছেন যে এটি আপনাকে লুয়া স্ক্রিপ্ট চালাতে দেয়, কিন্তু আপনি এখনও নিশ্চিত নন কেন। এটি আপনার মত শোনালে, পড়ুন।
পূর্বশর্ত
এই নির্দেশিকা অনুসরণ করার জন্য আপনার সিস্টেমে Redis ইনস্টল করা উচিত। পড়ার সময় রেডিস কমান্ডের রেফারেন্স চেক করা সহায়ক হতে পারে।
আমার কেন লুয়া স্ক্রিপ্ট দরকার?
সংক্ষেপে:কর্মক্ষমতা লাভ। রেডিসে আপনি যে বেশিরভাগ কাজগুলি করেন তাতে অনেকগুলি পদক্ষেপ জড়িত থাকে। আপনার অ্যাপ্লিকেশনের ভাষায় এই পদক্ষেপগুলি করার পরিবর্তে, আপনি Lua এর সাথে Redis-এর ভিতরে এটি করতে পারেন৷
- এর ফলে ভালো পারফরম্যান্স হতে পারে।
- এছাড়া, একটি স্ক্রিপ্টের মধ্যে সমস্ত পদক্ষেপ একটি পারমাণবিক উপায়ে সম্পাদিত হয়। একটি স্ক্রিপ্ট চালানোর সময় অন্য কোন Redis কমান্ড চালানো যাবে না।
উদাহরণস্বরূপ, আমি Redis এ সঞ্চিত JSON স্ট্রিং পরিবর্তন করতে Lua স্ক্রিপ্ট ব্যবহার করি। আমি এই নিবন্ধের শেষের কাছাকাছি এটি বিস্তারিতভাবে বর্ণনা করছি।
কিন্তু আমি কোনো লুয়াকে চিনি না
একজন ব্যক্তি যে কোনো লুয়া জানে না
চিন্তা করবেন না, লুয়া বোঝা খুব কঠিন নয়। আপনি যদি সি পরিবারের কোন ভাষা জানেন তবে লুয়ার সাথে আপনার ঠিক থাকা উচিত। এছাড়াও, আমি এই নিবন্ধে কাজের উদাহরণ প্রদান করছি।
আমাকে একটি উদাহরণ দেখান
চলুন শুরু করা যাক redis-cli এর মাধ্যমে স্ক্রিপ্ট চালানোর মাধ্যমে . এটি দিয়ে শুরু করুন:
redis-cli
এখন নিম্নলিখিত কমান্ডটি চালান:
eval “redis.call(‘set’, KEYS[1], ARGV[1])” 1 key:name value
EVAL কমান্ড যা রেডিসকে অনুসরণ করে স্ক্রিপ্ট চালাতে বলে। ”redis.call(‘set’, KEYS[1], ARGV[1])” স্ট্রিং হল আমাদের স্ক্রিপ্ট যা কার্যকরীভাবে Redis-এর set-এর মতো আদেশ তিনটি প্যারামিটার স্ক্রিপ্ট টেক্সট অনুসরণ করে:
- প্রদত্ত কীগুলির সংখ্যা
- কী নাম
- প্রথম যুক্তি
স্ক্রিপ্ট আর্গুমেন্ট দুটি গ্রুপে পড়ে:KEYS এবং ARGV .
আমরা স্ক্রিপ্টের কতগুলি কী প্রয়োজন তা অবিলম্বে অনুসরণ করার নম্বর দিয়ে নির্দিষ্ট করি। আমাদের উদাহরণে, এটি হল 1 . এই সংখ্যার পরপরই, আমাদের এই কীগুলি একের পর এক প্রদান করতে হবে। এগুলি KEYS হিসাবে অ্যাক্সেসযোগ্য৷ স্ক্রিপ্টের মধ্যে টেবিল। আমাদের ক্ষেত্রে, এতে একটি একক মান key:name রয়েছে সূচীতে 1 .
দ্রষ্টব্য, যে Lua সূচীকৃত টেবিলগুলি সূচী দিয়ে শুরু হয় 1, না 0 ।
আমরা কীগুলির পরে যেকোন সংখ্যক আর্গুমেন্ট দিতে পারি, যা লুয়াতে ARGV হিসাবে উপলব্ধ হবে টেবিল এই উদাহরণে, আমরা একটি একক ARGV প্রদান করি -আর্গুমেন্ট:স্ট্রিং value . আপনি ইতিমধ্যে অনুমান করেছেন, উপরের কমান্ডটি key:name কী সেট করে মান value .
স্ক্রিপ্টটি KEYS হিসাবে ব্যবহার করে এমন কীগুলি প্রদান করা একটি ভাল অনুশীলন বলে মনে করা হয় , এবং ARGV হিসাবে অন্যান্য সমস্ত আর্গুমেন্ট . তাই আপনার কী নির্দিষ্ট করা উচিত নয় 0 হিসাবে এবং তারপর ARGV-এর মধ্যে সমস্ত কী প্রদান করুন টেবিল।
এখন স্ক্রিপ্টটি সফলভাবে সম্পন্ন হয়েছে কিনা তা পরীক্ষা করা যাক। আমরা অন্য একটি স্ক্রিপ্ট চালানোর মাধ্যমে এটি করতে যাচ্ছি যা Redis থেকে কী পায়:
eval "রিটার্ন redis.call('get', KEYS[1])" 1 কী:name
আউটপুট ”value” হওয়া উচিত , যার মানে পূর্ববর্তী স্ক্রিপ্ট সফলভাবে কী “key:name” সেট করেছে .
আপনি কি স্ক্রিপ্ট ব্যাখ্যা করতে পারেন?
উপরের স্ক্রিপ্ট দেখার পরে ডোজ
আমাদের প্রথম স্ক্রিপ্ট একটি একক বিবৃতি নিয়ে গঠিত:redis.call ফাংশন:
redis.call(‘set’, KEYS[1], ARGV[1])
redis.call সহ আপনি যেকোনো Redis কমান্ড চালাতে পারেন। প্রথম আর্গুমেন্ট হল এই কমান্ডের নাম এবং এর পরামিতিগুলি। set এর ক্ষেত্রে কমান্ড, এই আর্গুমেন্ট হল কী এবং মান . সমস্ত Redis কমান্ড সমর্থিত. ডকুমেন্টেশন অনুযায়ী:
Redis একই Lua দোভাষী ব্যবহার করে সকল কমান্ড চালাতে
আমাদের দ্বিতীয় স্ক্রিপ্ট শুধুমাত্র একটি একক কমান্ড চালানোর চেয়ে একটু বেশি কাজ করে — এটি একটি মানও প্রদান করে:
eval “return redis.call(‘get’, KEYS[1])” 1 key:name
স্ক্রিপ্ট দ্বারা ফিরে আসা সবকিছু কলিং প্রক্রিয়াতে পাঠানো হয়। আমাদের ক্ষেত্রে, এই প্রক্রিয়াটি হল redis-cli এবং আপনি আপনার টার্মিনাল উইন্ডোতে ফলাফল দেখতে পাবেন।
আরও জটিল কিছু?
একজন ব্যক্তি একটি জটিল রেডিস স্ক্রিপ্ট তৈরি করার পরিকল্পনা করছেন
আমি একবার একটি নির্দিষ্ট ক্রমে একটি হ্যাশ মানচিত্র থেকে উপাদানগুলি ফেরত দিতে Lua স্ক্রিপ্ট ব্যবহার করেছিলাম। অর্ডারটি নিজেই একটি সাজানো সেটে সংরক্ষিত হ্যাশ কী দ্বারা নির্দিষ্ট করা হয়েছিল৷
৷চলুন প্রথমে redis-cli-এ এই কমান্ডগুলি চালিয়ে আমাদের ডেটা সেট আপ করি :
hmset hkeys key:1 value:1 key:2 value:2 key:3 value:3 key:4 value:4 key:5 value:5 key:6 value:6
zadd order 1 key:3 2 key:1 3 key:2
এই কমান্ডগুলি কী hkeys এ একটি হ্যাশ মানচিত্র তৈরি করে এবং কী order এ একটি সাজানো সেট যেটিতে hkeys থেকে নির্বাচিত কী রয়েছে একটি নির্দিষ্ট ক্রমে।
আপনি চেক করতে চাইতে পারেন hmset এবং zadd বিশদ বিবরণের জন্য কমান্ড রেফারেন্স।
আসুন নিম্নলিখিত স্ক্রিপ্টটি চালাই:
eval “local order = redis.call(‘zrange’, KEYS[1], 0, -1); return redis.call(‘hmget’,KEYS[2],unpack(order));” 2 order hkeys
আপনি নিম্নলিখিত আউটপুট দেখতে হবে:
“value:3”
“value:1”
“value:2”
যার মানে হল আমরা যে কীগুলি চেয়েছিলাম তার মান এবং সঠিক ক্রমে পেয়েছি৷
৷এটি চালানোর জন্য আমাকে কি সম্পূর্ণ স্ক্রিপ্ট টেক্সট উল্লেখ করতে হবে?
না! Redis আপনাকে স্ক্রিপ্ট লোড দিয়ে মেমরিতে একটি স্ক্রিপ্ট প্রিলোড করতে দেয় কমান্ড:
script load “return redis.call(‘get’, KEYS[1])”
আপনি এই মত একটি আউটপুট দেখতে হবে:
“4e6d8fc8bb01276962cce5371fa795a7763657ae”
এটি স্ক্রিপ্টের অনন্য হ্যাশ যা আপনাকে EVALSHA-কে প্রদান করতে হবে স্ক্রিপ্ট চালানোর জন্য কমান্ড:
evalsha 4e6d8fc8bb01276962cce5371fa795a7763657ae 1 key:name
দ্রষ্টব্য:আপনার প্রকৃত ব্যবহার করা উচিত SHA1৷ এর দ্বারা হ্যাশ ফিরে এসেছে৷ স্ক্রিপ্ট লোড কমান্ড, উপরের হ্যাশটি শুধুমাত্র একটি উদাহরণ।
JSON পরিবর্তন করার বিষয়ে আপনি কী উল্লেখ করেছেন?
কখনও কখনও লোকেরা Redis এ JSON অবজেক্ট সংরক্ষণ করে। এটি একটি ভাল ধারণা বা না অন্য গল্প, কিন্তু বাস্তবে, এটি অনেক ঘটে।
যদি আপনাকে এই JSON অবজেক্টে একটি কী পরিবর্তন করতে হয়, তাহলে আপনাকে এটি Redis থেকে পেতে হবে, এটিকে পার্স করতে হবে, কী পরিবর্তন করতে হবে, তারপর সিরিয়ালাইজ করে আবার Redis-এ সেট করতে হবে। এই পদ্ধতির সাথে কয়েকটি সমস্যা রয়েছে:
- সঙ্গতি। আরেকটি প্রক্রিয়া আমাদের গেট এবং সেট অপারেশনের মধ্যে এই JSON পরিবর্তন করতে পারে। এই ক্ষেত্রে, পরিবর্তনটি হারিয়ে যাবে।
- পারফরম্যান্স। আপনি যদি এই পরিবর্তনগুলি প্রায়শই করেন এবং বস্তুটি যদি বড় হয় তবে এটি আপনার অ্যাপের বাধা হয়ে উঠতে পারে। আপনি লুয়াতে এই যুক্তি প্রয়োগ করে কিছু পারফরম্যান্স জিততে পারেন।
আসুন কী obj এর অধীনে Redis-এ একটি পরীক্ষা JSON স্ট্রিং যোগ করি :
set obj ‘{“a”:”foo”,”b”:”bar”}’
এখন আমাদের স্ক্রিপ্ট রান করা যাক:
EVAL ‘local obj = redis.call(“get”,KEYS[1]); local obj2 = string.gsub(obj,”(“ .. ARGV[1] .. “\”:)([^,}]+)”, “%1” .. ARGV[2]); return redis.call(“set”,KEYS[1],obj2);’ 1 obj b bar2
এখন আমাদের কী obj এর অধীনে নিম্নলিখিত অবজেক্ট থাকবে :
{“a”:”foo”,”b”:”bar2"}
আপনি পরিবর্তে এই স্ক্রিপ্টটি স্ক্রিপ্ট লোড দিয়ে লোড করতে পারেন কমান্ড:
SCRIPT LOAD ‘local obj = redis.call(“get”,KEYS[1]); local obj2 = string.gsub(obj,”(“ .. ARGV[1] .. “\”:)([^,}]+)”, “%1” .. ARGV[2]); return redis.call(“set”,KEYS[1],obj2);’
এবং তারপর এটিকে এভাবে চালান:
EVALSHA <your_script_sha> 1 obj b bar2
কিছু নোট:
-
..লুয়াতে স্ট্রিং কনক্যাটেনেশন অপারেটর৷
৷ - কী মেলানোর জন্য এবং এর মান প্রতিস্থাপন করতে আমরা একটি RegEx প্যাটার্ন ব্যবহার করি। আপনি যদি এই রেগুলার এক্সপ্রেশনটি বুঝতে না পারেন তবে আপনি আমার সাম্প্রতিক গাইডটি দেখতে পারেন।
- অন্যান্য ফ্লেভারের থেকে Lua RegEx ফ্লেভারের একটি পার্থক্য হল আমরা
%ব্যবহার করি RegEx বিশেষ চিহ্নের জন্য ব্যাকরেফারেন্স মার্ক এবং এস্কেপ অক্ষর উভয় হিসাবে। - আমরা এখনও
”এড়িয়ে গেছি\সহ এবং%নয় কারণ আমরা Lua স্ট্রিং ডিলিমিটার এড়িয়ে যাই, RegEx বিশেষ চিহ্ন নয়।
আমার কি সবসময় লুয়া স্ক্রিপ্ট ব্যবহার করা উচিত?
না। আমি এগুলিকে শুধুমাত্র তখনই ব্যবহার করার পরামর্শ দিই যখন আপনি প্রমাণ করতে পারেন যে এটি আরও ভাল পারফরম্যান্সে পরিণত হয়। সর্বদা প্রথমে বেঞ্চমার্ক চালান।
আপনি যদি পারমাণবিকতা চান তবে আপনার পরিবর্তে রেডিস লেনদেন পরীক্ষা করা উচিত।
এছাড়াও, আপনার স্ক্রিপ্টটি খুব দীর্ঘ হওয়া উচিত নয়। মনে রাখবেন যে যখন একটি স্ক্রিপ্ট চলছে, বাকি সবকিছু শেষ হওয়ার জন্য অপেক্ষা করছে। যদি আপনার স্ক্রিপ্টটি বেশ কিছু সময় নেয় তবে এটি কর্মক্ষমতা উন্নত করার পরিবর্তে বাধা সৃষ্টি করতে পারে। টাইমআউটে পৌঁছানোর পরে স্ক্রিপ্টটি বন্ধ হয়ে যায় (ডিফল্টরূপে 5 সেকেন্ড)।
Redis স্ক্রিপ্টগুলি খুব বেশি সময় নেওয়া উচিত নয়৷
শেষ কথা
Lua সম্পর্কে আরও তথ্যের জন্য lua.org চেক করুন।
Lua স্ক্রিপ্টের কিছু উদাহরণের জন্য আপনি GitHub-এ আমার node.js লাইব্রেরি পরীক্ষা করতে পারেন (দেখুন src/lua ফোল্ডার)। আপনি নিজে কোনো লুয়া স্ক্রিপ্ট না লিখে JSON অবজেক্ট পরিবর্তন করতে node.js-এ এই লাইব্রেরিটি ব্যবহার করতে পারেন।
—————————————————————————————
এই নিবন্ধটি পড়ার জন্য আপনাকে ধন্যবাদ। প্রশ্ন এবং মন্তব্য অনেক প্রশংসা করা হয়. আমাকে অনুসরণ করার জন্য আপনাকেও স্বাগত জানাই টুইটারে ।
বিনামূল্যে কোড শিখুন. freeCodeCamp-এর ওপেন সোর্স পাঠ্যক্রম 40,000-এরও বেশি লোককে ডেভেলপার হিসেবে চাকরি পেতে সাহায্য করেছে। শুরু করুন