Redis缓存雪崩与缓存穿透

谁都会走 提交于 2019-11-29 08:37:51

1、什么是缓存雪崩?

  比如:Redis不可能把所有的数据都缓存起来,所有redis需要对数据设置过期时间,并且采用惰性删除与定时删除两种策略对过期键删除。如果缓存数据设置的过期时间都是相同的,并且redis恰好将这部分的数据都删除了,这就造成了缓存全部失效,所有的请求都跑到数据库中。

总而言之:就是我们的缓存数据库(Redis)挂掉了,全部的请求都跑到数据库中。

2、如何解决缓存雪崩?

  在给缓存设置一个随机的过期时间,这样可以减少缓存在同一个时间点过期。

  当redis挂掉了,可以分为三个点解决:

  1)在事发前,实现redis的高可用,尽量避免redis挂掉的情况发生

  2)在事发时,可以设置本地缓存与限流机制,尽最大的可能防止数据库GG

  3)在事发后,redis持久化,重启后自动从磁盘加载数据,快速的恢复到灾难前状态。

 

3、什么是缓存穿透?

  缓存穿透指的是查询一个一定不存在的数据。因为处于容错性考虑,当缓存中没有这个数据时,则就会从数据库中找,如果数据库中找不到也就不会保存到缓存中。这就造成了这个不存在的数据每次请求都连接数据库,到数据库中找,失去了缓存的意义。

总而言之:就是请求的数据在缓存中大量不命中,导致请求都走数据库。

4、如何解决缓存穿透?

  两种方案:

1)如果请求的数据时不合法的,不存在的,则可以使用布隆过滤器(BloomFilter)提前拦截,不合法的就不让这个请求到数据库层。

2)当请求的数据找不到的时候,可以将这个空的对象保存到缓存中(一般设置一个较短的过期时间),当再次请求的时候可以从缓存里边拿到了。

 

5、什么是缓存与数据库双写一致?

  当我们需要更新数据的时候,很多情况都会造成数据库和缓存中的数据不一致。从理论上来说,只要设置了过期时间,就能保证缓存和数据库中的数据最终是一致的。只要缓存数据过期了,就会被删除,随后读的时候,就会查找数据库的数据,将数据读取写入到缓存中。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!