缓存的介绍
我们都知道Django建立的是动态网站,正常情况下,每次请求过来都经历了这样一个过程:
接收请求 -> url路由 -> 视图处理 -> 数据库读写 -> 视图处理 -> 模版渲染 -> 返回请求
如果有大量请求来时,都要执行这个操作,那会大大增加服务器的压力,最简单的方法就是设置一个缓存,在一定的时间内,如果访问这个视图函数,则使用缓存数据。
比如我们使用的博客园,有一个分类功能,我们增加一个分类,然后新打开一个窗口,删除那个分类,在原来的窗口刷新查看,新添加的分类还存在,当超过一定的时间之后,在刷新页面,就不存在了,这就是缓存。
什么样的数据适合缓存呢?
不经常更改的数据,并且要设置一个超时时间
缓存放到内存
先在settings.py文件里配置缓存
CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.locmem.LocMemCache', # 缓存保存到内存里面 'LOCATION': 'unique-snowflake', 'TIMEOUT': 600, # 缓存超时时间(默认300,None表示永不过期,0表示立即过期) 'OPTIONS': { 'MAX_ENTRIES': 300, # 最大缓存个数(默认300) 'CULL_FREQUENCY': 2, # 缓存到达最大个数之后,剔除缓存个数的比例,2为删除二分之一(默认3) }, } }
视图使用缓冲
from django.shortcuts import render from app01 import models from django.views.decorators.cache import cache_page @cache_page(30) # 使用缓冲,参数为缓冲的有效期,30s def user_list(request): users = models.User.objects.all() return render(request, 'user_list.html', {"users": users})
这样就给user_list使用上了缓存,缓存的过期时间为30秒,如果这里不填,则使用配置里的过期时间。
当请求第一次来的时候,访问这个视图函数,30s之内访问,都会去视图里直接拿取超过30s之后才会再次执行视图函数
路由使用缓存
from django.views.decorators.cache import cache_page urlpatterns = [ url(r'^user_list', cache_page(60 * 15)(my_view)), ]
缓存放到文件
上面我们是把缓存放到内存里,我们也可以放到文件里面,只需要更改配置里的代码即可
CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache', # 缓存保存到文件 'LOCATION': 'F:\cache', # 缓存的目录路径,给个目录就可以了 'TIMEOUT': 600, # 缓存超时时间(默认300,None表示永不过期,0表示立即过期) 'OPTIONS': { 'MAX_ENTRIES': 300, # 最大缓存个数(默认300) 'CULL_FREQUENCY': 2, # 缓存到达最大个数之后,剔除缓存个数的比例,2为删除二分之一(默认3) }, } }
使用和上面的使用方法一样
缓存放到数据库
# 配置: CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.db.DatabaseCache', 'LOCATION': 'my_cache_table', # 数据库表 } } # 注:执行创建表命令 python manage.py createcachetable
既然都是在数据库里读取数据,那把缓存放到数据库里和直接读数据库有什么区别呢?把缓存放到数据库里,存的是结果,少了查询和渲染的过程,会比查数据库快
Memcache缓存
# 此缓存使用python-memcached模块连接memcache CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache', 'LOCATION': '127.0.0.1:11211', } } CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache', 'LOCATION': 'unix:/tmp/memcached.sock', } } CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache', 'LOCATION': [ '172.19.26.240:11211', '172.19.26.242:11211', ] } }
缓存的应用
前面说了给某一个视图函数使用缓存,这样的话是比较麻烦的,可以给所有的视图使用缓存
我们可以使用中间件来设置缓存,使用中间件,经过一系列的认证等操作,如果内容在缓存中存在,则使用FetchFromCacheMiddleware获取内容并返回给用户,当返回给用户之前,判断缓存中是否已经存在,如果不存在则UpdateCacheMiddleware会将缓存保存至缓存,从而实现全站缓存
MIDDLEWARE = [ 'django.middleware.cache.UpdateCacheMiddleware', # 其他中间件... 'django.middleware.cache.FetchFromCacheMiddleware', ] CACHE_MIDDLEWARE_SECONDS = "" # 超时时间