Django: キャッシュとパフォーマンス最適化

Django 4 の実践(データ処理編)

日付:2025年2月18日

Django でのキャッシュ活用方法を学び、パフォーマンスを向上させるテクニックを解説します。

目 次

はじめに

Django で大規模な Web アプリケーションを開発すると、ページのロード時間やデータベースの負荷が問題になることがあります。
このような問題を解決するために、Django では キャッシュ(Cache) を活用してパフォーマンスを向上させることができます。

本記事では、Django のキャッシュの基本から、実践的な活用方法までを解説します。

1. Django のキャッシュの種類

Django では、以下のキャッシュバックエンドを利用できます。

キャッシュの種類説明
メモリベース (locmem)ローカルメモリに保存(単一プロセス向け)
ファイルベース (filebased)ディスク上のファイルをキャッシュとして使用
データベース (db)キャッシュをデータベースに保存
Memcached (memcached)高速で分散可能なキャッシュシステム
Redis (redis)高速なインメモリデータストア

ポイント

  • 開発環境 では locmemfilebased を使用。
  • 本番環境 では memcachedredis を推奨。

2. キャッシュの設定(settings.py)

以下のように settings.py でキャッシュバックエンドを設定します。

(1) メモリベースのキャッシュ(開発用)

PYTHON
CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.locmem.LocMemCache', 'LOCATION': 'unique-snowflake', } }

(2) Redis を使用する(本番用)

PYTHON
CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.redis.RedisCache', 'LOCATION': 'redis://127.0.0.1:6379/1', } }

ポイント

  • redis://127.0.0.1:6379/1Redis のデータベース 1 を使用 することを意味します。
  • memcached を使う場合は django.core.cache.backends.memcached.MemcachedCache を指定。

3. キャッシュの基本的な使い方

Django では、cache オブジェクトを使ってキャッシュを設定・取得できます。

(1) キャッシュにデータを保存・取得

PYTHON
from django.core.cache import cache # データをキャッシュに保存(タイムアウト 60 秒) cache.set('my_key', 'キャッシュされたデータ', 60) # キャッシュからデータを取得 value = cache.get('my_key') print(value) # → 'キャッシュされたデータ'

ポイント

  • cache.set('key', 'value', timeout) でデータをキャッシュ。
  • cache.get('key') でデータを取得。

4. ページ全体をキャッシュする(@cache_page)

特定のビューをキャッシュする場合は @cache_page デコレーターを使用します。

PYTHON
from django.views.decorators.cache import cache_page @cache_page(60 * 15) # 15分間キャッシュ def my_view(request): return HttpResponse("このページはキャッシュされています。")

ポイント

  • @cache_page(秒数) でページを キャッシュ し、無駄なリクエストを減らせる。
  • 負荷の高いページに適用すると、サーバー負荷を大幅に削減可能。

5. テンプレートキャッシュ({% cache %})

Django では、テンプレートの一部をキャッシュすることも可能です。

HTML
{% load cache %} {% cache 600 sidebar %} <div class="sidebar">サイドバーのコンテンツ</div> {% endcache %}

ポイント

  • {% cache 秒数 'キャッシュキー' %} を使用すると、特定のテンプレートブロックのみキャッシュ可能。
  • 頻繁に変更されない UI パーツ に適用すると効果的。

6. データベースクエリのキャッシュ

Django ORM の結果をキャッシュすることで、データベースの負荷を減らせます。

PYTHON
from django.core.cache import cache from myapp.models import Item def get_items(): items = cache.get('items_cache') if not items: items = list(Item.objects.all()) cache.set('items_cache', items, 300) # 5分間キャッシュ return items

ポイント

  • cache.get('key') でキャッシュを取得。
  • キャッシュがない場合、データベースから取得し cache.set() でキャッシュ。

7. まとめ

  • Django の キャッシュ機能 を活用すると、アプリケーションの パフォーマンスを向上 できる。
  • CACHES 設定で バックエンド(Redis, Memcached, File, DB など)を指定 できる。
  • cache.set()@cache_pageデータやページをキャッシュ し、不要なクエリを削減。
  • テンプレートキャッシュ を活用すると、特定の UI パーツのみをキャッシュ可能。