Redis缓存雪崩与缓存穿透

1、什么是缓存雪崩?

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

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

2、如何解决缓存雪崩?

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

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

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

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

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

3、什么是缓存穿透?

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

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

4、如何解决缓存穿透?

  两种方案:

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

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

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

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

猜你喜欢

转载自www.cnblogs.com/in-the-game-of-thrones/p/11495213.html