缓存的出现就是为了减轻对数据库的压力和加快内存访问的速度.我们的访问请求最终都是返回一个大的字符串,缓存就是将这段字符串直接存储起来,下次你来了,不用经过view去数据库或者内存拿到数据再渲染返回,而是直接从缓存里把上次的字符串交给你,很大的提高了速度,一般我们会将持久不变的,访问量大的数据放到缓存.(比如说一篇好的博客,很多人看,但是作者又不修改),实时性很高的不放缓存,比如博客访问量.
Django自带缓存,提供了6中存储模式:
- 开发调试
- 内存
- 文件
- 数据库
- Memcache缓存(python-memcached模块)
- Memcache缓存(pylibmc模块)
每种存储模式只需要修改配置就可以了,其他早django中的操作都是一样,
我们先来看配置,写在django settings.py里面就ok:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 # 此为开始调试用,实际内部不做任何操作 2 # 配置: 3 CACHES = { 4 'default': { 5 'BACKEND': 'django.core.cache.backends.dummy.DummyCache', # 引擎 6 'TIMEOUT': 300, # 缓存超时时间(默认300,None表示永不过期,0表示立即过期) 7 'OPTIONS':{ 8 'MAX_ENTRIES': 300, # 最大缓存个数(默认300) 9 'CULL_FREQUENCY': 3, # 缓存到达最大个数之后,剔除缓存个数的比例,即:1/CULL_FREQUENCY(默认3) 10 }, 11 'KEY_PREFIX': '', # 缓存key的前缀(默认空) 12 'VERSION': 1, # 缓存key的版本(默认1) 13 'KEY_FUNCTION' 函数名 # 生成key的函数(默认函数会生成为:【前缀:版本:key】) 14 } 15 } 16 17 18 # 自定义key函数 19 def default_key_func(key, key_prefix, version): 20 """ 21 Default function to generate keys. 22 23 Constructs the key used by all other methods. By default it prepends 24 the `key_prefix'. KEY_FUNCTION can be used to specify an alternate 25 function with custom key making behavior. 26 """ 27 return '%s:%s:%s' % (key_prefix, version, key) 28 29 def get_key_func(key_func): 30 """ 31 Function to decide which key function to use. 32 33 Defaults to ``default_key_func``. 34 """ 35 if key_func is not None: 36 if callable(key_func): 37 return key_func 38 else: 39 return import_string(key_func) 40 return default_key_func
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 # 此缓存将内容保存至内存的变量中 2 # 配置: 3 CACHES = { 4 'default': { 5 'BACKEND': 'django.core.cache.backends.locmem.LocMemCache', 6 'LOCATION': 'unique-snowflake', 7 } 8 } 9 10 # 注:其他配置同开发调试版本
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 # 此缓存将内容保存至数据库 2 3 # 配置: 4 CACHES = { 5 'default': { 6 'BACKEND': 'django.core.cache.backends.db.DatabaseCache', 7 'LOCATION': 'my_cache_table', # 数据库表 8 } 9 } 10 11 # 注:执行创建表命令 python manage.py createcachetable
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
# 此缓存将内容保存至文件 # 配置: CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache', 'LOCATION': '/var/tmp/django_cache', } } # 注:其他配置同开发调试版本
应用:
Django提供的缓存支持
- 单独的页面缓存
- 页面局部缓存
- 全局缓存
1单独的views缓存,存储位置设置为文件
Django settings.py 里面配置:
CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache', 'LOCATION': os.path.join(BASE_DIR,'caches'),#cache的存储位置 } }
views:
from django.shortcuts import render from django.views.decorators.cache import cache_page @cache_page(10) # 导入模块后加上装饰器就就完成了单独的页面缓存 import time def cache001(req): t=time.time() return render(req,'cache001.html',{'time':t})
#这里用了一个动态的时间来验证是否缓存
#结果就是第一次发起请求后,整个页面的返回字符串存储到了文件位置,再次访问的时候直接读取到了文件里面的内容返回,所以时间在缓存生命周期里面是不会改变的
页面局部的缓存
很多时候我们页面只需要一些数据缓存:
settings..py 配置,用了数据库
CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.db.DatabaseCache', 'LOCATION': 'my_cache_table', # 数据库表 } } #写在sttings里面后执行下, python manage.py createcachetable ,就能再数据库中找到表了
局部缓存是写在HTML中的:
#HTNL {% load cache %}#加载cache <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <p>{{ time }}</p> {% cache 5000 mycacher %} #5000代表超时时间, mycacher代表缓存的key, {{ time }} #需要缓存的内容 {% endcache %} </body> </html>
当我么你发起请求后,数据库缓存表就多了点东西了:
全局缓存:
这次我们将缓存储存在内存里面,形式会是key value格式,所以会制定一个key:
CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.locmem.LocMemCache', 'LOCATION': 'lglgl',#制定一个内存缓存的引用 } }
全局缓存会利用到我们的中间件,在settings middleware中加上下面2个中间件:
MIDDLEWARE = [ 'django.middleware.cache.UpdateCacheMiddleware',#-----放在最前面,用于储存缓存 # 其他中间件... 'django.middleware.cache.FetchFromCacheMiddleware',#----放在最后面,用于获取缓存 ]
搞定.这就是django 提供的3中缓存方式和集中存储地方,应该说是很强大了.