说说django中的缓存机制

为了缓解服务器的压力,django中的缓存指的是把一些经常需要用到的资源保存下来,使得服务器在收到请求后不用执行视图函数,直接返给浏览器缓存中的数据,一般可以通过python3 manage.py createcachetable命令创建缓存表,把缓存的数据以键值对的形式保存在本地的数据库中,然后通过在视图函数前添加装饰器@cache_page(time)的方式,或者在模板里添加{% load cache %}的方式,指定需要缓存的内容。

这两种方法的区别在于第一种方法会同时关联浏览器缓存,而第二种不会,下面谈谈浏览器缓存是什么。

服务器在返回给浏览器响应结果时会在响应头中添加Expires或者Cache-Control字段(Expires是http旧版本协议的产物),里面存放的是缓存过期时间,同时添加Last-Modified(最后修改时间)和ETag(哈希值),要求浏览器把该返回结果存放进浏览器缓存中。这样浏览器在之后发送请求给服务器前会先检查浏览器缓存中是否有该请求的缓存标识,如果有而且没有过期,则触发强缓存,直接从浏览器缓存中读取资源然后渲染页面,根本不会发送该请求给服务器。

如果存在浏览器缓存但是缓存已经过期了,则会触发协商缓存,发送请求给服务器请求协商,此时有浏览器可以选择两种方法。

第一种方法是在请求头中添加If-Modified-Since这个字段,里面的值是Last-Modified,服务器收到请求后会对比最后修改时间。如果相同表示该资源并没有发过生修改,于是直接返回304表示资源还可继续使用;如果不同则返回200并将最新资源返回给浏览器。这样做有个小问题,就是修改时间是精确到秒的,如果同一秒内发生过修改,是检测不到的。

于是还有第二种方法,就是在请求头中添加和If-None-Match这个字段,里面的值是ETag,Etag是一个哈希值,利用其定长输出和雪崩效应检测资源是否发生改变。如果服务器对比Etag值相同,则直接返回304表示同意协商;否则返回200和最新资源。如果利用这个方法,服务器每次收到请求后都要进行哈希运算,性能上会稍受影响。

猜你喜欢

转载自blog.csdn.net/qq_43435274/article/details/103517982