🎸 Django Advanced

What is Django's caching strategies and cache invalidation?

Answer

Advanced Django caching strategies: Cache-Aside (Lazy Loading): most common pattern. Check cache → if miss, query DB, populate cache → return data: def get_user_dashboard(user_id): cache_key = f"user_dashboard_{user_id}_v2" data = cache.get(cache_key) if data is None: data = { "articles": list(Article.objects.filter(author_id=user_id).values()), "stats": UserStats.objects.get(user_id=user_id).__dict__ } cache.set(cache_key, data, timeout=300) return data. Write-Through: update cache when updating DB — always fresh but every write hits both: def update_article(pk, data): article = Article.objects.get(pk=pk) for k, v in data.items(): setattr(article, k, v) article.save() cache.set(f"article_{pk}", ArticleSerializer(article).data, 3600). Cache invalidation with signals: @receiver(post_save, sender=Article) def invalidate_article_cache(sender, instance, **kwargs): cache.delete(f"article_{instance.pk}") cache.delete(f"article_list_{instance.author_id}") cache.delete_pattern("article_list_*") # with django-redis. Versioned cache keys: def get_cache_key(model, pk): return f"{model.__name__}_{pk}_{settings.CACHE_VERSION}". Bump CACHE_VERSION to invalidate all caches at once. Cache warming: pre-populate cache after deploy with management command. Stampede prevention: cache lock (use django-redis cache.add() as atomic set-if-not-exists) or probabilistic early expiration. Distributed caching: Redis with sentinel or cluster for HA. Multiple Django instances share one Redis — critical for horizontal scaling.