Caching হল এমন একটি প্রযুক্তি যা ডেটা বা রেসপন্স সংরক্ষণ করে এবং পুনরায় ব্যবহারের জন্য দ্রুত অ্যাক্সেস প্রদান করে। ফাস্টএপিআই (FastAPI) তে ক্যাশিং ব্যবহারের মাধ্যমে আপনি সার্ভারের লোড কমাতে এবং অ্যাপ্লিকেশনের পারফরম্যান্স দ্রুত করতে পারেন। ক্যাশিং সাধারণত ডেটাবেস কুয়েরি, API রেসপন্স, বা অন্য কোনো ব্যয়বহুল প্রসেসের ফলাফল সংরক্ষণ করতে ব্যবহৃত হয়।
FastAPI তে ক্যাশিং বাস্তবায়ন করার জন্য বিভিন্ন প্রযুক্তি ব্যবহার করা যেতে পারে, যেমন Redis, Memcached, বা ইন-মেমরি ক্যাশিং।
এই গাইডে আমরা দেখব কিভাবে Redis ক্যাশিং ব্যবহার করে FastAPI অ্যাপ্লিকেশনের পারফরম্যান্স বৃদ্ধি করা যায়।
কেন Caching ব্যবহার করবেন?
কিছু কারণে ক্যাশিং অত্যন্ত গুরুত্বপূর্ণ:
- পারফরম্যান্স বৃদ্ধি: ক্যাশিং দ্রুত রেসপন্সের মাধ্যমে সার্ভারের লোড কমায়।
- ডাটাবেস কুয়েরি অপ্টিমাইজেশন: ক্যাশিং ব্যবহারের মাধ্যমে একাধিক কুয়েরি ডাটাবেসে পাঠানো এড়ানো যায়, যা ডাটাবেসের লোড কমায়।
- API কল কমানো: বাইরের API কলগুলো ক্যাশে রেখে কম করা যায়।
- উচ্চ ট্রাফিক পরিচালনা: উচ্চ ট্রাফিক সময়ে দ্রুত রেসপন্স প্রদান করে, সার্ভারের লোড কমায়।
FastAPI তে Redis ব্যবহার করে Caching
Redis হলো একটি ইন-মেমরি ডেটাবেস যা ক্যাশিং এবং ডেটা স্টোরেজের জন্য খুবই জনপ্রিয়। FastAPI তে Redis ব্যবহার করে ডেটা ক্যাশিং করা যায়।
১. Redis ইনস্টল করা
Redis ব্যবহার করার জন্য আপনাকে প্রথমে redis এবং aioredis লাইব্রেরি ইনস্টল করতে হবে।
pip install redis aioredis
২. FastAPI অ্যাপ্লিকেশন তৈরি এবং Redis ক্যাশিং ব্যবহার করা
এখন আমরা Redis ক্যাশিং ব্যবহার করে FastAPI অ্যাপ তৈরি করব। এখানে আমরা aioredis লাইব্রেরি ব্যবহার করব, যা অ্যাসিঙ্ক্রোনাস Redis ক্লায়েন্ট।
from fastapi import FastAPI
import aioredis
import json
app = FastAPI()
# Redis সেটআপ
REDIS_HOST = "localhost"
REDIS_PORT = 6379
REDIS_DB = 0
# Redis সংযোগ তৈরি
async def get_redis():
return await aioredis.create_redis_pool((REDIS_HOST, REDIS_PORT), db=REDIS_DB)
@app.on_event("startup")
async def startup():
app.state.redis = await get_redis()
@app.on_event("shutdown")
async def shutdown():
app.state.redis.close()
await app.state.redis.wait_closed()
@app.get("/items/{item_id}")
async def get_item(item_id: int):
redis = app.state.redis
# ক্যাশে চেক করা
cached_item = await redis.get(f"item:{item_id}")
if cached_item:
# ক্যাশে থাকলে, ক্যাশ থেকে ডেটা রিটার্ন
return {"item_id": item_id, "cached": True, "item": json.loads(cached_item)}
# ক্যাশে না থাকলে, নতুন ডেটা তৈরি করা
item = {"name": f"Item {item_id}", "price": 100 + item_id}
# নতুন ডেটা ক্যাশে রাখা
await redis.set(f"item:{item_id}", json.dumps(item), expire=60) # 60 সেকেন্ডের জন্য ক্যাশে রাখবেন
return {"item_id": item_id, "cached": False, "item": item}
এখানে:
get_redis: Redis থেকে সংযোগ তৈরি করা।app.state.redis: FastAPI অ্যাপ্লিকেশনের স্টেটে Redis সংযোগ রাখা।expire=60: ফাইলটি 60 সেকেন্ডের জন্য Redis ক্যাশে রাখার জন্যexpireব্যবহার করা হয়েছে। এর মানে হল যে, 60 সেকেন্ড পরে ডেটাটি ক্যাশ থেকে মুছে যাবে।
৩. Redis ক্যাশে কিভাবে কাজ করছে
- ক্যাশে চেক করা: যখন
GET /items/{item_id}এন্ডপয়েন্টে রিকোয়েস্ট আসে, প্রথমে Redis ক্যাশে চেক করা হয় যে ডেটাটি আছে কিনা। - ক্যাশে ডেটা পাওয়া গেলে: যদি ক্যাশে ডেটা পাওয়া যায়, তবে সেই ডেটা রিটার্ন করা হয় এবং
cachedফিল্ডের মানTrueহবে। - ক্যাশে ডেটা না পাওয়া গেলে: যদি ক্যাশে ডেটা না পাওয়া যায়, তবে নতুন ডেটা তৈরি করা হয় এবং Redis ক্যাশে সংরক্ষণ করা হয়।
৪. Testing the Cache
১. প্রথম রিকোয়েস্ট:
GET /items/1
{
"item_id": 1,
"cached": false,
"item": {"name": "Item 1", "price": 101}
}
এখানে ক্যাশে ডেটা নেই, তাই নতুন ডেটা তৈরি করা হয়েছে এবং Redis ক্যাশে রাখা হয়েছে।
২. পরবর্তী রিকোয়েস্ট:
GET /items/1
{
"item_id": 1,
"cached": true,
"item": {"name": "Item 1", "price": 101}
}
এখন ক্যাশে ডেটা পাওয়া গেছে, তাই Redis থেকে ডেটা ফিরিয়ে দেয়া হয়েছে।
৫. Redis Cache Expiration
Redis ক্যাশে ডেটা expire করা যেতে পারে, যাতে নির্দিষ্ট সময় পর ডেটা মুছে যায়। FastAPI তে আমরা expire অপশন ব্যবহার করে এই কার্যকলাপ পরিচালনা করতে পারি, যেমন উপরে দেওয়া কোডে expire=60 ব্যবহার করা হয়েছে, যার মানে হল যে ডেটা 60 সেকেন্ড পর মুছে যাবে।
৬. Redis Error Handling
Redis সংযোগে কোনো ত্রুটি ঘটলে, আপনি ত্রুটির সাথে সঠিকভাবে কাজ করার জন্য কোডে Error Handling করতে পারেন। যেমন:
@app.get("/items/{item_id}")
async def get_item(item_id: int):
try:
redis = app.state.redis
# ক্যাশে চেক করা
cached_item = await redis.get(f"item:{item_id}")
if cached_item:
return {"item_id": item_id, "cached": True, "item": json.loads(cached_item)}
item = {"name": f"Item {item_id}", "price": 100 + item_id}
await redis.set(f"item:{item_id}", json.dumps(item), expire=60)
return {"item_id": item_id, "cached": False, "item": item}
except aioredis.RedisError as e:
return {"error": "Error connecting to Redis", "details": str(e)}
এখানে RedisError এর মাধ্যমে Redis সংযোগের ত্রুটি শনাক্ত করা হয়েছে।
Redis ক্যাশিং ব্যবহার করে FastAPI এর পারফরম্যান্স উন্নত করা যেতে পারে, বিশেষ করে বড় ডেটা এবং আই/ও অপারেশনের জন্য। Redis ক্যাশিং সার্ভারের লোড কমায় এবং রেসপন্স টাইম দ্রুত করে তোলে। আপনি expire, data validation, এবং error handling এর মতো গুরুত্বপূর্ণ বৈশিষ্ট্য ব্যবহার করে ক্যাশিং প্রক্রিয়া আরও উন্নত করতে পারেন। FastAPI তে Redis ক্যাশিং এক সহজ এবং কার্যকরী পদ্ধতি যা ওয়েব অ্যাপ্লিকেশনের স্কেলেবিলিটি এবং পারফরম্যান্স বৃদ্ধি করে।
Read more