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

1、缓存穿透

查询一个数据库一定不存在的数据。

解决方法
1、布隆过滤器
布隆过滤器是一个bit向量或者bit。对于一个key,我们要映射到布隆过滤器,使用多个不同的哈希函数生成多个哈希值,并把每个生成的哈希值指向的bit设置为1。
原理:当查询时,把key使用不同的哈希函数进行计算,若对应的bit均为1,则布隆过滤器判断该key存在。
在这里插入图片描述
在这里插入图片描述
从上图可以看到,不同的词对应的bit位置可能相同,当词比较多的时候,可能大部分bit位置都是1。布隆过滤器判断不存在的词一定不存在,判断存在的可能不存在
在这里插入图片描述

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

  • 若空值能够被缓存起来,意味着需要更多的空间存储更多的键,因为可能有很多空值的键;
  • 即使对空值设置了过期时间,缓存层和存储层之间的数据还是会有一段时间的不一致。需要保持一致性的业务会有影响。

2、缓存雪崩

是指缓存中大批量数据到了过期时间,而查询数据流巨大,引起数据库压力过大甚至down机。和缓存击穿不同的是,缓存击穿是并发查询同一条数据,缓存雪崩是不同数据都过期,很多数据都查不到从而查询数据库;
在这里插入图片描述
  产生雪崩的原因之一,假如马上就要到双十一零点,很快就会迎来一波抢购,这波商品时间比较集中的放入了缓存,假设缓存一个小时。那么到了凌晨一点钟的时候,这批商品的缓存就都过期了。而对这批商品的访问查询,都落到了数据库上,对于数据库而言,就会产生周期性的压力波峰。

解决办法
1、不同分类商品,缓存不同周期。在同一分类中的商品,加上一个随机因子。这样能尽可能分散缓存过期时间,而且,热门类目的商品缓存时间长一些,冷门类目的商品缓存时间短一些,也能节省缓存服务的资源。
2、如果缓存数据库是分布式部署,将热点数据均匀分布在不同的缓存数据库中;
3、设置热点数据永远不过期;
4、使用加锁限流的方式;

3、缓存击穿

缓存中没有但是数据库有的数据,并且某一个key非常热点,在不停的扛着大并发,大并发集中对这一个点进行访问,当这个key在失效的瞬间(一般是缓存时间到期),持续的大并发就穿破缓存,直接请求数据库,就像在一个屏障上凿开了一个洞。

解决方案

  • 设置热点数据永远不过期;
  • 使用互斥锁:在缓存失效的时候,判断拿出来的值为空,不是立即去load db,而是先使用缓存工具的某些带操作成功返回值的操作(比如redis的SETNX)去set一个mutex key。当操作返回成功时,在进行load db操作并回设缓存;否则重试整个get缓存;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值