20.-缓存
一、缓存
1.定义:缓存是一类可以更快读取数据的介质统称,也指其它可以加快数据读取的方式,一般用来存储临时数据,常用介质的是读取速度更快的内存
2.意义:视图渲染有一定的成本,数据库的频繁查询过高,对于低频变动的页面可以考虑缓存技术,减少实际渲染的耗时,用户拿到响应的时间成本更低
3.分类: 整体缓存、局部缓存、
4.缓存逻辑: 如果有缓存,则取缓存数据,没有缓存,则先走视图,并且将数据存到缓存
二、Django中设置缓存-数据库缓存
# 缓存 # 缓存配置的数据库表需要用python命令创建出来 1.CACHES配置 2.命令创建LOCATION对应的数据表 # python3 manage.py createcachetable 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的缓存数据 }, # 本地缓存 'local': { 'BACKEND': 'django.core.cache.backends.locmem.LocMemCache', 'LOCATION': 'unique-snowflask' }, # 将缓存数据存在到本地文件夹 'file': { 'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache', 'LOCATION': 'var/tmp/django_cache' #文件夹的路径 } } }
三、Django中使用缓存-整体缓存
1.视图中
#导包引入缓存装饰器 cache_page from django.views.decorators.cache import cache_page @cache_page(30) #缓存有效期:单位s def my_view(request): pass
2.路由中
#导包引入缓存装饰器 cache_page from django.views.decorators.cache import cache_page urlpatterns = [ path('rote/',cache_page(60))(my_view)), ]
四、Django中使用缓存-局部缓存
引入
# 方式1:使用caches['CACHE配置key']导入具体对象 from django.core.cache.cache impost caches my_cache = caches[' setting_key '] # 参数为setting里缓存配置的定义的要使用对应缓存配置的key # 方式2:使用cache 引入默认配置 from django.core.cache impost cache #相当于直接引入了CACHES配置项中的default项
set存储缓存
cache.set(key,value,timeout) # 存储缓存 # key:缓存的key,字符串类型 # value:python对象 # timeout:缓存存储时间(s),默认为CACHES中TIMEOUT值 # 返回值:None
get获取缓存
cache.get(key) # 获取缓存 #key:缓存的key #返回值:为key的具体值,如果没有数据,则返回None
add存储缓存
cache.add(key,value) #存储缓存-只在key不存在时生效 #返回值:True[存储成功] / False[存储失败]
cache.get_or_set尝试获取/存储缓存
cache.get_or_set(key,value,timeout) #先get获取key,如果获取不到,则执行set存储value #如果未获取到数据,则执行set操作 #返回值:value
cache.set_many批量存储缓存
cache.set_many(dict,timeout) # 批量存储缓存 #dict:key和value的字典 #返回值:插入不成功的key的数组
cache.get_many批量获取缓存数据
cache.get_many(key_list) # 批量获取缓存数据 #key_list:包含key的数组 #返回值:取到的key和value的字典
cache.delete删除缓存
cache.delete(key) #删除key的缓存数据 #返回值:None
cache.delete_many批量删除
cache.delete_many(key_list) #批量删除 #包含key的数组 #返回值:None
五、浏览器缓存策略
缓存的定义
浏览器也具备缓存技术,对于浏览器来说,每次向服务器发出请求都是耗时的操作,如果本身浏览器内部就具备当前Url的内容,则一定时间内可以不给服务器发消息,从而提升网民体验,降低服务器缓存压力
六、浏览器缓存-强缓存
不会向服务器发送请求,直接从缓存中读取资源
1.响应头-Expires
定义:缓存过期时间,用来指定缓存到期的时间,是服务器端具体的时间点
样例:Expires:Thu,02 Apr 2030 05:14:18 GMT
2.响应头-Cache-Control
在http/1.1中,Cache-Control主要用于控制网页缓存,比如当Cache-Control:max-age=120 代表请求创建时间后的120s,缓存失效
说明:目前服务器都会带着这两个头同时响应给浏览器,浏览器优先使用Cache-Control
3.强缓存中的数据一旦过期,还需要跟服务器进行通信,从而获取最新的数据
七、浏览器缓存-协商缓存
Q:如果强缓存的数据是一些静态文件、大图片等
A:考虑大图片这类笔记费带宽且不易变化的数据,强缓存时间到期后,浏览器会去跟服务器协商,当前缓存是否可用,如果可用,服务器不必返回数据,浏览器继续使用原来缓存的数据,如果文件不可用,则返回最新数据
last-modified响应头和if-modified-since请求头
1.last-modified为文件的最近修改时间,浏览器第一次请求静态文件时,服务器如果返回last-modified的响应头,则代表该资源为需要协商的缓存
2.当缓存到期后,浏览器将获取的last-modeified值做为请求头if-modified-since的值,与服务器发请求协商,服务端返回304码[响应头为空]
代表缓存继续使用,200响应码代表缓存不可用[响应体为最新资源]
ETag响应头和if-None-Match请求头
1.etag是服务器响应请求时,返回当前资源文件的唯一一个标识(由服务器生成),只要资源有变化,Etag就会重新生成
2.缓存到期后,浏览器将ETag响应头的值做为if-none-Match请求头的值,发给服务器发请求协商,服务器接到请求头后,
比对文件标识,不一致则认为资源不可用,返回200响应码[响应体为最新资源],可用则返回304响应
风月都好看,人间也浪漫.