首页 > 编程知识 正文

redis缓存雪崩解决方案,如何防止雪崩

时间:2023-05-03 06:57:22 阅读:22477 作者:4441

一、什么是缓存雪崩

缓存雪崩是指由于停机、缓存服务停止或没有响应等原因,整个缓存崩溃,大量请求到达后端数据库,导致数据库崩溃,整个系统崩溃

雪崩的简单过程如下。

1、redis集群完全崩溃

2、缓存服务大量挂起对redis的要求,占用资源

3、缓存服务的大量要求查询源服务去查询mysql,直接打死mysql

4、源服务即使mysql被杀也会崩溃,对源服务的要求也会变为hang,占用资源

5、缓存服务的大量资源全部用于访问redis和源服务,最终自己被拖死,无法提供服务

6、nginx无法访问缓存服务、redis和源服务,只能基于本地缓存提供服务,但缓存过期后没有数据提供

7、网站崩溃

这种现象的原因如下。

1、例如“缓存并发”、“缓存直通”、“缓存抖动”等问题,也有可能被恶意攻击者使用。

2、如某个时间点内,系统预加载的缓存周期性集中失效了。解决方法:可以通过设置不同的过期时间,来错开缓存过期,从而避免缓存集中失效。

缓存穿透

缓存直通是查询单个数据库中不存在的数据。 正常的缓存使用过程通常是:数据查询首先进行缓存查询,如果key不存在或key过期,则查询数据库,并将查询的对象放入缓存中。 如果数据库查询对象为空,则无法将其放入缓存

缓存击穿

现金细分是指密钥是一个非常热点,承担着大的合并,大的合并集中访问这一点。 在这个密钥失效的瞬间,持续的大合并突破缓存,直接向数据库提出请求,就像在屏障上打洞一样。

解决的方案

缓存雪崩的解决方案

1 )增加锁定数或使用适当的队列数,以避免在缓存失效时对数据库造成太大的压力。 该方法缓解了数据库压力,但同时降低了系统吞吐量。

2 )分析用户行为,尽量均衡分布失效时间点。 避免现金雪崩的发生。

3 )如果是因为某个缓存服务器故障导致的,可以考虑进行主要准备。 例如,redis准备就绪,但双缓存是涉及事务更新的问题,update可能正在读取脏数据,需要妥善解决。

缓存穿透解决思路:

1 )如果查询数据库也为空,则直接设置默认值并将其存储在缓存中,第二次获取到缓冲区时将填充该值,而无需继续访问数据库。 这个方法最简单粗暴。

2 )根据缓存数据Key的规则。 例如,我们公司制造机顶盒。 缓存数据以Mac为Key。 Mac有规则,如果不符合规则就进行过滤。 现在可以过滤部分查询。 在制定缓存计划时,如果Key有一定的规则,就可以采取这个方法。 该方法只能缓解部分压力,过滤与系统无关的查询,但无法根治。

3 )如果使用蓝色过滤器将所有可能存在的数据散列为大小足够大的BitSet,则不存在的数据将被阻止,从而避免了联系基础存储系统的压力。 有关光晕过滤器的详细信息,请参见基于BitSet的光晕过滤器

对于缓存预热独立web系统相对简单。

解决方案:

1 )直接写缓存刷新页面,在线时手动操作。

2、数据量少,可以在WEB系统启动时加载。

3 )可以定时刷新缓存,也可以由用户触发。

分布式缓存系统(如Memcached和Redis )的预热很复杂,因为缓存系统很大,由十几台到几十台机器组成。

解决方案:

1、写程序跑步。

2 )单个高速缓存预热帧。

缓存的目标是在系统联机之前将数据加载到缓存中。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。