Django-缓存

本文介绍了Django中的缓存机制,包括定义、缓存设置(数据库缓存、内存缓存、文件缓存和Redis缓存)、整体及局部缓存策略在Django中的应用,以及浏览器缓存策略,如强缓存和协商缓存的工作原理。
摘要由CSDN通过智能技术生成

定义

缓存是一类可以更快的读取数据的介质统称,也指其它可以加快数据读取的存储方式。一般用来存储临时数据,常用介质是读取速度很快的内存

视图的渲染有一定的成本,数据库的频繁查询过高;所以对于低频变动的页面可以考虑使用缓存技术,减少实际渲染次数;用户拿到的响应的时间成本会更低

缓存设置

数据库缓存

虽然仍是数据库,但是当把一次查询的结果储存到表里,比如多个条件的过滤查询结果,可避免重复进行复杂查询,提升效率。
设置:

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的缓存数据
        }
    }
}

python mange.py createcachetable创建数据表

内存缓存
CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.locmem.LocMemCache', 
        'LOCATION': 'unique-snowflake',  # 内存地址寻址,雪花算法
         }
}
文件缓存
CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache', 
        'LOCATION': '/var/tem/django_cache',  # 文件夹的路径
                 }
}
Redis缓存

后面在加

Django中使用缓存

整体缓存策略

将整个视图整体存到缓存中

  • 方法1:
    from django.views.decorators.cache import cache_page
    @cache_page(30)  # 单位是秒,以装饰器的形式使用
    def my_view(request):
    	pass
    
    • 方法2:
    # 路由中使用
    path('foo/', cache_page(60)(my_view)),
    
局部缓存策略

缓存API的使用
方法1:使用caches[‘CACHE配置key’]导入具体对象

from django.core.cache import caches
cache1 = caches['default']  # 在settings.py中设置cache是不一定只设置一个default还可以设置别的 在这里就可以引用

方法2:

from django.core.cache import cache
# 引用cache不是caches,这样相当于直接引入CACHES配置项中的default

设置缓存

  1. cache.set(key,value,timeout) # 存储缓存

    • key:缓存的key,字符串
    • value:python对象
    • timeout:缓存存储时间,默认为CACHES中的timeout值
    • 返回值:None
  2. cahce.get(key) # 取缓存
    有数据返回数据,没有返回None

  3. cache.add(key,value)
    存储缓存,只有key不存在时生效
    返回:True成功,False失败

  4. cache.get_or_set(key,value,timeout) - 如果未取到数据,则执行set操作
    返回value

  5. cache.set_many(dict,timeout)
    批量存储缓存
    返回:插入不成功的key的数组

  6. cache.get_many(key_ist)
    key_list:包含key的数组
    返回:取到的key和value的字典

  7. cache.delete(key)
    删除key的缓存数据
    返回None

  8. cache.delete_many(key_list)
    返回None

浏览器缓存策略

在这里插入图片描述

强缓存

不会向服务器发送请求,直接从缓存中读取资源

  1. 响应头 -Expires
    定义:缓存过期时间,用来指定资源到期的时间,是服务器端的具体时间
    样例:Thu,02,Apr 2030 05:14:08 GMT
  2. 响应头 - Cache-Control
    在http/1.1中,cache-control 主要用于控制网页缓存,比如当‘ Cache-Control:max-age = 120’代表请求创建时间后的120秒,缓存失效
    说明:目前服务器都会带着这两个头同时响应给浏览器,浏览器优先使用cache-control。我们使用全局缓存策略时Django会自动帮我们设置这两个响应头,使用局部缓存策略是要手动设置
协商缓存

强缓存中的数据一旦过期,还需要跟服务器进行通信,从而获得最新数据
但是一些静态文件,大图片占用带宽太大,所以使用另一种策略协商缓存:
考虑到大图片这类比较费带宽且不易变化的数据,强缓存时间到期都,浏览器会去跟服务器协商,当前缓存是否可用,如果可用,服务器不必返回数据,浏览器继续使用原来缓存的数据,如果不可用,返回最新数据

两种方法:

  1. Last-Modified响应头和If-Modified-Since请求头
    说明:
    	1.  Last-Modified响应头为文件最近修改时间,浏览器第一次请求静态资源时,服务器如果返回Last-Modified响应头,则表示该资源为协商缓存的资源
    	2. 当缓存到期后,浏览器将获取到 Last-Modified值作为请求头If-Modified-Since的值,与服务器协商,服务器返回304响应码[响应体为空],代表缓存继续使用,200响应码代表缓存不可用[响应体为最新资源]
    
    这个方法不太好,因为是以时间作为判断标准的,而且单位是S,有的时候在1s内文件可能会发生改变,这样就无法把最新资源发出去
  2. ETag响应头和If-None-Match请求头
    说明:
    	1. ETag是服务器响应请求是,返回当前资源文件的唯一标识(服务器生成),只要资源变化,ETag就会重新生成
    	2. 当缓存到期后,浏览器将获取到 ETag值作为请求头If-None-Match的值,与服务器协商,服务器返回304响应码[响应体为空],代表缓存继续使用,200响应码代表缓存不可用[响应体为最新资源]
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值