রেডিস ব্যবহারের ক্ষেত্র: ক্যাশিং, কিউ এবং রেট লিমিটিং
আপনি আপনার স্ট্যাকে রেডিস যোগ করেছেন, কিন্তু আপনি এটি শুধুমাত্র একটি সাধারণ কী-ভ্যালু স্টোর হিসেবে ব্যবহার করছেন। রেডিস শক্তিশালী ডেটা স্ট্রাকচার এবং কমান্ড অফার করে যা ক্যাশিং, কিউয়িং এবং রেট লিমিটিং সুন্দরভাবে সমাধান করতে পারে। এই গাইডটি দেখায় কিভাবে এই প্যাটার্নগুলি কার্যকরভাবে বাস্তবায়ন করবেন।
কেন এই ব্যবহারের ক্ষেত্রগুলির জন্য রেডিস?
রেডিস একটি ইন-মেমরি ডেটা স্টোর যা তার গতি এবং বহুমুখীতার জন্য পরিচিত। এটি স্ট্রিং, হ্যাশ, লিস্ট, সেট, সর্টেড সেট এবং আরও অনেক কিছু সমর্থন করে। এর পারমাণবিক অপারেশন এবং বিল্ট-ইন মেয়াদ শেষ হওয়া এটিকে ক্যাশিং, কিউ এবং রেট লিমিটিংয়ের জন্য আদর্শ করে তোলে। উপরন্তু, এটি যেকোনো ভাষার সাথে সংহত করা সহজ।
রেডিস দিয়ে ক্যাশিং
ক্যাশিং হল সবচেয়ে সাধারণ রেডিস ব্যবহারের ক্ষেত্র। আপনি ডেটাবেস লোড কমাতে এবং প্রতিক্রিয়া দ্রুত করতে ঘন ঘন অ্যাক্সেস করা ডেটা রেডিসে সংরক্ষণ করেন।
বেসিক ক্যাশ-অ্যাসাইড প্যাটার্ন
ক্যাশ-অ্যাসাইড প্যাটার্নে, আপনার অ্যাপ্লিকেশন প্রথমে রেডিস চেক করে। যদি ডেটা সেখানে না থাকে (ক্যাশ মিস), এটি ডেটাবেস থেকে আনয়ন করে, তারপর পরের বারের জন্য রেডিসে সংরক্ষণ করে।
import redis
import json
r = redis.Redis(host='localhost', port=6379, db=0)
def get_user(user_id):
cache_key = f'user:{user_id}'
cached = r.get(cache_key)
if cached:
return json.loads(cached)
user = fetch_user_from_db(user_id) # আপনার ডিবি কল
r.setex(cache_key, 3600, json.dumps(user)) # ১ ঘন্টার জন্য ক্যাশ
return user
সেরা অনুশীলন:
- বাসি ডেটা এড়াতে সর্বদা একটি মেয়াদ শেষ হওয়ার সময় (TTL) সেট করুন।
- অর্থপূর্ণ কী নাম ব্যবহার করুন, যেমন
user:123:profile। - ক্যাশ ইনভ্যালিডেশন পরিচালনা করুন: ডেটা পরিবর্তিত হলে, ক্যাশ এন্ট্রি আপডেট বা মুছে ফেলুন।
- মেমরি সাশ্রয় করতে একটি বস্তুর একাধিক ক্ষেত্র সংরক্ষণ করতে রেডিস হ্যাশ ব্যবহার করার কথা বিবেচনা করুন।
উন্নত ক্যাশিং প্যাটার্ন
উচ্চ-ট্রাফিক অ্যাপ্লিকেশনের জন্য, এই প্যাটার্নগুলি বিবেচনা করুন:
- রাইট-থ্রু: ক্যাশ এবং ডেটাবেস একসাথে আপডেট করুন।
- রাইট-বিহাইন্ড: প্রথমে ক্যাশ আপডেট করুন, তারপর অ্যাসিঙ্ক্রোনাসভাবে ডেটাবেস আপডেট করুন।
- রিফ্রেশ-অ্যাহেড: মেয়াদ শেষ হওয়ার আগে সক্রিয়ভাবে ক্যাশ এন্ট্রি রিফ্রেশ করুন।
রেডিস দিয়ে কিউ
রেডিস লিস্ট এবং স্ট্রিমগুলি সাধারণ বার্তা কিউ তৈরি করার জন্য নিখুঁত। মৌলিক কাজের কিউয়ের জন্য লিস্ট এবং আরও জটিল ইভেন্ট প্রসেসিংয়ের জন্য স্ট্রিম ব্যবহার করুন।
লিস্ট দিয়ে সাধারণ জব কিউ
কাজ যোগ করতে LPUSH এবং সেগুলি প্রক্রিয়া করতে BRPOP ব্যবহার করুন। BRPOP একটি কাজ উপলব্ধ না হওয়া পর্যন্ত ব্লক করে, যা কর্মীদের জন্য এটি দক্ষ করে তোলে।
# প্রোডিউসার
r.lpush('jobs', json.dumps({'task': 'send_email', 'to': 'user@example.com'}))
# কনজিউমার (ওয়ার্কার)
while True:
_, job_data = r.brpop('jobs', timeout=30)
job = json.loads(job_data)
process_job(job)
সেরা অনুশীলন:
- বিভিন্ন কাজের ধরন বা অগ্রাধিকারের জন্য আলাদা তালিকা ব্যবহার করুন।
- ব্যর্থ কাজের জন্য একটি ডেড-লেটার কিউ বাস্তবায়ন করুন।
- নির্ভরযোগ্যতা নিশ্চিত করতে পারমাণবিকভাবে কাজগুলিকে একটি প্রসেসিং তালিকায় সরাতে
BRPOPLPUSH(বা রেডিস 6.2+ এBLMOVE) ব্যবহার করুন। - কর্মীদের স্কেল করতে
LLENদিয়ে কিউয়ের দৈর্ঘ্য মনিটর করুন।
ইভেন্ট সোর্সিংয়ের জন্য রেডিস স্ট্রিম
রেডিস স্ট্রিম (রেডিস 5.0 এ প্রবর্তিত) কনজিউমার গ্রুপ, স্বীকৃতি এবং রিপ্লে সহ আরও শক্তিশালী কিউ প্রদান করে। ইভেন্ট যোগ করতে XADD এবং সেগুলি ব্যবহার করতে XREADGROUP ব্যবহার করুন।
# ইভেন্ট যোগ করুন
r.xadd('events', {'type': 'order_placed', 'order_id': '123'})
# কনজিউমার গ্রুপ
r.xgroup_create('events', 'order_processors', id='0', mkstream=True)
while True:
events = r.xreadgroup('order_processors', 'worker1', {'events': '>'}, count=10, block=5000)
for event in events:
process_event(event)
r.xack('events', 'order_processors', event.id)
রেডিস দিয়ে রেট লিমিটিং
রেট লিমিটিং আপনার API গুলিকে অপব্যবহার থেকে রক্ষা করে এবং ন্যায্য ব্যবহার নিশ্চিত করে। রেডিসের পারমাণবিক অপারেশনগুলি অনুরোধ গণনার জন্য এটি আদর্শ করে তোলে।
ফিক্সড উইন্ডো রেট লিমিটিং
প্রতিটি ব্যবহারকারীর জন্য একটি কাউন্টার বাড়ান এবং একটি মেয়াদ শেষ হওয়ার সময় সেট করুন। যদি গণনা সীমা ছাড়িয়ে যায়, অনুরোধটি ব্লক করুন।
def is_allowed(user_id, limit=100, window=60):
key = f'rate_limit:{user_id}'
current = r.incr(key)
if current == 1:
r.expire(key, window)
return current