缓存
缓存为了加快数据查询,也指其他可以加快数据读取的存储方式。一般用来存储临时数据,常用截止是读取速度快的内存。
缓存案例
from django.shortcuts import render
def index(request):
# 时间复杂度极高的渲染
books = Book.objects.all() #耗时2秒
return render(request,'index.html',locals())
缓存场景
1.博客列表页
2.电商商品详情页
场景特点:缓存的地方,数据变动频率较少
缓存配置
将缓存的数据存储在你的数据库中
说明,尽管存储截止没有更换,但是当一次负责查询的结果直接存储到表里,比如多条件查询。
- django-admin startporject
- 创建mysql数据库
- 修改settings.py配置,数据库、数据库缓存
空白位置
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的缓存数据
}
}
}
4.创建缓存表
python manage.py createcachetable
5.数据库迁移
python manage.py migrate
整体缓存策略
1.视图函数中使用缓存,要先引用缓存装饰器
from django.views.decorators.cache import cache_page
@cache_page(30) #30秒
def my_view(request):
2.在路由中也可以写
from django.views.decorators.cache import cache_page
urlpatterns = [
path('ad/',cache_page(30)(my_view)),
]
3.分别实现在路由、视图函数中使用缓存
3.1 url
from django.contrib import admin
from django.urls import path
from django.views.decorators.cache import cache_page
from . import views
urlpatterns = [
path('admin/', admin.site.urls),
path('test_cache/', views.test_cache), # 视图函数中使用缓存
path('cache_inurl/', cache_page(15)(views.test_cache_inurl)), # 路由中使用缓存
]
3.2 views.py
from django.http import HttpResponse
from django.views.decorators.cache import cache_page
import time
@cache_page(15)
def test_cache(request):
# 在视图函数中的调用缓存
t = time.time()
return HttpResponse('t is: %s'%(t))
def test_cache_inurl(request):
# 在路由中使用缓存
t = time.time()
return HttpResponse('t is: %s'%(t))
局部缓存策略
缓存api的使用
先引入cache对象
方法1:使用cache[‘CACHE配置key’]导入具体对象
from django.core.cache import caches
cache1 = caches['names']
cache2 = caches['alias']
方法2:
相当于直接引入了CACHES配置项中default项
from django.core.cache import cache
缓存API:
1.cache.set(key,value,timeout) 存储缓存
key:缓存key,字符串
value:python对象
timeout:缓存时间
返回值NONE
2.cache.get(key)获取缓存,如果没有返回none
eg
from django.core.cache import cache
cache.set('uuname','nicosleong',30)
cache.get('uuname')
数据库
3.cache.get_or_set(key,value,time)如果没有获取到数据,则执行set操作,返回值value
4.cache.set_many(dict,timeout)批量缓存
dict:key和value
timeout:存储时间(s)
返回值:插入不成功的key数组
5.cache.get_many(key_list)批量获取缓存数据
key_list包含key的数组
返回值:渠道key和value的字典
6.cache.delete(key)删除key的换成数据,返回值none
7.cache.delete_many(key_list)批量删除,返回值none
浏览器缓存策略
浏览器缓存分为强缓存和协商缓存
强缓存
一旦缓存,就不会向服务器发送请求,直接调用缓存资源。
1.响应头 - Expires
定义:缓存过期时间,用来指定资源到期的时间,是服务端的具体时间点
2.响应头 - Cache-Control
在http1.1中,Cache-Control主要用于控制网页缓存,比如当‘Cache-Control:max-age=120’代表请求创建时间120秒,缓存失效。目前服务器都会带两个头相应给浏览器,浏览器优先使用Cache-Control。
这两个头都是通过cache_page加进去的。
协商缓存
对于一些静态文件,大图片。
强缓存到期后,启用协商缓存,浏览器给服务器协商当前缓存是否可以继续使用。避免缓存到期就重新请求下载大文件浪费贷款。
1.Last-Modified响应头
说明:最近修改时间,浏览器第一次请求静态文件,服务器返回Last-Modified响应头,代表该资源需要协商缓存。
当缓存到期后,浏览器获取到Last-Modified作为请求头if-Modified-Since的值,与服务器发请求协商,服务端返回304响应(响应体空),代表缓存继续使用,200响应码代表缓存不可用(相应体为最新的资源)
本项通过文件修改时间来校验缓存是否可用
2.Etag响应头额if-None-Match请求头
说明:
Etag是服务器相应请求时,返回当前资源文件的一个唯一标志(服务器生成),只要资源有变化,Etag就会重新生成。缓存到期后,浏览器将Etag响应头的值作为if-None-Match请求头的值,给服务器协商,服务器接到后,比对文件标识,不一致则资源不可用,返回200响应(响应体为最新资源),如果一直则可用,返回304响应码。
本项是在缓存到期后,通过比对文件一致性来检验缓存是否可用
两种检验模式:通过时间校验,准确性不如Etag,但是Etag必经要计算文件hash值,增加计算负担和耗时