Django-缓存
Django缓存
缓存系统工作原理:
对于给定的网址,尝试从缓存中找到网址,如果页面在缓存中,直接返回缓存的页面,如果缓存中没有,一系列操作(比如查数据库)后,保存生成的页面内容到缓存系统以供下一次使用,然后返回生成的页面内容。
缓存的作用
- 提升服务器响应速度
- 将执行过的操作数据存储下来,在一定的时间内,再次获取数据的时候,直接从缓存中获取
- 比较理想的方案,缓存使用内存级缓存
- Django内置缓存框架
缓存框架的核心目标:
-
较少的代码
-
缓存应该仅可能快
-
因此围绕缓存后端的所有代码应该保存在绝对最小值,特别是对于获取操作
-
-
一致性
-
缓存Api应该是提供跨域不同缓存后端的一致接口
-
-
可扩展性
-
基于开发人员的需求,缓存api应该可以在应用程序级别进行扩展
-
Django内置的缓存:
1、开发调试缓存
2、内存缓存
3、文件缓存
4、数据库缓存
5、缓存到redis
Django settings 中 cache 默认为
{ 'default': { 'BACKEND': 'django.core.cache.backends.locmem.LocMemCache', } }
也就是默认利用本地的内存来当缓存,速度很快。当然可能出来内存不够用的情况,其它的一些内建可用的 Backends 有利用文件系统来缓存:
CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.locmem.LocMemCache', # 指定缓存使用的引擎 'LOCATION': 'unique-snowflake', # 写在内存中的变量的唯一值 'TIMEOUT':300, # 缓存超时时间(默认为300秒,None表示永不过期) 'OPTIONS':{ 'MAX_ENTRIES': 300, # 最大缓存记录的数量(默认300) 'CULL_FREQUENCY': 3, # 缓存到达最大个数之后,剔除缓存个数的比例,即:1/CULL_FREQUENCY(默认3) } } }
利用数据库来缓存,利用命令创建相应的缓存表:
python manage.py createcachetable cache_table_name CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.db.DatabaseCache', # 指定缓存使用的引擎 'LOCATION': 'cache_table', # 数据库表 'OPTIONS':{ 'MAX_ENTRIES': 300, # 最大缓存记录的数量(默认300) 'CULL_FREQUENCY': 3, # 缓存到达最大个数之后,剔除缓存个数的比例,即:1/CULL_FREQUENCY(默认3) } } }
缓存的力度:
-
全站缓存 来的请求所需要的所有数据全部缓存
-
单页面缓存 单独一个页面所需的数据缓存起来
-
局部缓存 页面中某个位置的数据缓存起来
下面用一些实例来说明如何使用 Django 缓存系统
一般来说我们用 Django 来搭建一个网站,要用到数据库等。
from django.shortcuts import render def index(request): # 读取数据库等 并渲染到网页 # 数据库获取的结果保存到 queryset 中 return render(request, 'index.html', {'queryset':queryset})
像这样每次访问都要读取数据库,一般的小网站没什么问题,当访问量非常大的时候,就会有很多次的数据库查询,肯定会造成访问速度变慢,服务器资源占用较多等问题.
1.1、单页面的缓存:在视图函数上加上一个装饰器即可
from django.views.decorators.cache import cache_page import time @cache_page(10) # 设置超时时间 def test(request): ctime = time.time() return render(request,'test.html',locals())
需要注意,在settings里配置一下:
CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache', # 指定缓存使用的引擎 'LOCATION': 'C:\cache_location', # 指定缓存的路径 'TIMEOUT': 300, # 缓存超时时间(默认为300秒,None表示永不过期) 'OPTIONS': { 'MAX_ENTRIES': 300, # 最大缓存记录的数量(默认300) 'CULL_FREQUENCY': 3, # 缓存到达最大个数之后,剔除缓存个数的比例,即:1/CULL_FREQUENCY(默认3) } } }
1.2 cbv下实现单页面缓存
from django.utils.decorators import method_decorator from django.views.decorators.cache import cache_page import time @method_decorator(cache_page(5),name='dispatch') class ShowTime(APIView): def get(self,request): ctime = time.strftime('%Y-%m-%d %H:%M:%S') return render(request,'show_time.html',{'ctime':ctime})
2、局部缓存
from django.core.cache import cache import time def test(request): ctime = time.time() return render(request,'test.html',{'time':ctime})
虽然与单页面的settings配置是一样的,但在模板文件里存在一定的差异性。
templates:
{% load cache %} {{ time }} #这部分的内容没有被缓存 {% cache 5 'test'%} #第一个参数表示缓存时间,第二个参数是key值(取缓存的时候,需要根据key值取) 当前时间:{{ time }} # 这部分的数据被缓存 {% endcache %}
3、全站缓存
需要在settings里配置两个中间件,一个在最上方,一个在最下方
同时还需要配置超时时间,同样在settings里配置 CACHE_MIDDLEWARE_SECONDS = 5 超时时间设定为5秒 需要注意:不需要配置CACHES了!
缓存的高级用法: 对于前后端分离的项目: cache.set('test_data',{'name':'michael','age':18},5) #对应的key为 test_data,数据位字典里的数据,超时时间为5秒 cache.get('test_data') # 取对应的缓存数据
当使用了cache后,访问情况变成了如下:
访问一个网址时, 尝试从 cache 中找有没有缓存内容
如果网页在缓存中显示缓存内容,否则生成访问的页面,保存在缓存中以便下次使用,显示缓存的页面。
给定一个URL,尝试在缓存中找到该页面
if 页面在缓存中:
返回缓存的页面
else:
生成页面
将生成的页面保存在缓存中(以备下次使用)
返回生成的页面
Memcached 是目前 Django 可用的最快的缓存,另外,Django 还可以共享缓存,一般我们只会使用Memcached 缓存或者数据库redis缓存。