今回は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
できました
カラムは、キー、値、期限ってとこですね、シンプル
キャッシュの利用方法
ビューでの利用
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)