Django-23 缓存
- 定义:缓存是一类可以更快的读取数据的介质统称,也指其他可以加快数据读取的存储方式。一般用来存储临时数据,常用介质的是读取速度很快的内存
- 意义:视图渲染有一定成本,数据库的频繁查询过高;所以对于低频变动的页面可以考虑使用缓存技术,减少实际渲染次数;用户拿到响应的时间成本会更低
- 优化思想:
given a URL, try finding that page in the cache
if the page is in the cache:
return the cached page
else:
generate the page
save the generated page in the cache (for next time)
return the generated page
Django中设置缓存
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的缓存数据
}
}
}
数据缓存到服务器内存中
CACHES = {
'default':{
'BACKEND':'django.core.cache.backends.locmen.LocMemCache',
'LOCATION':'unique-snowflake'
}
}
数据缓存到本地文件中
CACHES = {
'default':{
'BACKEND':'django.core.cache.backends.filebased.FileBasedCache',
'LOCATION':'/var/tmp/django_cache',#这个是文件夹的路径
# 'LOCATION':'c:\test\cache',#windows下示例
}
}
创建缓存表
python3 manage.py createcachetable
整体缓存策略
方式一:在视图函数里,用装饰器的方式写
from django.views.decorators.cache import cache_page
@cache_page(30) -> 单位s
def my_view(request):
...
方式二:在路由里写
from django.views.decorators.cache import cache_page
urlpatterns = [
path('foo/',cache_page(60)(my_view)),
]
示例:间隔10s后再请求更新缓存
from django.shortcuts import render
from django.http import HttpResponse
import time
from django.views.decorators.cache import cache_page
# Create your views here.
@cache_page(10)
def test_cache(request):
t = time.time()
return HttpResponse('t is %s'%(t))
局部缓存策略
缓存api的使用
先引入cache对象
方式一:使用caches[’CACHE配置key‘]导入具体对象
from django.core.cache import caches
cache1 = caches['myalias']
cache2 = caches['myalias_2']
方式二:
from django.core.cache import cache 相当于直接引入CACHE配置项中的'default'项
1. cache.set(key,value,timeout) - 存储缓存
- key:缓存的key,字符串类型
- value:python对象
- timeout:缓存存储时间(s),默认为CACHES中的TIMEOUT值
- 返回值:None
2. cache.get(key) - 获取缓存
- key:缓存的key,字符串类型
- 返回值:为key的具体值,如果没有数据,则返回None
3. cache.add(key,value) - 存储缓存,只在key不存在时生效
- 返回值:True[存储成功] or False[存储失败]
4. cache.get_or_set(key,value,timeout) - 如果未获取到数据,则执行set操作
- 返回值:value
5. cache.set_many(dict,timeout) - 批量存储缓存
- dict:key和value的字典
- timeout:存储时间(s)
- 返回值:插入不成功的key的数组
浏览器缓存策略
浏览器缓存策略.png强缓存
不会向服务器发送请求,直接从缓存中读取资源
- 1,响应头 - Expires(绝对时间)
定义:缓存过期时间,用来指定资源到期的时间,是服务器端的具体的时间
样例:Expires:Thu,02 Apr 2030 05:14:18 GMT - 2,响应头 - Cache-Control(相对时间)
在HTTP/1.1中,Cache-Control主要用于控制网页缓存。比如当Cache-Control:max-age=120,代表请求创建时间后的120秒,缓存失败
说明:目前服务器都会带着这两个头同时响应个浏览器,浏览器优先使用Cache-Control
协商缓存
强缓存中的数据一旦过期,还需要跟服务器进行通信,从而获取最新数据;思考?如果强缓存的数据是一些静态文件,大图片等;
解答:考虑到大图片这类比较费宽带且不易变化的数据,强缓存时间到期后,浏览器会去跟服务器协商,当前缓存是否可用,如果可用,服务器不必返回数据,浏览器继续使用原来缓存的数据,如果文件不可用,则返回最新数据。
-
1,Last-Modified响应头和If-Modified-Since请求头
说明:
1,Last-Modified为文件的最近修改时间,浏览器第一次请求静态文件时,服务器如果返回Last-Modified响应头,则代表该资源为需协商的缓存。
2,当缓存到期后,浏览器将获取到的Last-Modified值作为请求头If-Modified-Since的值,与服务器发请求协商,服务端返回304响应码[响应体为空],代表缓存继续使用,200响应码代表缓存不可用[响应体为最新资源] -
2,ETag响应头 和 If-None-Match请求头
说明
1,Etag是服务器响应请求时,返回当前资源文件的一个唯一标示(由服务器生成),只要资源有变化,Etag就会重新生成;
2,缓存到期后,浏览器将Etag响应头的值作为If-None-Match请求头的值,给服务器发请求协商;服务器接到请求后,比对文件标识,不一致则认为资源不可用,返回200响应码[响应体为最新资源];可用则返回304响应码。