All you need to about Django Caching-redis-cache

All you need to about Django Caching-redis-cache

·

2 min read

Table of contents

No heading

No headings in the article.

Application performance tuning and decreasing the load time of a web application is very important for successful products. Redis, a versatile tool, is an open-source, in-memory data structure store, used as a database, cache, and message broker. In this blog, I will show you how to use Redis for Django caching.

Let’s assume you have already created a Django project in your pc.

Install redis and django-redis

sudo apt-get install redis-server
pip install django-redis

check redis in shell

$ redis-cli ping
output: PONG

Now add cache configuration in your Django application settings.py

CACHES = {
        "default": {
            "BACKEND": "django_redis.cache.RedisCache",
            "LOCATION": "redis://127.0.0.1:6379/",
            "OPTIONS": {
                "CLIENT_CLASS": "django_redis.client.DefaultClient"
            },
            "KEY_PREFIX": "testApp"
        }
    }

We have enabled cache backend but none of the view is enable for cache.

Now we will enable cache for django per view

@cache_page( 60 * 15, "blog" );
def blog( request ):
    ...............
    ...............
    response = render(request, 'template')

    return response

Also, you can apply this decorator in urls.py, that is convenient for Class-Based Views or function base view:

from django.views.decorators.cache import cache_page

urlpatterns = [
    url(r'^$', cache_page(600)(BlogListView.as_view()), name='articles_list'),
    ...
]

Template fragment caching

{% load cache %}

<h1>Articles list</h1>

<p>Authors count: {{ authors_count }}</p>

<h2>Top authors</h2>

{% cache 500 top_author %}
<ul>
    {% for author in top_authors %}
    <li>{{ author.username }} ({{ author.articles_count }})</li>
    {% endfor %}
</ul>
{% endcache %}

{% cache 500 articles_list %}
{% for article in articles %}
<article>
    <h2>{{ article.title }}</h2>
    <time>{{ article.created_at }}</time>
    <p>Author: <a href="{% url 'author_page' username=article.author.username %}">{{ article.author.username }}</a></p>
    <p>Tags:
    {% for tag in article.tags.all %}
        {{ tag }}{% if not forloop.last %}, {% endif %}
    {% endfor %}
</article>
{% endfor %}
{% endcache %}

If you need per user base separate caching then we can use this way

{% cache 500 personal_articles_list request.user.username %}
    <!-- ... -->
{% %}

The low-level caching

from django.core.cache import cache

class AuthorListView(ListView):

    ...

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        authors_count = cache.get('authors_count')
        if authors_count is None:
            authors_count = Author.objects.count()
            cache.set('authors_count', authors_count)
        context['authors_count'] = authors_count
        ...
        return context

cached_property decorator

class UserBio(models.Model):

    username = models.CharField(max_length=64, db_index=True)
    email = models.EmailField()
    bio = models.TextField()

    @cached_property
    def articles_count(self):
        return self.articles.count()

Django cache clear

from django.core.cache import cache
# all cache delete
 cache.clear()
# specifiq cache delete by cache key
cache.delete('authors_count')

Thanks for reading

Did you find this article valuable?

Support Gias Uddin by becoming a sponsor. Any amount is appreciated!