缓存机制
由于Django是动态网站,所有每次请求均会去数据进行相应的操作,当程序访问量大时,耗时必然会更加明显,最简单解决方式是使用:缓存,缓存将一个某个views的返回值保存至内存或者memcache中,若某个时间内再次发生同一个请求,则不再去执行请求响应过程,而直接从内存或高速缓存系统中获取该请求的响应内容返回给用户。
缓存方式
Django提供了5种不同的缓存方式:
- Memcached:高性能的分布式内存对象缓存系统,用于动态网站,以减轻数据库负载。使用Memcache需要安装系统服务器,适合超大型网站使用。
- 数据库缓存:缓存信息存储在网站数据库的缓存表中,缓存表可以在项目的配置文件中配置,适合大中型网站使用。
- 文件系统缓存:缓存信息以文本文件格式保存,适合中小型网站使用。
- 本地内存缓存:Django默认的缓存保存方式,只适用于项目开发测试。
- 虚拟缓存:Django内置的虚拟缓存,实际上只提供缓存接口,并不能储存缓存数据,只用于开发测试。
使用缓存
想要使用缓存机制需要在配置文件settings.py中设置缓存的相关配置。
缓存相关配置
Memcached配置
CACHES = {
'default':{
# 以下配置必须配置
# 配置缓存引擎
# 使用python-memcached模块连接Memcached:
'BACKEND':'django.core.cache.backends.memcached.MemcachedCache',
# 使用pylibmc模块连接Memcached:
#'BACKEND':'django.core.cache.backends.memcached.PyLibMCCache',
# 配置Memcached服务器的IP地址:
'LOCATION':[
'172.19.26.240:11211',
'172.19.26.242:11211',
]
# 可选配置:
#设置缓存的生命周期,以秒为单位,若为None,则永不过期
'TIMEOUT': 60,
'OPTIONS':{
#最大缓存记录的数量
'MAX_ENTRIES': 1000,
#当缓存到达最大数量之后,设置剔除缓存的数量
'CULL_FREQUENCY': 3,
}
}
}
数据库缓存配置
#BACKEND用于配置缓存引擎,LOCATION用于数据表的命名
CACHES = {
'default':{
# 配置缓存引擎
'BACKEND':'django.core.cache.backends.db.DatabaseCache',
# 数据表的命名
'LOCATION':'my_cache_table',
}
}
文件系统缓存
CACHES = {
'default':{
# 配置缓存引擎
'BACKEND':'django.core.cache.backends.filebased.FileBasedCache',
# 文件保存的路径
'LOCATION':'d:/mysite',
}
}
本地内存缓存
CACHES = {
'default':{
#配置缓存引擎
'BACKEND':'django.core.cache.backends.locmem.LocMemCache',
# 对存储器命名,用于识别多个存储器
'LOCATION':'unique-snowflake',
}
}
虚拟缓存
CACHES = {
'default':{
#配置缓存引擎
'BACKEND':'django.core.cache.backends.dummy.DummyCache',
}
}
通过上面的配置完成了使用缓存的第一步,接下来需要创建数据缓存表,缓存数据表的生成依赖于配置文件中DATABASES的配置信息,如果DATABASES配置了多个数据库,那么缓存数据表默认在DATABASES 的default的数据库中生成。
创建数据缓存表
python manage.py createcachetable
指定缓存作用区域
缓存可以在四个地方指定,根据作用对象不同划分,可以根据实际业务需求选择使用
全站缓存
将缓存作用于整个网站的全部页面。一般情况下不采用这种方式实现,会对数据库或Memcached造成极大的压力。
全站缓存作用于整个网站,当用户向网站发送请求时,首先经过Django的中间件进行处理。因此,使用全站缓存应在Django的中间件中配置。
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
#配置全站缓存
'django.middleware.cache.UpdateCacheMiddleware',
#使用中文
'django.middleware.locale.LocaleMiddleware',
#配置全站缓存
'django.middleware.cache.FetchFromCacheMiddleware',
]
#设置缓存的生命周期,若在缓存配置CACHES中设置TIMEOUT属性,则程序优先选择这里的设置
CACHE_MIDDLEWARE_SECONDS = 15
# #设置缓存数据保存在数据表my_cache_table中,属性值default来自于缓存配置CACHES的default属性
CACHE_MIDDLEWARE_ALIAS = 'default'
# #设置缓存表字段cache_key的值,用于同一个Django项目多个站点之间的共享缓存
CACHE_MIDDLEWARE_KEY_PREFIX = 'mysite'
视图缓存
视图缓存是将视图函数执行过程中生成缓存数据,主要以装饰器的形式来实现。装饰器有三个参数:timeout、cache和key_prefix,参数timeout是必选参数,其余两个是可选参数。
from django.shortcuts import render
from django.views.decorators.cache import cache_page
# cache与全站缓存CACHE_MIDDLEWARE_ALIAS相同
# key_prefix与全站缓存CACHE_MIDDLEWARE_KEY_PREFIX相同
@cache_page(10, cache='default', key_prefix='mysite')
def index(request):
return render(request,"index.html")
路由缓存
作用与视图缓存相同,但两者是有区别的。如有两个URL同时指向一个视图函数,分别访问这两个URL时,路由缓存会判断URL是否生成缓存而决定是否执行视图函数。
路由缓存主要在路由配置中实现,路由缓存cache_page有三个参数,分别是timeout、cache和key_prefix,参数timeout是必选参数,其余两个参数是可选参数
from django.conf.urls import url
from app1 import views
from django.views.decorators.cache import cache_page
urlpatterns = [
url(r'^index/', cache_page(10,cache='default', key_prefix='mysite')(views.index)),
模板缓存
对模板某部分的数据设置缓存,常用于模板内容变动较少的情况。通过Django的缓存标签实现的,缓存标签只支持两个参数:timeout和key_prefix,以index.html为例实现模板缓存
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
{% load cache %}
{% cache 10 mysite %}
<h1>index</h1>
{% endcache %}
</body>
</html>