Djangoでキャッシュを行う

今回はDjangoで、キャッシュをやって高速化しようと思うのですが、
メモリ系のキャッシュだと、再起動時とかに消えて嫌なので、DBキャッシュでやっていこうと思います。

日ごとに表示内容が変わるようなものはメモリのほうがいいかもしれません。
DBとメモリの二刀流もできるので、下に書いときます

DBキャッシュの設定

テーブル名は、それっぽい感じでdjango_cacheにでもしてみます。
settings.py

CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.db.DatabaseCache',
        'LOCATION': 'django_cache',
    }
}

DBの作成

python manage.py createcachetable

できました
file

file
カラムは、キー、値、期限ってとこですね、シンプル

キャッシュの利用方法

ビューでの利用

from django.views.decorators.cache import cache_page

@cache_page(60 * 15)  # 15分間キャッシュする
def my_view(request):
    # ...

テンプレートでの利用

{% load cache %}
{% cache 500 sidebar %}
    ... sidebar contents here ...
{% endcache %}

500のところは秒です

データのキャッシュ

、Pythonの pickle モジュールでシリアライズ可能な任意のオブジェクトです。これには、辞書、リスト、クラスのインスタンスなどが含まれます。

from django.core.cache import cache

def my_view(request):
    if 'my_key' in cache:
        value = cache.get('my_key')
    else:
        value = 重い処理()
        cache.set('my_key', value, timeout=300)  # 5分間キャッシュする
    return value

キャッシュの無効化と削除

キャッシュしたデータを無効にするには、cache.delete('my_key') を使います。また、cache.clear() を使って全てのキャッシュをクリアすることもできます。

DBキャッシュとメモリキャッシュ2刀流する方法

設定

settings.py

CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',# ローカルメモリ
        'LOCATION': 'unique-name',
    },
    'database': {
        'BACKEND': 'django.core.cache.backends.db.DatabaseCache',
        'LOCATION': 'django_cache',
    }
}

他のキャッシュもついでに記載

ファイルベース

CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache',
        'LOCATION': '/var/tmp/django_cache',
    }
}

Memcached

CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
        'LOCATION': '127.0.0.1:11211',
    }
}

Redis

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

キャッシュする側

from django.core.cache import caches

# デフォルトキャッシュを取得
default_cache = caches['default']
default_cache.set('key_in_default', 'value', timeout=300)

# ファイルベースのキャッシュを取得
filebased_cache = caches['database']
filebased_cache.set('key_in_filebased', 'value', timeout=300)

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です