Redis缓存穿透和缓存雪崩以及解决方案

Redis缓存穿透和缓存雪崩以及解决方案

Redis缓存穿透和缓存雪崩以及解决方案缓存穿透解决方案布隆过滤缓存空对象比较缓存雪崩解决方案保证缓存层服务高可用性依赖隔离组件为后端限流并降级数据预热缓存并发分布式锁

缓存穿透

缓存穿透是指查询一个一定不存在的数据,由于缓存不命中,接着查询数据库也无法查询出结果,因此也不会写入到缓存中,这将会导致每个查询都会去请求数据库,造成缓存穿透;

解决方案

布隆过滤

对所有可能查询的参数以hash形式存储,在控制层先进行校验,不符合则丢弃,从而避免了对底层存储系统的查询压力;

缓存空对象

当存储层不命中后,即使返回的空对象也将其缓存起来,同时会设置一个过期时间,之后再访问这个数据将会从缓存中获取,保护了后端数据源;

但是这种方法会存在两个问题:

  1. 如果空值能够被缓存起来,这就意味着缓存需要更多的空间存储更多的键,因为这当中可能会有很多的空值的键;
  2. 即使对空值设置了过期时间,还是会存在缓存层和存储层的数据会有一段时间窗口的不一致,这对于需要保持一致性的业务会有影响。

比较

缓存雪崩

缓存雪崩是指,由于缓存层承载着大量请求,有效的保护了存储层,但是如果缓存层由于某些原因整体不能提供服务,于是所有的请求都会达到存储层,存储层的调用量会暴增,造成存储层也会挂掉的情况。

解决方案

保证缓存层服务高可用性

即使个别节点、个别机器、甚至是机房宕掉,依然可以提供服务,比如 Redis Sentinel 和 Redis Cluster 都实现了高可用。

依赖隔离组件为后端限流并降级

在缓存失效后,通过加锁或者队列来控制读数据库写缓存的线程数量。比如对某个key只允许一个线程查询数据和写缓存,其他线程等待。

数据预热

可以通过缓存reload机制,预先去更新缓存,再即将发生大并发访问前手动触发加载缓存不同的key,设置不同的过期时间,让缓存失效的时间点尽量均匀。

缓存并发

缓存并发是指,高并发场景下同时大量查询过期的key值、最后查询数据库将缓存结果回写到缓存、造成数据库压力过大

分布式锁

在缓存更新或者过期的情况下,先获取锁,在进行更新或者从数据库中获取数据后,再释放锁,需要一定的时间等待,就可以从缓存中继续获取数据。

原文地址:https://www.cnblogs.com/George1994/p/10668889.html

时间: 2024-11-05 22:06:25

Redis缓存穿透和缓存雪崩以及解决方案的相关文章

redis缓存穿透,缓存击穿,缓存雪崩原因+解决方案

###一.前言在我们日常的开发中,无不都是使用数据库来进行数据的存储,由于一般的系统任务中通常不会存在高并发的情况,所以这样看起来并没有什么问题,可是一旦涉及大数据量的需求,比如一些商品抢购的情景,或者是主页访问量瞬间较大的时候,单一使用数据库来保存数据的系统会因为面向磁盘,磁盘读/写速度比较慢的问题而存在严重的性能弊端,一瞬间成千上万的请求到来,需要系统在极短的时间内完成成千上万次的读/写操作,这个时候往往不是数据库能够承受的,极其容易造成数据库系统瘫痪,最终导致服务宕机的严重生产问题. 为了

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

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

使用redis的原因,缓存穿透和缓存雪崩

使用redis的原因,缓存穿透和缓存雪崩 为什么使用redis而不使用map? map是本地缓存,随着jvm关闭而销毁,多实例时每个实例都要保存一份缓存.而redis是分布式缓存,多实例下只保存一份缓存,且提供持久化,即使服务器宕机数据也不会消失. 缓存穿透 访问大量没有做缓存的数据,导致大量请求落到数据库,数据库崩溃. 解决方案:将所有存在的数据装入一个bitmap或者布隆过滤器中,一开始就把不存在数据的请求过滤掉,还可以查询数据库时无论数据存在还是不存在,都缓存一份空,这样短期内再访问就不会

Redis之缓存雪崩、缓存穿透、缓存预热、缓存更新、缓存降级

Redis之缓存雪崩.缓存穿透.缓存预热.缓存更新.缓存降级 1.缓存雪崩 发生场景:当Redis服务器重启或者大量缓存在同一时期失效时,此时大量的流量会全部冲击到数据库上面,数据库有可能会因为承受不住而宕机 解决办法: 1)随机均匀设置失效时间 2)设置过期标志更新缓存 3)并发量不是特别多的时候,使用最多的解决方案是加锁排队 2.缓存穿透 发生场景:是指查询一个数据库一定不存在的数据.正常的使用缓存流程大致是,数据查询先进行缓存查询,如果key不存在或者key已经过期,再对数据库进行查询,并

缓存穿透,缓存击穿,缓存雪崩的原理及解决方案

前言 设计一个缓存系统,不得不要考虑的问题就是:缓存穿透.缓存击穿与失效时的雪崩效应 缓存穿透 缓存穿透是指查询一个一定不存在的数据,由于缓存是不命中时被动写的,并且出于容错考虑,如果从存储层查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到存储层去查询,失去了缓存的意义.在流量大时,可能DB就挂掉了,要是有人利用不存在的key频繁攻击我们的应用,这就是漏洞.举例:如发起为id为"-1"的数据或id为特别大不存在的数据.这时的用户很可能是攻击者,攻击会导致数据库压力过大.

如何设计缓存系统:缓存穿透,缓存击穿,缓存雪崩解决方案分析

前言 设计一个缓存系统,不得不要考虑的问题就是:缓存穿透.缓存击穿与失效时的雪崩效应. 缓存穿透 缓存穿透是指查询一个一定不存在的数据,由于缓存是不命中时被动写的,并且出于容错考虑,如果从存储层查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到存储层去查询,失去了缓存的意义. 在流量大时,可能DB就挂掉了,要是有人利用不存在的key频繁攻击我们的应用,这就是漏洞. 解决方案 有很多种方法可以有效地解决缓存穿透问题,最常见的则是采用布隆过滤器,将所有可能存在的数据哈希到一个足够大的bi

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

缓存穿透: ? 缓存穿透,是指查询一个数据库一定不存在的数据.正常的使用缓存流程大致是,数据查询先进行缓存查询,如果key不存在或者key已经过期,再对数据库进行查询,并把查询到的对象,放进缓存.如果数据库查询对象为空,则不放进缓存. 代码流程 参数传入对象主键ID 根据key从缓存中获取对象 如果对象不为空,直接返回 如果对象为空,进行数据库查询 如果从数据库查询出的对象不为空,则放入缓存(设定过期时间) ? 想象一下这个情况,如果传入的参数为-1,会是怎么样?这个-1,就是一定不存在的对象.

缓存穿透与缓存雪崩

缓存穿透 什么是缓存穿透? 一般的缓存系统,都是按照key去缓存查询,如果不存在对应的value,就应该去后端系统查找(比如DB).如果key对应的value是一定不存在的,并且对该key并发请求量很大,就会对后端系统造成很大的压力.这就叫做缓存穿透. 如何避免? 1:对查询结果为空的情况也进行缓存,缓存时间设置短一点,或者该key对应的数据insert了之后清理缓存. 2:对一定不存在的key进行过滤.可以把所有的可能存在的key放到一个大的Bitmap中,查询时通过该bitmap过滤.[感觉

缓存穿透与缓存雪崩(转)

缓存穿透 什么是缓存穿透? 一般的缓存系统,都是按照key去缓存查询,如果不存在对应的value,就应该去后端系统查找(比如DB).如果key对应的value是一定不存在的,并且对该key并发请求量很大,就会对后端系统造成很大的压力.这就叫做缓存穿透. 如何避免? 1:对查询结果为空的情况也进行缓存,缓存时间设置短一点,或者该key对应的数据insert了之后清理缓存. 2:对一定不存在的key进行过滤.可以把所有的可能存在的key放到一个大的Bitmap中,查询时通过该bitmap过滤.[感觉