必要性:
- 由于Django是动态网站,所有每次请求可能进行数据库相关操作,当程序访问量大时,耗时必然会更加明显,最简单解决方式是使用缓存。
- 缓存会将某个views的返回值保存至内存 或者 memcache中,在有效时间内不再去执行view中的操作,而是直接从内存或者Redis中之前缓存的内容拿到并返回。
通用设置:
- 1、设置中间件:
# settings.py
MIDDLEWARE = [
'django.middleware.cache.UpdateCacheMiddleware', # 必须设置在第一个位置
'django.middleware.cache.FetchFromCacheMiddleware', # 必须设置在最后一个位置
]
- 2、
CACHE_MIDDLEWARE_ALIAS = 'default' # 用来存储的缓存别名
CACHE_MIDDLEWARE_SECONDS = 0 # 所有页面默认缓存时间,默认600
# 关键的前缀,当多个站点使用同一个配置的时候,这个可以设置可以避免发生冲突,一般设置为网站域名
CACHE_MIDDLEWARE_KEY_PREFIX ='www.demo.com'
# 那么只有匿名的请求会被缓存,这是一个禁用缓存非匿名用户页面的最简单的做法,注意确保已经启用了Django用户认证中间件
CACHE_MIDDLEWARE_ANONYMOUS_ONLY = False
按照存储位置的六种缓存方式:
1、内存中缓存,内容以字符串形式存储在内存中, 但是位置无法确定,这个缓存是多进程和线程安全的:
# setting.py CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.locmem.LocMemCache', 'LOCATION': 'unique-snowflake', 'TIMEOUT': 300, # 缓存超时时间(默认300,None表示永不过期,0表示立即过期) 'OPTIONS': { 'MAX_ENTRIES': 300, # 最大缓存个数(默认300) 'CULL_FREQUENCY': 3, # 缓存到达最大个数之后,剔除缓存个数的比例,即:1/CULL_FREQUENCY(默认3) }, } }
2、文件中缓存,保存至指定的文件,注意是绝对位置(从根目录开始),必须保证服务器对你列出的路径具有读写权限:
CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache', 'LOCATION': '/var/tmp/django_cache', # 需要指定文件夹路径 } }
3、数据库中缓存:
# 先执行创建表命令 python manage.py createcachetable # 默认会创建my_cache_table,当然也可以指定缓存表 CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.db.DatabaseCache', 'LOCATION': 'my_cache_table', # 数据库表 } }
4、Memcache缓存(python-memcached模块)
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': [ # 支持简单的分布式,将数据分别存储在多个内存中, 防止其中一个缓存清空 '172.19.26.240:11211', '172.19.26.242:11211', ] } } CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache', 'LOCATION': 'unix:/tmp/memcached.sock', } }
按照缓存的使用范围分类:
- 1、全栈缓存
- url经过一系列的认证等操作,如果请求的内容在缓存中存在,则使用
FetchFromCacheMiddleware
获取内容并返回给用户 - 当返回给用户之前,判断缓存中是否已经存在,如果不存在则
UpdateCacheMiddleware
会将缓存保存至缓存,从而实现全站缓存。
CACHE_MIDDLEWARE_SECONDS = 5 # 连续多次请求,每隔5s就会进行数据库操作
- url经过一系列的认证等操作,如果请求的内容在缓存中存在,则使用
2、单独视图实现缓存,例如某些静态页面可以使用此方法:
# 方式一: from django.views.decorators.cache import cache_page # 参数为更新的时间(s) @cache_page(60 * 15) def my_view(request): ... # 方式二: from django.views.decorators.cache import cache_page urlpatterns = [ url(r'^foo/([0-9]{1,2})/$', cache_page(60 * 15)(my_view)), ]
- 3、页面的局部更新:
- 例如购物网站中商品信息和价格都需要要实时更新,但是剩余数量一般都需要实时更新。
- 利用模板局部缓存时候,请求会进行数据库相关操作,唯一不同的是,在更新时间内不会将数据渲染到模板中而已。
<!DOCTYPE html> # 在模板中导入内置的中间件 {% load cache %} <html lang="en"> <head> <meta charset="UTF-8"> <title>主页面</title> </head> <body> <h1>主界面</h1> {% cache 3 '局部刷新' %} {% for user in user_list %} {{ user.name }} {% endfor %} {% endcache %} </body> </html>
测试
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'handlers': {
'console':{
'level':'DEBUG',
'class':'logging.StreamHandler',
},
},
'loggers': {
'django.db.backends': {
'handlers': ['console'],
'propagate': True,
'level':'DEBUG',
},
}
}