缓存穿透缓存雪崩,缓存击穿,django的6种缓存数据

缓存穿透,是指查询一个数据库一定不存在的数据。正常的使用缓存流程大致是,数据查询先进行缓存查询,如果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配置文件

 

视图函数:

from django.views.decorators.cache import cache_page
import time
from .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):

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h3 style="color: green">当前时间:-----{{ t }}</h3>

<ul>
    {% for book in bookList %}
       <li>{{ book.name }}--------->{{ book.price }}$</li>
    {% endfor %}
</ul>

</body>
</html>

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

4.3局部视图缓存

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

views视图函数

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

模板(index.html):

{% load cache %}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
 <h3 style="color: green">不缓存:-----{{ t }}</h3>

{% cache 2 ‘name‘ %}
 <h3>缓存:-----:{{ t }}</h3>
{% endcache %}

</body>
</html> 

原文地址:https://www.cnblogs.com/wrqysrt/p/10784028.html

时间: 2024-09-30 20:55:31

缓存穿透缓存雪崩,缓存击穿,django的6种缓存数据的相关文章

Redis缓存穿透和雪崩

一.缓存雪崩 1. 缓存挂了,所有请求都到了数据库了 2. 缓存没有挂,但同时到期,正好把所有缓存都删除了,所有请求都到了数据库了 3. 所有请求都到了数据库,很可能把数据库搞挂 二.缓存雪崩的解决方法 1. 缓存挂了的情况 a. 事发前:实现redis的高可用性(主从+sentinal+cluster) b. 事发时:本地缓存+限流(hystrix) c. 事发后:Redis持久化,重启后从磁盘上加载数据,快速恢复 三.缓存穿透 1. 查询一个不存在的数据,由于没有从数据库里查到,就不放入缓存

缓存穿透、缓存击穿、缓存雪崩概念及解决方案

缓存穿透 概念 访问一个不存在的key,缓存不起作用,请求会穿透到DB,流量大时DB会挂掉. 解决方案 采用布隆过滤器,使用一个足够大的bitmap,用于存储可能访问的key,不存在的key直接被过滤: 访问key未在DB查询到值,也将空值写进缓存,但可以设置较短过期时间. 缓存雪崩 概念 大量的key设置了相同的过期时间,导致在缓存在同一时刻全部失效,造成瞬时DB请求量大.压力骤增,引起雪崩. 解决方案 可以给缓存设置过期时间时加上一个随机值时间,使得每个key的过期时间分布开来,不会集中在同

缓存雪崩 Cache Avalanche 缓存穿透 Cache Penetration 缓存击穿 Hotspot Invalid

一.无处不在的缓存缓存在计算机系统是无处不在,在CPU层面有L1-L3的Cache,在Linux中有TLB加速虚拟地址和物理地址的转换,在应用层有Redis等内存数据库缓存.在浏览器有本地缓存.手机有本地文件缓存等等.可见,缓存在计算机系统中有非常重要的地位,主要作用就是提高响应速度.减少磁盘读取等,本文主要讨论在高并发系统中的缓存系统.一句话概括缓存系统在高并发系统中的地位的话,就是: 如果高并发系统是烤羊肉串,那么缓存系统就是那一撮孜然...... 二.高并发系统中的缓存 缓存系统的作用 缓

缓存穿透、击穿、雪崩区别和解决方案

转自公众号:自强学堂 文中的cache指缓存,比如redis,db指数据库,比如mysql. 一.缓存的三种模式 这里主要指的是应用代码对 cache 和 db 中数据的维护方式. 1.1 应用代码同时更新 cache 和 db a)数据写入流程 b)数据读取流程 1.2 应用代码只更新 cache,cache 负责同步更新 db 此时可以将 cache 和 db 看成一个整体,db 自己维护 cache. 1.3 应用方代码更新缓存,另外将 cache 中数据定期更新到 db 类似于 Linu

业务层面缓存穿透的解决方案

网上有一些关于缓存穿透和缓存雪崩的解决方案,无非是: 1.如果查询数据为null,则把null进行缓存 2.使用布隆过滤器 先来说说缓存穿透的概念:我们在项目中使用缓存通常都是APP先检查缓存中是否存在,如果存在直接返回缓存内容,如果不存在就直接查询数据库然后再缓存查询结果返回.这个时候如果我们查询的某一个数据在缓存中一直不存在,就会造成每一次请求都查询DB,这样缓存就失去了意义,在流量大时,可能DB就挂掉了. 再来讲讲我们的业务场景: 1.通常我们是首页,或是统计页,用户请求较多,首页进入系统

缓存穿透、缓存并发、缓存失效问题以及解决方案

一.缓存穿透 问题描述:我们在项目中使用缓存通常都是APP先检查缓存中是否存在,如果存在直接返回缓存内容,如果不存在就直接查询数据库然后再缓存查询结果返回.这个时候如果我们查询的某一个数据在缓存中一直不存在,就会造成每一次请求都查询DB,这样缓存就失去了意义,在流量大时,可能DB就挂掉了. 解决方法: 方法1.在封装的缓存SET和GET部分增加个步骤,如果查询一个KEY不存在,就已这个KEY为前缀设定一个标识KEY:以后再查询该KEY的时候,先查询标识KEY,如果标识KEY存在,就返回一个协定好

缓存穿透,缓存击穿,缓存雪崩解决方案分析

本文转自:http://blog.csdn.net/zeb_perfect/article/details/54135506 前言 设计一个缓存系统,不得不要考虑的问题就是:缓存穿透.缓存击穿与失效时的雪崩效应. 缓存穿透 缓存穿透是指查询一个一定不存在的数据,由于缓存是不命中时被动写的,并且出于容错考虑,如果从存储层查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到存储层去查询,失去了缓存的意义.在流量大时,可能DB就挂掉了,要是有人利用不存在的key频繁攻击我们的应用,这就是漏洞

缓存穿透 &amp; 缓存雪崩 &amp; 缓存击穿

一 缓存穿透 1. 行为 查询一个一定不存在的数据.存储层(姑且认为是db,下面都用db指代)查不到数据则不写入缓存,那么下次请求这个不存在的数据同样会到db层查询,失去了缓存的意义.流量大或人为恶意攻击可能会使db宕掉. 2. 解决方案 (1) 布隆过滤器.将全量可能存在的数据哈希到一个足够大的bitmap中,布隆可能误报,但绝不会漏报,那么一定不存在的数据会被拦截掉,从而缓解了对db的压力 (2) 空结果也进入缓存.如果查询返回的结果为空 (数据不存在 | 服务不可用), 仍将数据-空结果进

缓存击穿、缓存穿透、缓存雪崩

参考文章:缓存穿透.缓存击穿.缓存雪崩概念及解决方案 一. 缓存击穿 1. 概念 缓存击穿指的是高并发情况下在缓存中查询时该资源不存在,导致缓存无法命中,所有请求击穿到后端数据库系统进行查询,使数据库压力过大,甚至使数据库服务被压死. 2. 解决方案 直接加锁:当缓存未命中,则从数据库获取数据并更新到缓存中: 定时任务:定时刷新缓存: 多级缓存:一级缓存失效时间短,二级缓存失效时间长,一级缓存未命中时对 key 加锁,从数据库获取到数据更新到缓存并释放锁,后面线程从二级缓存获取数据: 二. 缓存