缓存的定义
文章目录
- 定义
- 缓存是一类可以更快的读取数据的介质统称,也指其它可以加快数据读取的存储方式。一般用来存储临时数据,常用介质的是读取速度很快的内存
- 意义
- 视图渲染有一定成本,数据库的频繁查询过高,所以对于低频变动的页面可以考虑使用缓存技术,减少实际渲染次数;用户拿到响应的时间成本会更低
- 优化思想 - 生肉
- 在我们想要打开长时间页面的时候我们先去数据库找一下缓存区有没有,如果没有的时候我们再去数据库寻找
案例
from django.shortcuts import render
def index(request):
# 时间复杂度极高的渲染
book_list = Book.objects.all() # 假设此处耗时2s,
# 因为这个地方在耗时,所以不会执行 return 用户迟迟拿不到界面
return render(request, "index.html", locals())
设置缓存 - 数据库缓存
将所有的缓存都存储在您的数据库中
- 说明
- 尽管存储介质没有更换,但是当把一次负责查询的结果直接存储到表里,比如多个条件的过滤查询结果,可避免重复进行复杂查询,提升效率;
# 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的缓存,比如此处删除二分之一的数据
}
}
}
把缓存存到内容
把数据缓存到服务器的内存当中
CACHES = {
"default":{
# LocMemCache 本地缓存
"BACKEND" : "django.core.cache.backends.locmem.LocMemCache",
"LOCATION": "unique-snowflake"
}
}
把缓存存到本地文件内
CACHES = {
"default":{
# LocMemCache 本地缓存
"BACKEND" : "django.core.cache.backends.filebased.FileBasedCache",
"LOCATION": "/var/tmp/django_cache" # 这个是文件夹的路径
# WINDOWS 下 'C;\test\cache'
}
}
整体缓存
在视图函数内使用
# views.py 文件内
import time
from django.views.decorators.cache import cache_page
from django.http import HttpResponse
# 我们的 cache_page 修饰整个函数,单位是秒
@cache_page(30)
def my_view(request):
t = time.time()
return HttpResponse("t is %s" %(t))
在路由内使用
from django.views.decorators.cache import cache_page
from . import views
urlpatterns = [
path('foo/', cache_page(60)(views.my_view))
]
局部缓存
缓存 API 的导入
-
先引入 cache 对象
-
方式1:
-
使用
caches[“CACHE配置KEY”]导入具体对象
-
from django.core.cache import caches cache1 = caches['myalias'] cache2 = caches['myalias_2']
-
-
方式2:
-
导入CACHES配置选项中的
defalut
项 -
from django.core.cache import cache
-
-
缓存的设置 SET
-
cache.set(key, value, timeout)
- 给我们名为 key 的缓存设置一个值
- key: 缓存的key,字符串类型
- timeout:缓存的储存时间,默认为 CACHES 中的 TIMEOUT 值
- 返回 None
-
cache.get_or_set(key, value, timeout)
- 如果未获取到数据 则执行set操作
- 返回值 value
-
cache.set_many(dict, timeout)
- 批量设置缓存
- dict: key 和 value 的字典
- timeout 存储时间
- 返回值:插入不成功的 key 的数组
获取缓存 Get
-
cache.get(key) 获取缓存
- key: 缓存的 key
- 返回值: key 的具体值,如果没有数据就返回None
-
cache.get_many(key_list)
- 批量获取缓存数据
- key_list 包含 key 的数组
- 返回值 取到的 key 和 value 的字典
缓存添加 add
-
此方法仅在 key 不存在的时候生效
-
cache.add(key, value)
- 返回值: True(存储成功) / False(存储失败)
缓存删除 delete
-
cache.delete(key)
- 删除 key 的缓存数据
- 返回值:None
-
cache.delete_many(key_list)
- 批量删除
- 返回值 None
浏览器缓存
- 不会向服务器发送请求,直接从缓存中读取资源
-
响应头- Expires
-
定义:缓存过期时间,用来指定资源到期的时间,是服务器端的具体的时间点
-
样例: Expires:Thu, 02 Apr 2030 05:14:08 GMT
-
-
响应头- Cache-Control
-
在HTTP/1.1中,Cache-Control主 要用于控制网页缓存。比如当Cache-Control:max-
age=120代表请求创建时间后的120秒,缓存失效 -
说明:目前服务器都会带着这两个头同时响应给浏览器,浏览器优先使用
Cache-Control
-
- 一般情况下我们响应头两个都会带上
协商缓存
强缓存中的数据一旦过期,还需要跟服务器进行通信,从而获取最新数据;
思考?
- 如果强缓存的数据是一些静态文件,大图片等
解答:考虑到大图片这类比较费带宽且不易变化的数据,强缓存时间到期后
浏览器会去跟服务器协商,当前缓存是否可用,如果可用,服务器不必返
回数据,浏览器继续使用原来缓存的数据,如果文件不可用,则返回最新数
据
Last-Modified响应头和If-Modified-Since请求头
说明:
Last-Modified
为文件的最近修改时间,浏览器第一次请求静态文件时,服务器如果返回Last-Modified
响应头,则代表该资源为需协商的缓存- 当缓存到期后,浏览器将获取到的
Last-Modified
值做为请求头lf-Modified-Since
的值,与服务器发请求协商,- 服务端返回304响应码[响应体为空],代表缓存继续使用
- 200响应码 代表缓存不可用[响应体为最新资源]
ETag响应头和If-None-Match请求头
说明:
- Etag是服务器响应请求时,返回当前资源文件的一个唯一标识(由服务器生成),只要资源有变化,Etag就会重 新生成;
- 我们服务器对资源都进行哈希算值,然后浏览器比对我们的值是否发生改变
- 缓存到期后,浏览器将ETag响应头的值做为|f- None-Match请求头的值,给服务器发请求协商;服务器接到请求头后,比对文件标识,不一致则认为资源不可用,返回200响应码[响应体为最新资源];可用则返回304响应码