Django缓存

缓存

缓存为了加快数据查询,也指其他可以加快数据读取的存储方式。一般用来存储临时数据,常用截止是读取速度快的内存。

缓存案例

from django.shortcuts import render
def index(request):
	# 时间复杂度极高的渲染
	books = Book.objects.all() #耗时2秒
	return render(request,'index.html',locals())

缓存场景
1.博客列表页
2.电商商品详情页
场景特点:缓存的地方,数据变动频率较少

缓存配置

将缓存的数据存储在你的数据库中
说明,尽管存储截止没有更换,但是当一次负责查询的结果直接存储到表里,比如多条件查询。
在这里插入图片描述

  1. django-admin startporject
  2. 创建mysql数据库
  3. 修改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值,增加计算负担和耗时

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

银行上班的法学程序猿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值