博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
缓存穿透缓存雪崩,缓存击穿,django的6种缓存数据
阅读量:5106 次
发布时间:2019-06-13

本文共 2384 字,大约阅读时间需要 7 分钟。

缓存穿透,是指查询一个数据库一定不存在的数据。正常的使用缓存流程大致是,数据查询先进行缓存查询,如果key不存在或者key已经过期,再对数据库进行查询,并把查询到的对象,放进缓存。如果数据库查询对象为空,则不放进缓存。

想象一下这个情况,如果传入的参数为-1,会是怎么样?这个-1,就是一定不存在的对象。就会每次都去查询数据库,而每次查询都是空,每次又都不会进行缓存。假如有恶意攻击,就可以利用这个漏洞,对数据库造成压力,甚至压垮数据库。即便是采用UUID,也是很容易找到一个不存在的KEY,进行攻击。

可以采用缓存空值的方式,也就是如果从数据库查询的对象为空,也放入缓存,只是设定的缓存过期时间较短,比如设置为60秒。

 

缓存雪崩,是指在某一个时间段,缓存集中过期失效。

产生雪崩的原因之一,比如在写本文的时候,马上就要到双十二零点,很快就会迎来一波抢购,这波商品时间比较集中的放入了缓存,假设缓存一个小时。那么到了凌晨一点钟的时候,这批商品的缓存就都过期了。而对这批商品的访问查询,都落到了数据库上,对于数据库而言,就会产生周期性的压力波峰。

小编在做电商项目的时候,一般是采取不同分类商品,缓存不同周期。在同一分类中的商品,加上一个随机因子。这样能尽可能分散缓存过期时间,而且,热门类目的商品缓存时间长一些,冷门类目的商品缓存时间短一些,也能节省缓存服务的资源。

 

 

缓存击穿,是指一个key非常热点,在不停的扛着大并发,大并发集中对这一个点进行访问,当这个key在失效的瞬间,持续的大并发就穿破缓存,直接请求数据库,就像在一个屏障上凿开了一个洞。

小编在做电商项目的时候,把这货就成为“爆款”。

其实,大多数情况下这种爆款很难对数据库服务器造成压垮性的压力。达到这个级别的公司没有几家的。所以,务实主义的小编,对主打商品都是早早的做好了准备,让缓存永不过期。即便某些商品自己发酵成了爆款,也是直接设为永不过期就好了。

 

 

 

 

 

 

  • 开发调试缓存
  • 内存缓存
  • 文件缓存
  • 数据库缓存
  • Memcache缓存(使用python-memcached模块)
  • Memcache缓存(使用pylibmc模块)

经常使用的有文件缓存和Mencache缓存

 

 

 

4.2 全站使用缓存

既然是全站缓存,当然要使用Django中的中间件.

用户的请求通过中间件,经过一系列的认证等操作,如果请求的内容在缓存中存在,则使用FetchFromCacheMiddleware获取内容并返回给用户

当返回给用户之前,判断缓存中是否已经存在,如果不存在,则UpdateCacheMiddleware会将缓存保存至Django的缓存之中,以实现全站缓存

缓存整个站点,是最简单的缓存方法在 MIDDLEWARE_CLASSES 中加入 “update” 和 “fetch” 中间件MIDDLEWARE_CLASSES = (    ‘django.middleware.cache.UpdateCacheMiddleware’, #第一    'django.middleware.common.CommonMiddleware',    ‘django.middleware.cache.FetchFromCacheMiddleware’, #最后)“update” 必须配置在第一个“fetch” 必须配置在最后一个

修改settings.py配置文件

 
View Code

视图函数:

from django.views.decorators.cache import cache_pageimport timefrom .models import *def index(request):     t=time.time()      #获取当前时间     bookList=Book.objects.all()     return render(request,"index.html",locals())def foo(request):    t=time.time()      #获取当前时间    return HttpResponse("HELLO:"+str(t))

模板(index.html):

    
Title

当前时间:-----{
{ t }}

    {% for book in bookList %}
  • {
    { book.name }}--------->{
    { book.price }}$
  • {% endfor %}

其余代码不变,刷新浏览器是10秒,页面上的时间变化一次,这样就实现了全站缓存.

4.3局部视图缓存

例子,刷新页面时,整个网页有一部分实现缓存

views视图函数

from django.views.decorators.cache import cache_pageimport timefrom .models import *def index(request):     t=time.time()      #获取当前时间     bookList=Book.objects.all()     return render(request,"index.html",locals())

模板(index.html):

{% load cache %}    
Title

不缓存:-----{
{ t }}

{% cache 2 'name' %}

缓存:-----:{
{ t }}

{% endcache %}

 

转载于:https://www.cnblogs.com/wrqysrt/p/10784028.html

你可能感兴趣的文章
Codeforces 888D Almost Identity Permutations:错排公式
查看>>
django 一些库
查看>>
R-Project小记(一)
查看>>
例题4-10/4-11
查看>>
v8 Date 时间和系统时间转换
查看>>
hdu 3371(kruskal)
查看>>
常用排序算法总结
查看>>
定义与声明
查看>>
环信联合创始人: Saas敏捷开发实践!
查看>>
九度OJ做题记录 更新.....
查看>>
1小时回顾MySQL语法(上)
查看>>
combobox SelectedIndexChanged事件 如何触发
查看>>
「POI 2010」Bridges
查看>>
WIN 10家庭版没有Hyper-V
查看>>
python--常用的十进制、16进制、字符串、字节串之间的转换
查看>>
车辆违章查询接口
查看>>
判断输入的整数是否为 闰年
查看>>
bzoj3252攻略(线段树+dfs序)
查看>>
IntelliJ IDEA常用设置(一)
查看>>
阿里云建站严选
查看>>