首页 > 其他分享 >21、Django-缓存(强缓存和协商缓存)-@cache-page()装饰器

21、Django-缓存(强缓存和协商缓存)-@cache-page()装饰器

时间:2024-07-09 22:46:27浏览次数:17  
标签:缓存 21 -- cache django key py

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

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

 

缓存优化:当请求视图时、优先从缓存拿数据、如果缓存中没有数据就正常从数据库中差、查完后就保存至缓存中

 

django中使用缓存的方案:全局缓存、局部缓存

from django.views.decorators.cache import cache_page
from django.http import HttpResponse
import time

#全局缓存-将整个视图函数结果缓存起来
#方法1:
@cache_page(30) -> 单位s       #语法糖装饰器、当前这个视图函数的缓存时间-如果缓存有数据就拿缓存的数据、没有则正常走视图并将结果缓存
def my_view(request):
    t = time.time()
    
    return HttpResponse('t is %s' %(t))


#方法2:在路由中
from django.views.decorators.cache import cache_page

urlpatterns = [
    path('foo/', cache_page(60)(my_view)),    #my_view 视图函数
]

==============================================================================================
局部缓存-缓存指定的值
#缓存api的使用
#方式1:
#使用caches['CACHE配置key']导入具体对象
from django.core.cache import caches
cache1 = caches['myalias']
cache2 = caches['myalias_2']

#方式2:
from django.core.cache import cache   #相当于直接引入CACHES配置项中的'defalult'-(setting.py中的CACHES配置项)项

 

缓存方案:

1、在数据库缓存:
在setting.py中配置
----------------------------------------------------------------
CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.db.DatabaseCache',    #引擎
        'LOCATION': 'table_name',  # 表名 执行 'python manage.py createcachetable my_cache_table' 创建表
        # 'TIMEOUT': 60000,   # 缓存保存时间、单位秒、默认值是300s
        'OPTIONS': {    #特殊的参数
            'CLIENT_CLASS': 'django_redis.client.DefaultClient',
            'MAX_ENTRIES': 3000000,           # 最大缓存记录的数量(默认300)
            # 'CULL_FREQUENCY': 3,          # 缓存到达最大个数之后,剔除缓存个数的比例,即:1/CULL_FREQUENCY(默认3)
        }
    }
}

---------------------------------------------------------------------


2、数据缓存到服务器的内存中
在setting.py中配置:
----------------------------------------------------------------------------
CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
        'LOCATION': 'unique-snowflake'    #雪花算法
     }
}
-------------------------------------------------------------------------------

3、将数据缓存到文件中
在setting.py中配置:
-------------------------------------------------------------------------
CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache',
        'LOCATION': '/var/tmp/django_cache'    #文件夹的路径
     }
}
--------------------------------------------------------------------------


4、

 

缓存api的使用

1、cache.set(key, value, timeout) - 存储缓存
  -- key:缓存的key、字符串类型
  -- value:python对象
  -- timeout:缓存存储的时间(s)、默认为CACHES中的TIMEOUT值
  -- 返回值:None

2、cache.get(key) - 获取缓存
  -- key:缓存的key
  -- 返回值:为key的具体值、如果没有数据、则返回None

3、cache.add(key,value) - 存储缓存、只在key不存在时生效
  -- 返回值:True[存储成功] or False[存储失败]
    
4、cache.get_or_set(key,value,timeout) - 如果没有获取到数据、就执行set操作
  -- 返回值:value
    
5、cache.set_many(dict, timeout) - 批量存储缓存
  -- dict:key和value的字典
  -- timeout:存储的时间(s)
  -- 返回值:插入不成功的key的数组
    
6、cache.get_many(key_list) - 批量获取存储数据
  -- key_list:包含key的数组
  -- 返回值:取到的key和value的字典

7、cache.delete(key) - 删除key的缓存数据
  -- 返回值:None
    
8、cache.delete_many(key_list) - 批量删除
  -- 返回值:None
    
    
    

 

浏览器缓存策略

#浏览器的缓存
  -- 强缓存
  -- 协商缓存

1、强缓存:-- 
 -- 响应头 - Expires
    -- 定义缓存的时间、用来指定资源缓存到期的时间、是服务器端的具体的时间点
    -- 样例: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


===========================================================
#协商缓存  -- 一旦静态文件到期就去协商
#一般用于缓存静态文件、避免重复获取没有改变的静态文件、浪费资源
1、Last-Modified响应头个if-Modified-Since请求头  -- 少用、不是最优解
说明:
  -- 1、Last-Modified为文件的最近修改时间、浏览器第一次请求静态文件是、服务器如果返回Last-Modified响应头、则代表该资源为需要协商的缓存   
  -- 2、当缓存到期后,浏览器将获取到的Last-Modified值作为请求头if-Modified-Since的值、与服务器发请求协商、服务端返回304响应码[响应体为空]、代表缓存继续使用、200响应码代表缓存不可用[响应体为最新的资源]

2、ETag响应头和if-None-Match请求头
说明:
  -- 1、Etag是服务器是响应请求时、返回当前资源文件的一个唯一标识(由服务器生成)、只要资源有变化、Etag就会重新生成
  -- 2、缓存到期后、浏览器将ETag响应头的值作为if-None-Match请求头的值、给服务器发请求协商;服务器街道请求头后,比对文件标识、不一致则认为资源不可用、返回200响应码[响应体为最新资源];可用则返回304响应码

 

案例:

创建项目:cache

1、先在setting.py中配置缓存
-----------------------------------------------------------------------
.............

#缓存配置
CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.db.DatabaseCache',    #引擎
        'LOCATION': 'my_cache_table',  # 表名 执行 'python manage.py createcachetable my_cache_table' 创建表
        # 'TIMEOUT': 60000,   # 缓存保存时间、单位秒、默认值是300s
        'OPTIONS': {    #特殊的参数
            'CLIENT_CLASS': 'django_redis.client.DefaultClient',
            'MAX_ENTRIES': 3000000,           # 最大缓存记录的数量(默认300)
            # 'CULL_FREQUENCY': 3,          # 缓存到达最大个数之后,剔除缓存个数的比例,即:1/CULL_FREQUENCY(默认3)
        }
    }
}
---------------------------------------------------------------
2、执行:
  -- python manage.py createcachetable my_cache_table #创建缓存用的表
    -- 表一般有三个字段:
      -- key、value、expires(缓存过期时间)

3、数据库迁移:
  -- python manage.py migrate

 

标签:缓存,21,--,cache,django,key,py
From: https://www.cnblogs.com/littlecc/p/18188231

相关文章

  • DMSQF ECO2101 Microeconomics
    DMSQF ECO2101 MicroeconomicsCA1 Individual Project - Instructions for StudentsJuly 2024 Semester (BLENDED)CA1 IndividualProjectAssessmentn This CA1 constitutes 30% of the overall ECO2101 Microeconomics course assessment. Rational......
  • WSL 安装 garnet 作为缓存服务
     一、下载wgethttps://github.com/microsoft/garnet/releases/download/v1.0.15/linux-x64-based.tar.xz二、解压mkdirgarnettar-xflinux-x64-based.tar.xz-Cgarnet 三、运行cdgarnet./GarnetServer确保本机有安装dotnet运行时。sudoapt-getup......
  • Redis三大缓存问题:缓存穿透、缓存击穿、缓存雪崩的场景以及解决方法
    文章目录都是缓存惹的祸缓存穿透场景描述解决方法缓存键同时失效1.过期时间随机化2.使用多级缓存3.缓存预热4.加互斥锁缓存中间件故障1.服务熔断-Java示例2.构建Redis集群注意事项缓存击穿场景描述解决方法1.加互斥锁(MutexLock)2.永久缓存热点数据注意事......
  • Tomcat “缓存”清理
    一、关于Tomcat“缓存”的介绍很多时候大家喜欢把tomcat的work目录里的东西叫做缓存,其实那不是很恰当,work目录只是tomcat的工作目录,也就是tomcat把jsp转换为class文件的工作目录,这也正是为什么它叫work目录而不是cache目录的原因。jsp,tomcat的工作原理是当浏览器访问某个jsp......
  • DeepViT:字节提出深层ViT的训练策略 | 2021 arxiv
    作者发现深层ViT出现的注意力崩溃问题,提出了新颖的Re-attention机制来解决,计算量和内存开销都很少,在增加ViT深度时能够保持性能不断提高来源:晓飞的算法工程笔记公众号论文:DeepViT:TowardsDeeperVisionTransformer论文地址:https://arxiv.org/abs/2103.11886论文代码......
  • 基于SpringBoot的酒店订房系统+82159(免费领源码)可做计算机毕业设计JAVA、PHP、爬虫、A
    springboot酒店订房系统摘 要随着科学技术的飞速发展,社会的方方面面、各行各业都在努力与现代的先进技术接轨,通过科技手段来提高自身的优势,酒店订房系统当然也不能排除在外。酒店订房系统是以实际运用为开发背景,运用软件工程开发方法,采用springboot技术构建的一个管理系统......
  • YOLOv8改进 | 注意力机制| 引入多尺度分支来增强特征表征的注意力机制 【CVPR2021】
    秋招面试专栏推荐:深度学习算法工程师面试问题总结【百面算法工程师】——点击即可跳转......
  • redis缓存的穿透及解决的方案
    概念缓存穿透是指查询一个一定不存在的数据,如果从存储层查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到DB去查询,可能导致DB挂掉。这种情况大概率是遭到了攻击。解决方案方案一:将每次查询到为null的值存入redis优点:简单缺点:消耗内存,可能会出现数据不一......
  • mybatis缓存
    MyBatis提供了两级缓存机制:一级缓存(本地缓存)和二级缓存(全局缓存)。这两级缓存可以显著提高数据查询的效率,减少数据库访问的次数。下面介绍MyBatis的一级缓存和二级缓存的原理、配置和使用方法。题外话:......
  • P7411 [USACO21FEB] Comfortable Cows S (搜索)
    P7411[USACO21FEB]ComfortableCowsS搜索容易知道任意时刻的不合法的位置,并且决策只有将空着的位置补起来。每次加入一个点,判断其自身、上下左右是否变得不合法,往下递归即可。复杂度分析,每个点只会不合法一次(修改后就变得合法),所以只会遍历一次,复杂度是\(O(n^2)\)。#inclu......