用缓存,主要有两个用途:提高性能、抗高并发
Django中提供多种缓存方式,如需使用需要在settings.py中进行配置:
- 数据库缓存
- 数据库缓存常用的是 redis 数据库,优点是 redis 是基于内存的 k v 型存储方式,读取比较快,而且也支持数据的压缩
- 【压缩命令:
"COMPRESSOR": "django_redis.compressors.zlib.ZlibCompressor",
】
- 文件系统缓存
- 本地系统缓存
缓存过期怎么删除问题?
缓存过期处理:
1)数量超过 300 , 直接删除部分数据 【具体看配置项】
2)惰性删除: 当取一个过期的缓存数据时,django 被动的删除掉该数据
def all_book(request):
cache_data = cache.get('all_book')
if cache_data:
all_books = cache_data
else:
all_books = Book.objects.all()
cache.set('all_book', all_books, 300)
return render('html')
def update_book()
1,2,3
cache.delete('all_book')
return render('html')
使用缓存的弊端?:
- 缓存数据与数据库数据不一致
- 缓存穿透,缓存雪崩
- 缓存的并发竞争问题
浏览器中的缓存?
浏览器缓存主要有两种方式:强缓存和协商缓存
-
**强缓存:**强缓存判断是否缓存的依据来自于是否超出某个时间或者某个时间段,而不关心服务器端文件是否已经更新。
-
Expires【响应头】:服务器通过这个头,告诉浏览器把回送的数据缓存多长时间【http协议1.0的产物】,受限于本地时间,如果修改了本地时间,可能会造成缓存失效
例:Expires:Thu, 02 Apr 2030 05:14:08 GMT
-
Cache-Control【响应头】:服务器通过这个头,告诉浏览器具体的缓存时间,缓存时间内不需再向服务器发送请求,【http1.1的产物,优先级高于Expires】
例:Cache-Control:max-age=120
-
-
**协商缓存:**协商缓存就是强制缓存失效后,浏览器携带缓存标识向服务器发起请求,由服务器根据缓存标识决定是否使用缓存的过程
-
Last-Modified【响应头】:浏览器第一次访问时,服务器会返回 【与If-Modified-Since一起使用】
例: Last-Modified: Fri, 22 Jul 2016 01:47:00 GMT
浏览器下次请求时 携带 If-Modified-Since【请求头】 , 它的值为 Last-Modified
服务器接收请求后,对比结果,若资源未发生改变,则返回304, 返回304时响应体为空;否则返回200并将新资源返回给浏览器
缺点:只能精确到秒,容易发生单秒内多次修改,检测不到
-
ETag【响应头】:浏览器第一次访问时,服务器会通过某种哈希算法计算出该资源的一个唯一标识(Hash值),并将这个唯一标识,通过ETag响应头的值返回给浏览器。只要该资源文件有改动,ETag的值就会重新生成【与 If-None-Match 一起使用】
If-None-Match【请求头】:浏览器通过这个头,携带浏览器第一次访问时服务器返回响应头ETag 的值,去服务器的ETag值做校验,看是否使用缓存。
对比 Last-Modified VS ETag
1,精度不一样 - Etag 高
2,性能上 - Last-Modifi 高
3,优先级 - Etag 高
-