缓存穿透、缓存雪崩

1、缓存穿透

访问一个不存在的key,缓存不起作用,请求会穿透到DB,流量大时DB会挂掉。

解决:

  1)采用布隆过滤器,使用一个足够大的bitmap,用于存储可能访问的key,不存在的key直接被过滤;
  2)拦截器,id<=0的直接拦截。
  3)从cache和db都取不到,可以将key-value写为key-null,设置较短过期时间,如30秒(设置太长会导致正常情况也没法使用)。这样可以防止攻击用户反复用同一个id暴力攻击

2、缓存雪崩
      大量的key设置了相同的过期时间,导致在缓存在同一时刻全部失效,造成瞬时DB请求量大、压力骤增,引起雪崩。

解决:

  (1)缓存数据的过期时间设置随机,防止同一时间大量数据过期现象发生。
  (2)如果缓存数据库是分布式部署,将热点数据均匀分布在不同搞得缓存数据库中。
  (3)设置热点数据永远不过期。

3、缓存击穿
      一个存在的key,在缓存过期的一刻,同时有大量的请求,这些请求都会击穿到DB,造成瞬时DB请求量大、压力骤增。

解决:

  (1)设置热点数据永远不过期。
  (2)加排它锁。

4、缓存预热

  新的缓存系统没有任何缓存数据,在缓存重建数据的过程中,系统性能和数据库负载都不太好,所以最好是在系统上线之前就把要缓存的热点数据加载到缓存中,这种缓存预加载手段就是缓存预热。

  

原文地址:https://www.cnblogs.com/bloghuang/p/10772223.html

时间: 2024-11-10 13:49:39

缓存穿透、缓存雪崩的相关文章

redis的缓存穿透 缓存并发 缓存失效

我们在用缓存的时候,不管是Redis或者Memcached,基本上会通用遇到以下三个问题: 缓存穿透 缓存并发 缓存失效 一.缓存穿透 Paste_Image.png Paste_Image.png Paste_Image.png 注:上面三个图会有什么问题呢? 我们在项目中使用缓存通常都是先检查缓存中是否存在,如果存在直接返回缓存内容,如果不存在就直接查询数据库然后再缓存查询结果返回.这个时候如果我们查询的某一个数据在缓存中一直不存在,就会造成每一次请求都查询DB,这样缓存就失去了意义,在流量

【学习】缓存穿透&amp;缓存雪崩

昨天第一次听涛哥讲到缓存穿透与缓存雪崩  网上百度学习了下  Mark一下 [缓存穿透] 缓存穿透其实就是查询一个肯定不存在的数据,每次都会查询数据库,由于数据不存在,也不会写缓存. 这样其实是失去了缓存的意义了. 高并发的时候对数据库的压力就大了~~ 网上查到有几种解决方法: 1.布隆过滤器--这个算法有点复杂,具体应用就是,高效地检索一个元素是否在一个集合中,但是可能存在低概率的误差. 参见[http://www.dataguru.cn/thread-481958-1-1.html] 这里提

缓存穿透 缓存雪崩 缓存并发

参考连接:https://segmentfault.com/a/1190000005886009 缓存穿透:查询一个不存在的数据时,缓存和存储层都不会命中,由于存储层查不到数据则不写入缓存,所以每次查询都会到存储层查询从而缓存失去了其存在的意义. 如何避免: 对查询为空的情况也进行缓存,只不过设置一个较短的缓存时间. 把所有可能存在的key放到一个大的bitmap中,查询时通过该bitmap过滤. 缓存雪崩:发生缓存穿透时或者缓存失效后,Storage层的调用量暴增从而使Storage也挂掉.

缓存穿透 缓存雪崩

1. 缓存穿透:查询一个必然不存在的数据.比如文章表,查询一个不存在的id,每次都会访问DB,如果有人恶意破坏,很可能直接对DB造成影响. 解决办法:对所有可能查询的参数以hash形式存储,在控制层先进行校验,不符合则丢弃. 2.缓存失效:如果缓存集中在一段时间内失效,DB的压力凸显.这个没有完美解决办法,但可以分析用户行为,尽量让失效时间点均匀分布. 当发生大量的缓存穿透,例如对某个失效的缓存的大并发访问就造成了缓存雪崩. http://www.oschina.net/question/541

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

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

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

缓存穿透,是指查询一个数据库一定不存在的数据.正常的使用缓存流程大致是,数据查询先进行缓存查询,如果key不存在或者key已经过期,再对数据库进行查询,并把查询到的对象,放进缓存.如果数据库查询对象为空,则不放进缓存. 想象一下这个情况,如果传入的参数为-1,会是怎么样?这个-1,就是一定不存在的对象.就会每次都去查询数据库,而每次查询都是空,每次又都不会进行缓存.假如有恶意攻击,就可以利用这个漏洞,对数据库造成压力,甚至压垮数据库.即便是采用UUID,也是很容易找到一个不存在的KEY,进行攻击

Redis缓存穿透和雪崩

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

缓存穿透,缓存击穿,缓存雪崩

本文链接:https://blog.csdn.net/kongtiao5/article/details/82771694 一.缓存处理流程 前台请求,后台先从缓存中取数据,取到直接返回结果,取不到时从数据库中取,数据库取到更新缓存,并返回结果,数据库也没取到,那直接返回空结果. 二.缓存穿透 描述: 缓存穿透是指缓存和数据库中都没有的数据,而用户不断发起请求,如发起为id为“-1”的数据或id为特别大不存在的数据.这时的用户很可能是攻击者,攻击会导致数据库压力过大. 解决方案: 接口层增加校验

Memcached之缓存雪崩,缓存穿透,缓存预热,缓存算法(7)

缓存雪崩 缓存雪崩可能是因为数据未加载到缓存中,或者缓存同一时间大面积的失效,从而导致所有请求都去查数据库,导致数据库CPU和内存负载过高,甚至宕机. 解决思路: 1,采用加锁计数,或者使用合理的队列数量来避免缓存失效时对数据库造成太大的压力.这种办法虽然能缓解数据库的压力,但是同时又降低了系统的吞吐量. 2,分析用户行为,尽量让失效时间点均匀分布.避免缓存雪崩的出现. 3,如果是因为某台缓存服务器宕机,可以考虑做主备,比如:redis主备,但是双缓存涉及到更新事务的问题,update可能读到脏

Memcached之缓存雪崩,缓存穿透,缓存预热,缓存算法

缓存雪崩 缓存雪崩可能是因为数据未加载到缓存中,或者缓存同一时间大面积的失效,从而导致所有请求都去查数据库,导致数据库CPU和内存负载过高,甚至宕机. 解决思路: 1,采用加锁计数,或者使用合理的队列数量来避免缓存失效时对数据库造成太大的压力.这种办法虽然能缓解数据库的压力,但是同时又降低了系统的吞吐量. 2,分析用户行为,尽量让失效时间点均匀分布.避免缓存雪崩的出现. 3,如果是因为某台缓存服务器宕机,可以考虑做主备,比如:Redis主备,但是双缓存涉及到更新事务的问题,update可能读到脏