Django高级技巧之缓存

酥酥 发布于 2021-09-18 54 次阅读


Django高级技巧之缓存

缓存

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

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

Django原文如此定义缓存

    given a URL, try finding that page in the cache
if the page is in the cache:
  return the cached page
else:
  generate the page save the generated page in the cache (for next time)
  return the generated page

数据库缓存

将缓存的数据存储在您的数据库中

说明: 尽管存储介质没有更换,但是当把一次负责查询的结果直接存储到表里,比如多个条件的过滤查询结果,可避免重复进行复杂查询,提升效率;

settings.py中的配置

CACHES={`
'default':
{ 'BACKEND': 'django.core.cache.backends.db.Database Cache', 'LOCATION':'my_cache_table',
'TIMEOUT':300, #缓存保存时间单位秒,默认值为300,
'OPTIONS':{
'MAX_ENTRIES':300,#缓存最大数据条数
'CULL_FREQUENCY': 2,#缓存条数达到最大值时删除1/x的缓存数据
}
}
}
#把default也可以用应用名等代替,以便区分,后续在设置缓存的时候看可以通过次ci'jian

服务器内存缓存(测试型)

数据缓存到服务器内存中 配置样例:
CACHES={
  'default':{
  'BACKEND': django.core.cache.backends.locmem LoCMemcache,
  'LOCATION': 'unique-snowflake'
  }
  }

文件系统缓存

将缓存的数据存储到本地文件中 配置样例:
CACHES=[
default:{BACKEND.django.core.cache.backends.filebased. fileBasedcache
'LOCATION':'/var/tmp/ django_ cache',#这个是文件夹的路 # 'LOCATION':'c:\test\ cache',# windows下示例
}
}

setttings.py配置完以后要在terminal输入python manage.py createcachetable

整体缓存策略

把整个view给放进去,在视图函数里

样例:
from django.views.decorators.cache import cache_page
@cache_page (30) ->单位s修饰器
def my_view(request):
...

把整个view给放进去,在路由函数里

样例:
from django.views.decorators.cache import cache_page
urlpatterns=[ path('foo/',cache_page(60)(my_ view)),
]

不太可控,不好点对点删,其实慢是慢在数据库操作而不是视图!!

局部缓存策略

灵活性

用法

先引入cache对象
方式1:使用caches['CACHE配置key]
导入具体对象 from django.core.cache import caches
cachel = caches['myalias']
cache2 = caches ['myalias_2']
方式2:
from django.core.cache import cache相当于直接引入CACHES配置项中的"default'项

调用方法如下:

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

    1. key:缓存的key,字符串类型

    2. value:Python对象 timeout:缓存存储时间(s),默认为CACHES中的TIMEOUT值

    3. 返回值: None

  2. cache.get(key)-获取内存

    1. key:缓存的key

    2. 返回值:位key的具体值,如果没有数据,则返回None

  3. cache.add(key,value)-存储缓存,只在key不存在时生效#其他与set一样

    1. 返回值:True[存储成功] or False[存储失败]

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

  5. cache.set_many(dict,timeout)-批量存储缓存

    1. dict:key和value的字典

    2. timeout:存储时间

    3. 返回值:插入不成功的key数组

  6. cache.get_many(key_kist)-批量获取缓存数据

    1. key_list:包含key 的数组

    2. 返回值:取到的key和value的字典

  7. cache.delete(key)-删除key的缓存数据

    1. 返回值:None

  8. cache.delete_many(key_list)-批量删除缓存

    1. 返回值:None

浏览器缓存策略

缓存到自己的本地电脑上

  1. 优先访问本地电脑

  2. 没有就发请求给服务器

  3. 是否存本地缓存需要服务器的暗号

浏览器缓存之强缓存

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

  1. 响应头-Expires

    1. 定义:缓存过期时间,用来指定资源到期的时间,是服务器端的具体的时间点

    2. 样例Expires:Thu, 02 Apr 2030 05:14:08 GMT

  2. 响应头-Cache-Control

    1. 在HTTP/1.1中, Cache-Control主要用于控制网页缓存。比如当Cache-Controlmax-age=120代表请求创建时间后的120秒,缓存失效

    2. 说明:目前服务器都会带着这两个头同时响应给浏览器,浏览器优先使用Cache-Control

功臣是@cache_page装饰器,他自动加了这两个头


浏览器缓存之协商缓存

  • 强缓存中的数据一旦过期,还需要跟服务器进行通信,从而获取最新数据思考?如果强缓存的数据是一些静态文件,大图片等

  • 解答:考虑到大图片这类比较费带宽且不易变化的数据,强缓存时间到期后浏览器会去跟服务器协商,当前缓存是否可用,如果可用,服务器不必返回数据,浏览器继续使用原来缓存的数据,如果文件不可用,则返回最新数据

优势:避免了重复向服务器缓存同样的、费带宽的文件


  1. Last-Modified响应头和f- Modified- Since请求头

说明:

  1. Last- Modified为文件的最近修改时间,浏览器第一次请求静态文件时,服务器如果返回Last- Modified响应头,则代表该资源为需协商的缓存

  2. 当缓存到期后,浏览器将获取到的Last- Modified值做为请求头f- Modified- Since的值,与服务器发请求协商,服务端返回304响应码[响应体为空],代表缓存继续使用,200响应码代表缓存不可用[响应体为最新资源]


  1. ETag响应头和f-None- Match请求头

说明

  1. Etag是服务器响应请求时,返回当前资源文件的一个唯一标识(由服务器生成),只要资源有变化,Etag就会重新生成;

  2. 缓存到期后,浏览器将ETag响应头的值做为f-NoneMatch请求头的值,给服务器发请求协商;服务器接到请求头后比对文件标识,不一致则认为资源不可用,返回200响应码响应体为最新资源];可用则返回304响应码

前者不严谨,因为按照时间(秒级别)来判断可能会有脚本或者其他因素影响

后者使用hash值来搞,唯一校验但是费CPU