赞
踩
我们知道,在Django中,请求到达视图后,视图会从数据库取数据放到模板中进行动态渲染,渲染后的结果就是用户看到的html页面。但是,如果每次请求都从数据库取数据并渲染,将极大降低性能,不仅服务器压力大,而且客户端也无法即时获得响应。如果能将渲染后的结果放到速度更快的缓存中,每次有请求过来,先检查缓存中是否有对应的资源,如果有,直接从缓存中取出来返回响应,节省取数据和渲染的时间,不仅能大大提高系统性能,还能提高用户体验。
缓存是一类统称,一般其介质是速度很快的内存,但也可以是能加快数据读取的其它方式
配置
CACHES = {
'default': {
# 指定缓存方式为文件
'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache',
# 指定缓存文件的路径
'LOCATION': '路径',
# 缓存超时时间(默认为300秒,None表示永不过期,0表示立即过期)
# 可以在setting.py中单独配置CACHE_MIDDLEWARE_SECONDS = 10缓存超时时间,其优先级高于CACHES中的TIMEOUT。
'TIMEOUT':300,
}
}
说明
linux系统上要把缓存项目放在文件系统上,请为CACHE_BACKEND使用”file://“的缓存类型。例如,要把缓存数据存储在/var/tmp/django_cache上,请使用此设置:
CACHE_BACKEND = 'file:///var/tmp/django_cache'
**注意:**有三个斜线。 头两项是file://,第三个是第一个字符的目录路径,/var/tmp/django_cache。
使用的是Windows,在file://之后加上文件的盘符:
file://d:/cache/django_cache
适合场景
小网站的低成本解决方案
安装memcache
1、安装memcache
sudo apt-get install memcached
2、运行memcached
memcached -d -m 50 -p 11311 -u root
-d重启或者启动服务 -m 最大内存 默认64 -p 端口号 - u 用户名
3、默认只能本地访问需要修改
django安装python-memcached
pip install python-memcached
单个配置方式
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache', # 指定缓存使用的引擎
'LOCATION': '127.0.0.1:11211', # 指定Memcache缓存服务器的IP地址和端口
'OPTIONS':{
'MAX_ENTRIES': 300,
}
}
}
多个服务器配置
CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache', # 指定缓存使用的引擎 器 'LOCATION': [ # 指定一台或多台其他主机ip地址加端口为Memcache缓存服务器 '127.0.0.1:11211', '127.0.0.1.3:11311', '127.0.0.1.4:11411', ] # 或者也可以给缓存机器加权重,权重高的承担更多的请求 # 'LOCATION': [ # ('172.19.26.240:11211',5), # ('172.19.26.242:11211',1), # ] } }
应用场景
缓存机制对于小型网站,比如你做的各种博客、或者是访问量比较小的,意义不是很大。一般是用于,规模中等或较大,访问量大。
安装redis
pip install django_redis
创建数据库
python manage.py createcachetable
配置
CACHES = {
'default': {
'BACKEND': 'django_redis.cache.RedisCache',
# 缓存地址
"LOCATION": "redis://127.0.0.1:6379",
"OPTIONS": {
'MAX_ENTRIES': 2000
#使用线程池管理连接
"CONNECTION_POOL_KWARGS": {"max_connections": 100}
}
},
}
设置redis存储django的session信息
SESSION_ENGINE = "django.contrib.sessions.backends.cache"
SESSION_CACHE_ALIAS = "default"
Django提供了不同粒度的缓存,可以缓存某个页面,可以只缓存一个页面的某个部分,甚至可以缓存整个网站.
说明
用户的请求通过中间件,经过一系列的认证等操作,如果请求的内容在缓存中存在,则使用FetchFromCacheMiddleware获取内容并返回给用户,
当返回给用户之前,判断缓存中是否已经存在,如果不存在,则UpdateCacheMiddleware会将缓存保存至Django的缓存之中,以实现全站缓存,
配置
MIDDLEWARE = [
'django.middleware.cache.UpdateCacheMiddleware', # 响应HttpResponse中设置几个headers
# 其它中间件
'django.middleware.cache.FetchFromCacheMiddleware', # 用来缓存通过GET和HEAD方法获取的状态码为200的响应
]
其它配置
CACHE__MIDDLEWARE_SECONDS=15 # 设定超时时间为15秒
注意
示例代码
views视图函数
from django.shortcuts import render
import time
def index(request):
cache_time = time.time()
return render(request,'index.html',{'time':cache_time})
{% load cache %} # 加载缓存
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>缓存测试</title>
</head>
<body>
<p>{{ time }}</p>
{% cache 15 %} # 设定超时时间为15秒
<h3>{{ time }}</h3>
{% endcache %}
</body>
</html>
配置方式一
from django.views.decorators.cache import cache_page
@cache_page(60 * 10) 秒数,这里指缓存 10 分钟
def cache_view(request):
return render(request, 'cache/index.html', {'bar': bar})
配置方式二
from django.views.decorators.cache import cache_page
urlpatterns = [
url(r'cache_test/$', cache_page(60 * 10)(cache_view)),
]
语法
1、引入TemplateTag
{% load cache %}
2、使用缓存
{% cache 5000 缓存key %}
缓存内容
{% endcache %}
模板
{% load cache %} # 加载缓存
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>缓存测试</title>
</head>
<body>
<p>{{ time }}</p>
{% cache 15 'cache_test' %} # 设定超时时间为15秒
<h3>{{ time }}</h3>
{% endcache %}
</body>
</html>
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。