Django

⌘K
  1. Home
  2. Django
  3. Django তে কিভাবে কাজ করতে...
  4. Speed Optimization
  5. (ক্যাশিং ০ ২ ) Redis দিয়ে Django-তে টেম্পলেট ক্যাশিং

(ক্যাশিং ০ ২ ) Redis দিয়ে Django-তে টেম্পলেট ক্যাশিং

একদিন, রাহুল নামে একজন ওয়েব ডেভেলপার তার নতুন ব্লগ সাইট তৈরি করতে বসেছে। তার ব্লগে অনেকগুলি পোস্ট রয়েছে এবং সে চাচ্ছে তার পাঠকদের জন্য সাইটটিকে দ্রুত লোড করতে। রাহুল জানে যে, সার্ভার থেকে প্রতিবার নতুন তথ্য আনতে গেলে সময় লাগে এবং এটি তার ব্যবহারকারীদের জন্য বিরক্তিকর হতে পারে। তাই, সে সিদ্ধান্ত নেয় Redis দিয়ে ক্যাশিং ব্যবহার করবে।

ধাপ ১: Redis ইনস্টল করা

রাহুল তার ল্যাপটপে Redis ইনস্টল করতে শুরু করে। সে টার্মিনাল খুলে নীচের কমান্ডটি চালায়:

sudo apt update
sudo apt install redis-server

ইনস্টলেশন শেষ হলে, সে Redis সার্ভার চালু করে:

redis-server

এখন সে জানে যে, তার ক্যাশিং সিস্টেমের মূল ভিত্তি তৈরি হয়ে গেছে।

ধাপ ২: Django প্রকল্পে Redis যুক্ত করা


রাহুল তার Django প্রকল্পে Redis-কে অন্তর্ভুক্ত করার জন্য django-redis প্যাকেজটি ইনস্টল করে:

pip install django-redis

এখন সে তার settings.py ফাইলটি খুলে Redis ক্যাশ সেটআপ করে:

# settings.py

CACHES = {
    'default': {
        'BACKEND': 'django_redis.cache.RedisCache',
        'LOCATION': 'redis://127.0.0.1:6379/1',  # Redis সার্ভারের লোকেশন
        'OPTIONS': {
            'CLIENT_CLASS': 'django_redis.client.DefaultClient',
        }
    }
}

ধাপ ৩: টেম্পলেট তৈরি করা

রাহুল এখন একটি টেম্পলেট তৈরি করতে শুরু করে যেখানে সে জনপ্রিয় পোস্টগুলো দেখাতে চায়। সে একটি নতুন ফাইল popular_posts.html তৈরি করে এবং এতে ক্যাশিং যুক্ত করে:

{% load cache %}
{% cache 600 popular_posts %}
<div>
    <h2>Popular Posts</h2>
    <ul>
        {% for post in posts %}
            <li>{{ post.title }}</li>
        {% endfor %}
    </ul>
</div>
{% endcache %}

এখানে 600 সেকেন্ড (১০ মিনিট) ক্যাশ থাকবে, যার ফলে পাঠকরা যখন পোস্টগুলি দেখবে, তখন তাদের জন্য সাইট দ্রুত লোড হবে।

ধাপ ৪: ভিউ এবং URL কনফিগারেশন

রাহুল তার ভিউ তৈরি করতে শুরু করে, যেখানে সে জনপ্রিয় পোস্টগুলির তালিকা তৈরি করবে:

# blog/views.py

from django.shortcuts import render
from .models import Post

def popular_posts(request):
    posts = Post.objects.filter(is_popular=True)  # জনপ্রিয় পোস্টগুলো নিয়ে আসা
    return render(request, 'blog/popular_posts.html', {'posts': posts})

তারপর সে URL কনফিগার করে:

# myproject/urls.py

from django.urls import path
from blog.views import popular_posts

urlpatterns = [
    path('popular-posts/', popular_posts, name='popular_posts'),
]

ধাপ ৫: ক্যাশ ক্লিয়ার করার ব্যবস্থা

রাহুল জানে যে, নতুন পোস্ট যোগ হলে বা আপডেট হলে পুরাতন ক্যাশ পরিষ্কার করতে হবে। এজন্য সে post_save এবং post_delete সিগন্যাল ব্যবহার করে:

# blog/models.py

from django.db import models
from django.db.models.signals import post_save, post_delete
from django.dispatch import receiver
from django.core.cache import cache

class Post(models.Model):
    title = models.CharField(max_length=100)
    is_popular = models.BooleanField(default=False)

    def __str__(self):
        return self.title

# সিগন্যাল সেটআপ
@receiver(post_save, sender=Post)
def clear_popular_posts_cache_on_save(sender, instance, **kwargs):
    # ক্যাশে রাখা জনপ্রিয় পোস্টের তথ্য মুছে দিন
    cache.delete('popular_posts')
    print(f'Cached popular posts cleared due to saving post: {instance.title}')

@receiver(post_delete, sender=Post)
def clear_popular_posts_cache_on_delete(sender, instance, **kwargs):
    # ক্যাশে রাখা জনপ্রিয় পোস্টের তথ্য মুছে দিন
    cache.delete('popular_posts')
    print(f'Cached popular posts cleared due to deleting post: {instance.title}')

কোডের ব্যাখ্যা

  1. মডেল সংজ্ঞা:
    • আমরা একটি Post মডেল তৈরি করেছি, যেখানে title এবং is_popular নামের দুটি ফিল্ড রয়েছে।
    • title হলো পোস্টের শিরোনাম এবং is_popular হলো একটি বুলিয়ান ফিল্ড যা নির্দেশ করে যে পোস্টটি জনপ্রিয় কি না।
  2. সিগন্যাল সেটআপ:
    • @receiver(post_save, sender=Post): এই ডেকোরেটর ব্যবহার করে আমরা নির্দেশ দিচ্ছি যে, যখন Post মডেলটি সেভ (save) হবে, তখন clear_popular_posts_cache_on_save ফাংশনটি কার্যকর হবে।
    • @receiver(post_delete, sender=Post): এই ডেকোরেটর ব্যবহার করে আমরা নির্দেশ দিচ্ছি যে, যখন Post মডেলটি মুছে (delete) ফেলা হবে, তখন clear_popular_posts_cache_on_delete ফাংশনটি কার্যকর হবে।
  3. ক্যাশ পরিষ্কার:
    • উভয় ফাংশনে, cache.delete('popular_posts') ব্যবহার করে আমরা popular_posts ক্যাশটি পরিষ্কার করছি। এর ফলে, পরবর্তী সময়ে যখন popular_posts ক্যাশ করা হবে, তখন সেটি আপডেটেড তথ্য নিয়ে আসবে।
  4. প্রিন্ট স্টেটমেন্ট:
    • প্রতি সিগন্যালের কার্যকর হওয়ার পরে আমরা একটি প্রিন্ট স্টেটমেন্ট যোগ করেছি যা কনসোলে মেসেজ দেখাবে, যেমন “Cached popular posts cleared due to saving post: [post title]”।

ব্যবহারিক উপকারিতা

  • এই সিগন্যাল সেটআপটি আপনার ক্যাশ ব্যবস্থাপনায় খুব কার্যকর। এটি নিশ্চিত করে যে আপনার ব্যবহারকারীরা সর্বদা সর্বশেষ তথ্য পান, বিশেষ করে যখন পোস্ট সেভ বা ডিলেট করা হয়। এটি আপনার ব্লগের রেসপন্সিভনেস এবং ব্যবহারকারীর অভিজ্ঞতা উন্নত করবে।

ক্যাশিং কিভাবে কাজ করে

  1. ক্যাশ তৈরি: যখন আপনি popular_posts টেম্পলেট ক্যাশে রাখবেন, Django এটিকে একটি কী হিসাবে সংরক্ষণ করবে। উদাহরণস্বরূপ, আমরা যখন popular_posts ক্যাশ করতে popular_posts কী ব্যবহার করি, তখন সেই কী সহ ক্যাশড তথ্য তৈরি হবে।
  2. ক্যাশ পরিষ্কার: যখন নতুন একটি পোস্ট সংরক্ষণ বা মুছে ফেলা হয়, তখন শুধুমাত্র popular_posts কীটি মুছে দেওয়া হবে। এটি নিশ্চিত করে যে, অন্যান্য ক্যাশড তথ্য অক্ষুণ্ণ থাকবে এবং শুধুমাত্র সেই তথ্য যা পরিবর্তিত হয়েছে, তা পুনরুদ্ধার করা হবে।

বাস্তব উদাহরণ

  • ধরুন, আপনার ব্লগে ১০টি পোস্ট রয়েছে এবং 2টি পোস্ট জনপ্রিয়।
  • আপনি যদি একটি নতুন পোস্ট যুক্ত করেন বা একটি জনপ্রিয় পোস্ট মুছে ফেলেন, তাহলে popular_posts ক্যাশ ক্লিয়ার হবে এবং পুনরায় জনপ্রিয় পোস্টগুলো ক্যাশ করা হবে।
  • এর ফলে, আপনার সাইটের অন্যান্য অংশের ক্যাশ অক্ষুণ্ণ থাকবে, যা সাইটের পারফরম্যান্স উন্নত করতে সহায়তা করবে।

ধাপ ৬: সাইটটি চালু করা

সবকিছু সঠিকভাবে সেট আপ করার পর, রাহুল তার Django সার্ভার চালু করে:

python manage.py runserver

এখন সে সাইটে গিয়ে popular-posts/ URL-এ ক্লিক করে দেখল যে, জনপ্রিয় পোস্টগুলো ক্যাশ থেকে দ্রুত লোড হচ্ছে। তার ব্যবহারকারীরা এখন দ্রুত তথ্য পেয়ে খুশি।

গল্পের শেষ

রাহুল বুঝতে পারল যে, ক্যাশিং কিভাবে তার সাইটের পারফরম্যান্স উন্নত করেছে। এখন সে নতুন পোস্ট যুক্ত করলে পুরানো ক্যাশ ক্লিয়ার হয় এবং তার পাঠকরা সব সময় আপডেট তথ্য পায়। সে এত খুশি যে, সে এখন ব্লগের অন্যান্য অংশেও ক্যাশিং যুক্ত করার পরিকল্পনা করছে।

How can we help?