21、Django-缓存(强缓存和协商缓存)-@cache-page()装饰器
定义:缓存是一类可以更快的读取数据的介质的统称、也指其它可以加快数据读取的存储方式、一般用来存储临时数据、常用介质的是读取速度很快的内存 意义:视图渲染有一定的成本、数据库的频繁查询过高、所以对于低频变动的页面可以考虑使用缓存技术、减少实际渲染的次数、用户拿到相应的时间成本会更低
缓存优化:当请求视图时、优先从缓存拿数据、如果缓存中没有数据就正常从数据库中差、查完后就保存至缓存中
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
本文作者:little小新
本文链接:https://www.cnblogs.com/littlecc/p/18188231
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步