定义
缓存是一类可以更快的读取数据的介质统称,也指其它可以加快数据读取的存储方式。一般用来存储临时数据,常用介质是读取速度很快的内存
视图的渲染有一定的成本,数据库的频繁查询过高;所以对于低频变动的页面可以考虑使用缓存技术,减少实际渲染次数;用户拿到的响应的时间成本会更低
缓存设置
数据库缓存
虽然仍是数据库,但是当把一次查询的结果储存到表里,比如多个条件的过滤查询结果,可避免重复进行复杂查询,提升效率。
设置:
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.db.DatabaseCache', # 引擎 这里用数据库引擎
'LOCATION': 'my_cache_table', # 数据表的名字
'TIMEOUT': 300, # 缓存保存时间,单位秒,默认值300
'OPTIONS': {
'MAX_ENTRIES': 300, # 缓存的最大数据条数
'CULL_FREQUENCY': 2, # 缓存条数达到最大值时,删除1/x的缓存数据
}
}
}
python mange.py createcachetable创建数据表
内存缓存
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
'LOCATION': 'unique-snowflake', # 内存地址寻址,雪花算法
}
}
文件缓存
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache',
'LOCATION': '/var/tem/django_cache', # 文件夹的路径
}
}
Redis缓存
后面在加
Django中使用缓存
整体缓存策略
将整个视图整体存到缓存中
- 方法1:
from django.views.decorators.cache import cache_page @cache_page(30) # 单位是秒,以装饰器的形式使用 def my_view(request): pass
- 方法2:
# 路由中使用 path('foo/', cache_page(60)(my_view)),
局部缓存策略
缓存API的使用
方法1:使用caches[‘CACHE配置key’]导入具体对象
from django.core.cache import caches
cache1 = caches['default'] # 在settings.py中设置cache是不一定只设置一个default还可以设置别的 在这里就可以引用
方法2:
from django.core.cache import cache
# 引用cache不是caches,这样相当于直接引入CACHES配置项中的default
设置缓存
-
cache.set(key,value,timeout) # 存储缓存
- key:缓存的key,字符串
- value:python对象
- timeout:缓存存储时间,默认为CACHES中的timeout值
- 返回值:None
-
cahce.get(key) # 取缓存
有数据返回数据,没有返回None -
cache.add(key,value)
存储缓存,只有key不存在时生效
返回:True成功,False失败 -
cache.get_or_set(key,value,timeout) - 如果未取到数据,则执行set操作
返回value -
cache.set_many(dict,timeout)
批量存储缓存
返回:插入不成功的key的数组 -
cache.get_many(key_ist)
key_list:包含key的数组
返回:取到的key和value的字典 -
cache.delete(key)
删除key的缓存数据
返回None -
cache.delete_many(key_list)
返回None
浏览器缓存策略
强缓存
不会向服务器发送请求,直接从缓存中读取资源
- 响应头 -Expires
定义:缓存过期时间,用来指定资源到期的时间,是服务器端的具体时间
样例:Thu,02,Apr 2030 05:14:08 GMT - 响应头 - Cache-Control
在http/1.1中,cache-control 主要用于控制网页缓存,比如当‘ Cache-Control:max-age = 120’代表请求创建时间后的120秒,缓存失效
说明:目前服务器都会带着这两个头同时响应给浏览器,浏览器优先使用cache-control。我们使用全局缓存策略时Django会自动帮我们设置这两个响应头,使用局部缓存策略是要手动设置
协商缓存
强缓存中的数据一旦过期,还需要跟服务器进行通信,从而获得最新数据
但是一些静态文件,大图片占用带宽太大,所以使用另一种策略协商缓存:
考虑到大图片这类比较费带宽且不易变化的数据,强缓存时间到期都,浏览器会去跟服务器协商,当前缓存是否可用,如果可用,服务器不必返回数据,浏览器继续使用原来缓存的数据,如果不可用,返回最新数据
两种方法:
- Last-Modified响应头和If-Modified-Since请求头
这个方法不太好,因为是以时间作为判断标准的,而且单位是S,有的时候在1s内文件可能会发生改变,这样就无法把最新资源发出去说明: 1. Last-Modified响应头为文件最近修改时间,浏览器第一次请求静态资源时,服务器如果返回Last-Modified响应头,则表示该资源为协商缓存的资源 2. 当缓存到期后,浏览器将获取到 Last-Modified值作为请求头If-Modified-Since的值,与服务器协商,服务器返回304响应码[响应体为空],代表缓存继续使用,200响应码代表缓存不可用[响应体为最新资源]
- ETag响应头和If-None-Match请求头
说明: 1. ETag是服务器响应请求是,返回当前资源文件的唯一标识(服务器生成),只要资源变化,ETag就会重新生成 2. 当缓存到期后,浏览器将获取到 ETag值作为请求头If-None-Match的值,与服务器协商,服务器返回304响应码[响应体为空],代表缓存继续使用,200响应码代表缓存不可用[响应体为最新资源]