首页 > 编程知识 正文

redis缓存击穿和缓存穿透(redis雪崩怎么解决)

时间:2023-05-05 21:53:36 阅读:84822 作者:3881

作为内存数据库,redis也不可避免地存在各种问题。 本文主要讨论两个问题:缓存直通和缓存雪崩。 给出几个解决方案。 这两个问题是基本的问题,也是面试中经常问的问题。

这篇文章参考了很多文章,但是我发现基本上写的都是一样的东西,所以我会在这个基础上加以改善。 内容总结了我在某个字母网站上看到的香格里拉教程。 在这里特别说明。

一、缓存穿透

1、概念

缓存通过的概念很简单,用户在尝试查询数据时,会发现没有redis内存数据库,也就是缓存没有命中,然后查询持久层数据库。 不,这次询问失败了。 用户多的时候,缓存没有命中,所以请求了持久层数据库。 这相当于给持久层数据库带来了很大的压力,发生了缓存通过。

这里,需要注意与高速缓存崩溃的区别。 缓存崩溃是key的一个非常热点,它持续承担较大的并发任务,并且较大的并发任务集中访问这一点。 在这个key失灵的瞬间,持续的大并发会冲破缓存,直接向数据库发出请求,就像在屏障上挖洞一样。

为了避免高速缓存通过,实际上有各种各样的解决方案。 介绍几个。

二、解决办法

)1)光晕过滤器

布鲁姆过滤器是一种数据结构,垃圾网站和普通网站加起来全世界据统计也有几十亿个。 网警为了过滤这些垃圾网站,不可能在数据库里一一比较吧。 可以使用光晕过滤器。 假设你要保存一亿个垃圾网站的地址。

首先有1亿个二进制位,网警可以使用8个不同的随机数发生器(F1,F2,…,F8 )生成8个信息指纹) F1,F2,…,F8 )。 接着,用1个随机数发生器g将这8个信息指纹映射到1亿到1亿中8个自然数g1、g2、…、g8上。 最后将这8个位置的二进制文件都设置为1。 过程如下。

一天,网络警察发现了一个可疑的网站。 我想判断是不是XX网站,首先用哈希将可疑的网站映射到1亿个位数组上的8个点。 如果8个点中有1个点不是1,就可以判断该要素一定不存在于集合中。

这个光晕滤波器怎么解决redis的缓存通过问题呢? 很简单,首先将所有可查询的参数保存为hash格式,在用户希望查询时使用光晕过滤器发现不在集合中,然后直接放弃,不再查询持久层。

这个形式很简单。

2、缓存空对象

如果存储层未命中,则返回的空对象也将被缓存并设置过期日期。 然后,访问该数据时,将从缓存中检索该数据,从而保护后端数据源。

但是,这个方法有两个问题。

如果可以缓存空值,则缓存可能有很多空值的密钥,因此缓存需要更多的空间来存储更多的密钥。即使空值设置了过期时间,缓存层和存储层的数据也会保留一段时间

二、缓存雪崩

1、概念

缓存雪崩是指缓存层发生错误,无法正常工作。 因此,所有请求都将到达存储层,导致存储层调用量激增,存储层也将挂起。

二、解决办法

)1) redis高可用性

这个思想的意思是,既然redis有可能挂了,我就增设几台redis,即使一台挂了,其他的也能继续工作。 其实是构筑的集群。

)2)限流降级

此解决方案的思路是,在禁用缓存后,锁定或排队以控制要读取数据库写缓存的线程数。 例如,一个key只有一个线程可以查询数据和写缓存,而另一个线程可以等待。

)3)数据预热

加热数据意味着在正式部署之前,先访问可能的数据一次。 这样,一些可能会大量访问的数据就会加载到缓存中。 在即将发生大规模并发访问之前,手动触发缓存加载以加载不同的密钥,并设置不同的过期日期以使缓存失效的时间尽可能均匀。

ok,我觉得这篇文章基本上都一样,很好。 据此进行了修改。

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