All you need to about Django Caching-redis-cache
Tags: django, djangodevloper, python, webdev
Published: 2022-11-24 05:42:04

Application performance tuning and decrease 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')
```

Thank you for reading my article! If you enjoyed it and would like to support my work, please consider buying me a coffee at **[Buy Me a Coffee](https://www.buymeacoffee.com/giasuddin)**. You can also learn more about me and my work by visiting my **[Giasuddin Bio ](https://bio.link/giasuddi)**and following me on LinkedIn and Twitter. Thank you for your support!