আপনি যদি Redis-এ এক্সপায়ারিং (যাকে "ভোলাটাইল"ও বলা হয়) কী ব্যবহার করেন, তবে আপনার ডেটাবেসে একটি নতুন Redis রিপ্লিকা অ্যাট্যাচ করলে আপনি আশ্চর্য করতে পারেন: আপনার রিপ্লিকার কী কাউন্ট আপনার প্রাইমারি ডিবির চেয়ে উল্লেখযোগ্যভাবে কম হতে পারে। এটি বিশেষত সাধারণ যদি আপনার কাছে বড় সংখ্যক ভোলাটাইল কী থাকে।
আপনার Redis রিপ্লিকা কী মিসিং? আপনি কী ডেটা হারিয়ে ফেলেছেন? সংক্ষিপ্ত উত্তর হলো, "না"। যাইহোক, এটি বুঝতে সাহায্য করে যে কেন, আপনার Redis রিপ্লিকা কম কী কাউন্ট রিপোর্ট করছে এমনকি আপনি কোনো ডেটা হারিয়ে নিয়েছেন না। এতে দুটি ইমপ্লিমেন্টেশন ডিটেইল জড়িত: Redis কীভাবে কী এক্সপায়ার করে এবং Redis কীভাবে আপনার ডেটাসেট নতুন রিপ্লিকাকে পাঠায়।
Redis কীভাবে ভোলাটাইল কী এক্সপায়ার করে?
Redis-এ, ভোলাটাইল কীগুলো সেই মুহূর্তে মেমরি থেকে এক্সপাঞ্জ করা হয় না যখন সেগুলো এক্সপায়ার সেট করা হয়। বরং সেগুলো দুটি মেথড দিয়ে ডিলিট হয়:
-
যখন একটি Redis ক্লায়েন্ট একটি কীতে রিড বা রাইট অপারেশন পারফর্ম করে, Redis সার্ভার প্রথমে চেক করে সেই কী আছে কিনা এবং এক্সপিরেশন টাইম আছে কিনা। যদি থাকে এবং এক্সপিরেশন টাইম অতীতে থাকে, তবে Redis azonই কীকে মেমরি থেকে এক্সপাঞ্জ করে দেয় কমান্ড হ্যান্ডেল করার আগে।
-
ভোলাটাইল কীগুলো যদি অ্যাক্সেস না হয়ে মেমরিতে চিরকাল পড়ে থাকা থেকে রক্ষা করতে, Redis একটি সিম্পল প্যাসিভ অ্যালগরিদম ব্যবহার করে কী এক্সপায়ার করতে: প্রতি ১০ মিলিসেকেন্ডে, এটি ১০০টি র্যান্ডম ভোলাটাইল কী নেয় এবং যেসব কীয়ের এক্সপিরেশন টাইম অতীতে গিয়েছে সেগুলো azonই এক্সপাঞ্জ করে দেয়। যদি ২৫ বা অধিক কী এক্সপাঞ্জ হয়, তবে Redis azonই আরও ১০০টি কী নেয় এবং আবার শুরু করে।
উপরের দ্বিতীয় মেথডটি গুরুত্বপূর্ণ কারণ এর মানে একটি উল্লেখযোগ্য সংখ্যক কী ভোলাটাইল কী হিসেবে থাকতে পারে যেগুলো ইতিমধ্যে "এক্সপায়ারড" কিন্তু এখনো মেমরি থেকে এক্সপাঞ্জ করা হয়নি1। Redis এই কীগুলো আপনার INFO আউটপুটে "keys" এবং "expires" কাউন্টে অন্তর্ভুক্ত করে থাকবে যতক্ষণ না সেগুলো এক্সপাঞ্জ হয়।
Redis কীভাবে ডেটাসেট নতুন রিপ্লিকাকে পাঠায়?
যখন একটি Redis রিপ্লিকা একটি Redis সার্ভারের সাথে অ্যাট্যাচ হয়, প্রাইমারি সার্ভার তার ডেটাসেটের একটি RDB স্ন্যাপশট তৈরি করে এবং রিপ্লিকাকে পাঠায়। এবং যখন Redis RDB স্ন্যাপশট তৈরি করে, এটি অতীতের এক্সপিরেশন ডেট वाले যেকোনো কী অন্তর্ভুক্ত করে না, এমনকি যদি সেগুলো এখনো মেমরি থেকে এক্সপাঞ্জ করা হয়নি।
তাহলে কেন আমার রিপ্লিকার কী কাউন্ট প্রাইমারি সার্ভারের চেয়ে কম?
যখন আপনি একটি রিপ্লিকা Redis ইনস্ট্যান্সের সাথে অ্যাট্যাচ করেন, সেই রিপ্লিকা একটি ডেটাসেট পায় যাতে প্রাইমারি ডেটাবেস থেকে এক্সপায়ারড (কিন্তু এখনো বিদ্যমান) ভোলাটাইল কীগুলো নেই। এটিই কারণ যে আপনার কী কাউন্ট ড্রপ করতে পারে যখন Redis সার্ভার RDB ব্যাকআপ থেকে রিস্টোর করা হয়।
স্পেশ্যাল থ্যাংکس @mattsta-এর প্রতি RDB বিহেভিয়র ট্র্যাক ডাউন করতে সাহায্যের জন্য।
-
প্র্যাকটিসে, এই সংখ্যা সাধারণত অনেক কম থাকে কারণ Redis دائماً কী ডিলিট করার জন্য সার্চ করে। ↩