Redis-缓存穿透、缓存崩溃、缓存击穿

本文主要介绍Redis中缓存穿透、缓存崩溃和缓存击穿

缓存

缓存的作用?

一般情况下,用户请求到后台,会先从缓存中取数据。如果在缓存中取到数据,就直接返回
结果;如果取不到数据就需要查询数据库,从数据库中取到数据后会同步更新到缓存,并返回结果。下一个用户就可以直接从缓存中取值了。那如果在数据库也没有取到,就只能直接返回空结果。
所以,缓存主要的作用就是缓解数据的负载压力,提升请求响应效率。

缓存穿透

什么是缓存穿透?

缓存穿透:指查询一个一定不存在的数据,由于缓存是不命中时需要从数据库
查询,查不到数据则不写入缓存
,这将导致这个不存在的数据每次请求都要到
数据库去查询,进而给数据库带来压力。

缓存产生原因?

  • 业务设计不合理:比如大多数用户都没开守护,但是你的每个请求都去缓存,查
    询某个 userid 查询有没有守护。
  • 业务/运维/开发失误的操作:比如缓存和数据库的数据都被误删除了。
  • 黑客非法请求攻击:比如黑客故意捏造大量非法请求,以读取不存在业务数据。

如何避免缓存穿透?

一般有三种方法:

  1. 接口参数校验:如果是非法请求,我们在 API 入口,对参数进行校验,过滤非法值。对某些IP进行处理,加入黑名单。
  2. 缓存空值:如果查询数据库为空,我们可以给缓存设置个空值,或者默认值。但是如果有写请求进来话,需要更新缓存,以保证缓存一致性,同时,最后给缓存设置适当过期时间(比如30s)。这样可以防止攻击用户反复用一个id暴力攻击。
  3. 布隆过滤器:使用布隆过滤器快速判断数据是否存在。即一个查询请求过来时,先通过布隆过滤器判断值是否存在,存在才继续往下查。将所有可能存在的数据哈希存到一个足够大的 中,一些一定不存在的数据会被这个bitmap拦截掉,从而避免了对底层存储系统的查询压力。

缓存雪崩

什么是缓存雪崩?

缓存雪奔: 指缓存中数据大批量到过期时间,而查询数据量巨大,请求都直接
访问数据库,引起数据库压力过大甚至 down 机,导致数据库无法使用。

如何解决缓存雪崩?

  1. 使用同步锁控制查询数据库的线程,如果并发量不是很高,可以采用队列和锁
    使用同步锁控制查询数据库的线程,只允许有一个线程去查询数据库,查询得到数据后存入缓存。
  2. 对同一类信息key设置不同的过期时间
    在同一类key上设置过期时间时,加上一个随机时间,使它们的过期时间不相同。
  3. 缓存预热
    不用等到请求到来再去查询数据库存入缓存,可以提前将数据存入缓存。使用缓存预热机制通常有专门的后台程序去将数据库的数据同步到缓存,并采用自动续期。
  4. 如果缓存数据库是分布式部署的,可以将热点的数据打散均匀分布到多个节点中

缓存击穿

什么是缓存击穿?

缓存击穿:是指缓存中没有或者已经到期但是数据库中有的数据,这时由于并发用户特别多,
同时在缓存中又没有读到数据,所以直接去数据库中取数据,引起数据库压力瞬间增大。和缓存雪崩不同的是,缓存击穿指并发查询同一条数据,缓存雪崩是不同数据都过期了,大面积数据都查询不到,从而查询数据库。

如何解决缓存击穿?

  1. 使用互斥锁方案
    缓存失效时,不是立即去加载数据库数据,而是先使用某些带成功返回的原子操作命令,如(Redis ✁ setnx)去操作,成功的时候,再去加载数据库数据和设置缓存。否则就去重试获取缓存。
  2. 热点key永不过期
    是指没有设置过期时间,但是热点数据快要过期时,异步线程去更新和设置过期时间。
  3. 做好熔断、降级,防止系统崩溃

猜你喜欢

转载自blog.csdn.net/baidu_33256174/article/details/131864812
今日推荐