一、为什么要用缓存?
我们知道,在Django中,请求到达视图后,视图会从数据库取数据放到模板中进行动态渲染,渲染后的结果就是用户看到的html页面。但是,如果每次请求都从数据库取数据并渲染,将极大降低性能,不仅服务器压力大,而且客户端也无法即时获得响应。如果能将渲染后的结果放到速度更快的缓存中,每次有请求过来,先检查缓存中是否有对应的资源,如果有,直接从缓存中取出来返回响应,节省取数据和渲染的时间,不仅能大大提高系统性能,还能提高用户体验。
缓存是一类统称,一般其介质是速度很快的内存,但也可以是能加快数据读取的其它方式
二、缓存的原理:
1、没有缓存
- Django view通过Models从DB获取数据
- 然后调用template去渲染,形成真正的HttpResponse
- 通过Http Socket将数据写回给客户端
2、有缓存
- 上面的1,2就省略了
- 根据url直接从缓存池里取出保存过的HttpResponse,返回给客户端
二、Django提供了6种缓存方式
- 开发调试缓存
- 内存缓存
- 数据库缓存
- 文件缓存(常用)
- Memcache缓存(使用python-memcached模块)
- Memcache缓存(使用pylibmc模块)
- 使用redis缓存(常用)
- 使用mongdb缓存
三、常用的缓存配置
1、文件缓存
-
配置
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
-
适合场景
小网站的低成本解决方案
2 、Memcache缓存(python-memcached)
-
安装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), # ] } }
-
应用场景
缓存机制对于小型网站,比如你做的各种博客、或者是访问量比较小的,意义不是很大。一般是用于,规模中等或较大,访问量大。
3、Memcache缓存(pylibmc)
4、redis缓存
-
安装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"
五、缓存的应用
1、说明
Django提供了不同粒度的缓存,可以缓存某个页面,可以只缓存一个页面的某个部分,甚至可以缓存整个网站.
2、全站使用
-
说明
用户的请求通过中间件,经过一系列的认证等操作,如果请求的内容在缓存中存在,则使用FetchFromCacheMiddleware获取内容并返回给用户,
当返回给用户之前,判断缓存中是否已经存在,如果不存在,则UpdateCacheMiddleware会将缓存保存至Django的缓存之中,以实现全站缓存,
-
配置
MIDDLEWARE = [ 'django.middleware.cache.UpdateCacheMiddleware', # 响应HttpResponse中设置几个headers # 其它中间件 'django.middleware.cache.FetchFromCacheMiddleware', # 用来缓存通过GET和HEAD方法获取的状态码为200的响应 ]
-
其它配置
CACHE__MIDDLEWARE_SECONDS=15 # 设定超时时间为15秒
-
注意
- UpdateCacheMiddleware 必须放在开头
- FetchFromCacheMiddleware 必须放在最后
-
示例代码
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>
3、单独视图缓存
-
配置方式一
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)), ]
4、局部使用缓存
-
语法
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>