redis缓存击穿-缓存雪崩-缓存穿透

redis

缓存击穿

场景

  1. redis中某一个热点key过期
  2. 这个时候大量客户访问到该热点key,但是热点key过期了
  3. 在数据库同步缓存的过程中(这个时间段,大量请求打到了DB上)

类似于“某男明星塌房事件”上了热搜,这时候大量的“粉丝”都在访问该热点事件,但是可能优于某种原因,redis的这个热点key过期了,那么这时候大量高并发对于该key的请求就得不到redis的响应,那么就会将请求直接打在DB服务器上,导致整个DB瘫痪。

解决方案

  1. 提前对热点数据进行设置

类似于新闻、某博等软件都需要对热点数据进行预先设置在redis中

  1. 监控数据,适时调整

监控哪些数据是热门数据,实时的调整key的过期时长

  1. 使用锁机制

只有一个请求可以获取到互斥锁,然后到DB中将数据查询并返回到Redis,之后所有请求就可以从Redis中得到响应

缓存雪崩

场景

  1. redis中大量key集体过期

当服务启动的时候,大量热点数据设置的过期时长一至的话,可能会导致大量key在同期失效,这个时候大量数据会直接打到DB上,造成缓存雪崩

当redis中的大量key集体过期,可以理解为redis中的大部分数据都被清空了(失效了),那么这时候如果有大量并发的请求来到,那么redis就无法进行有效的响应(命中率急剧下降),请求就都打到DB上了,到时DB直接崩溃

解决方案

  1. 将失效时间分散开

通过使用自动生成随机数使得key的过期时间是随机的,防止集体过期

  1. 使用多级架构

使用nginx缓存+redis缓存+其他缓存,不同层使用不同的缓存,可靠性更强

  1. 设置缓存标记

记录缓存数据是否过期,如果过期会触发通知另外的线程在后台去跟新实际的key

  1. 使用锁或者队列的方式

如果查不到就加上排它锁,其他请求只能进行等待

缓存穿透

场景

  1. 大量请求根本不存在的key
  2. 请求读取缓存的时候,缓存没有,然后直接穿透到了DB上
  3. DB上读取的数据是空的,但是空的数据没有做缓存
  4. 这样就会一直穿透打到DB上

解决方案

  1. 对空值进行缓存

数据库中没有id=-3872的用户的数据,但是在redis中对他进行缓存(key=-3872,value=null),这样当请求到达redis的时候就会直接返回一个null的值给客户端,避免了大量无法访问的数据直接打在DB上

  1. 实时监控(配合运维人员设置黑名单)

对redis进行实时监控,当发现redis中的命中率下降的时候进行原因的排查,配合运维人员对访问对象和访问数据进行分析查询,从而进行黑名单的设置限制服务(拒绝黑客攻击)

  1. 使用布隆过滤器

使用BitMap作为布隆过滤器,将目前所有可以访问到的资源通过简单的映射关系放入到布隆过滤器中(哈希计算),当一个请求来临的时候先进行布隆过滤器的判断,如果有那么才进行放行,否则就直接拦截

注意事项

  1. 使用空值作为缓存的时候,key设置的过期时间不能太长,防止占用太多redis资源
  2. 对空值缓存是一种被动的防御方式,当遇到黑客暴力请求很多不存在的数据就需要写入大量的null值到Redis中,可能导致Redis内存占用不足的情况
  3. 使用布隆过滤器,可以在用户访问的时候判断该资源是否存在,不存在则直接拒绝访问
  4. 布隆过滤器是有一定的误差,所以一般需要配合一些接口流量的限制(规定用户在一段时间内访问的频率)、权限校验、黑名单等来解决缓存穿透的问题
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值