在Django中使用缓存


Django 是动态网站,一般来说需要实时地生成访问的网页,展示给访问者,这样,内容可以随时变化,但是从数据库读多次把所需要的数据取出来,要比从内存或者硬盘等一次读出来 付出的成本大很多。而使用缓存的话,可以将数据保存在缓存中,下次访问的时候直接从缓存中获得数据,而不用去请求后端数据库,这样服务器可以很快的响应请求,从而提高加载速度。下面简单介绍下Django中的缓存系统。

缓存配置

Django支持多种缓存,例如本地文件缓存,数据库缓存,memcache,locmem等,下面分别简单介绍下:

文件缓存

这个很简单,就是将数据缓存在指定的目录中。配置如下:

CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache',
        'LOCATION': '/path/for/cache',
    }
}

数据库缓存

配置如下所示

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

执行python manage.py createcachetable来创建缓存表。

memcache

memcache需要你的服务器支持,也就是说需要有memcache服务,配置如下:

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

Local-memory

这种缓存方式会将数据保存在服务器的内存中。

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

最推荐的缓存方式是memcache或者Local-memory,要不就是文件缓存,最不推荐的是数据库缓存。 下面介绍下如何使用缓存

使用缓存

全站缓存

这种方式最简单最容易配置了,就是将你全站都做缓存,所有的页面都会缓存下来,配置方式: 在setting.pyMIDDLEWARE中添加:

MIDDLEWARE = [
    'django.middleware.cache.UpdateCacheMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.cache.FetchFromCacheMiddleware',
]

也就是将django.middleware.cache.UpdateCacheMiddlewaredjango.middleware.cache.FetchFromCacheMiddleware分别添加在django.middleware.common.CommonMiddleware的前面和后面,注意,顺序不能反过来。 这种方式清除缓存的话使用:

from django.core.cache import cache
cache.clear()

视图缓存

这种方式会指定要缓存的视图,只会缓存这个视图,

from django.views.decorators.cache import cache_page

@cache_page(60 * 15, key_prefix="site1")
def my_view(request):
    ...

cache_page的参数分别是缓存过期时间以及缓存key的前缀。 也可以在urlconf中指定要缓存的页面

from django.views.decorators.cache import cache_page

urlpatterns = [
    url(r'^foo/([0-9]{1,2})/$', cache_page(60 * 15)(my_view)),
    #也可以这样,如果你的视图是classbase的话:
    url(r'^$', cache_page(60 * 60 * 10, key_prefix="blogindex")(views.IndexView.as_view()), name='index'),
]

如果你的视图是class base的话,可以这样使用缓存:

from django.utils.decorators import method_decorator
from django.views.decorators.cache import cache_page
from django.views.generic import ListView

@method_decorator(cache_page(60*60), name='dispatch')
class MyListView(ListView):
    # Your view code here.

视图缓存的清除方式可以参见我的另一篇文章

django删除视图缓存

模版缓存

当然,也可以直接在模版中使用缓存

{% load cache %}
{% cache 500 sidebar request.user.username %}
    .. sidebar for logged in user ..
{% endcache %}

参数分别是过期时间,缓存名,区分不同缓存的参数 模版缓存的删除方式就简单多了,以上面的配置为例:

from django.core.cache.utils import make_template_fragment_key
from django.core.cache import cache
username = self.request.user.username if self.request.user else ''
key = make_template_fragment_key('sidebar', [username])
cache.delete(key)

具体参见官方文档:

https://docs.djangoproject.com/en/1.10/topics/cache/