redis高频面试题终结解决方案

62 阅读3分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第7天,点击查看活动详情

redis 常见问题

  • 之前我们了解了redis 为什么能够这么受欢迎,同时也分析了为什么mongo似乎不是很火, 今天我们来看看redis会出现哪些极端情况的下问题吧。

  • 首先我们提到的就是缓存穿透,然后是缓存击穿,最后就是灾难--缓存雪崩。

一、缓存穿透

  • 缓存穿透通常指的就是名存实亡,就是使用了redis但是每次缓存无法命中,导致最终的请求还是落到的数据库上,表现出的就是redis给人感觉不作为。用你和没用是一样的。
  • 造成这种情况的就是我们程序员预判不够准确,某些数据明明很收欢迎,但是却没有选择缓存到redis中,这就导致了缓存穿透。
  • 解决办法也很好结局,就是我们将我们需要的key对应的数据填充到缓存即可。
  • 但是还是会存在一个问题就是,比如我们接口通过用户名访问信息,这个时候我们就是通过用户名进行存储在redis中,但是黑客通过不存在的用户名不断的访问接口,这样就造成我们数据库也不存,自然redis就不存在,redis不存在了那么并发接口自然就到了数据库的压力,针对这种恶意情况我们可以将在没哟数据的情况下,将key存储到redis中同时存储一个空值,这样就可以利用redis阻挡部分压力了。

   二、缓存击穿

  • 缓存击穿呢就是说当请求进来的时候redis中的确存储过,但是已经过期了。在过期--重新生成这个阶段恰巧有了大量的请求,暗那么这个阶段压力还是需要数据库自己抗的。 解决方法

  • 那上述的场景该如何解决呢?我们可以让并发的请求串行化,就是接口首先是访问redis的,发现没有此时只需要1个线程去访问数据库同时像redis中生成缓存数据,其他线程就原地等待redis中有数据之后在重新访问redis,这样就能够拿到数据了。

  • 还有一种解决方案就是设置key永远不过期

三、缓存雪崩

  • 指在系统运行过程中,缓存服务宕机或大量的key值同时过期,导致所有请求都直接访问数据库导致数据库压力增大。

  • 想要解决缓存雪崩就不好做了,或者说解决之后无法有效进行验证了,因为我们需要打乱key的分布,以及过期时间也让他随机分布。