一、缓存雪崩

什么是缓存雪崩

缓存中某一时间大面积热点数据失效。

如果我们的缓存挂掉了,这意味着我们的全部请求都跑去数据库了。

我们都知道Redis不可能把所有的数据都缓存起来,这样会很浪费内存,所以Redis需要对数据设置过期时间,并采用的是惰性删除+定期删除两种策略对过期键删除。

如果缓存数据设置的过期时间是相同的,并且Redis恰好将这部分数据全部删光了。这就会导致在这段时间内,这些缓存同时失效,全部请求到数据库中。

如何解决缓存雪崩

1、缓存数据的过期时间设置随机,防止同一时间大量数据过期现象发生
2、缓存预热 (定期或者在业务低峰期手动预先查询并加载缓存数据)
3、实现Redis的高可用(主从架构+Sentinel 或者Redis Cluster),尽量避免Redis挂掉

缓存穿透

什么是缓存穿透

比如,我们有一张数据库表,ID都是从1开始的(正数),每次请求的ID都是负数。这会导致我的缓存就没用了,请求全部都找数据库去了,但数据库也没有这个值啊,所以每次都返回空出去。

缓存穿透是指查询一个一定不存在的数据。由于缓存不命中,并且出于容错考虑,如果从数据库查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到数据库去查询,失去了缓存的意义。

这就是缓存穿透:

请求的数据在缓存大量不命中,导致请求走数据库。
缓存穿透如果发生了,也可能把我们的数据库搞垮,导致整个服务瘫痪!

如何解决缓存穿透

1、校验请求参数的合法性,不合法的就不让他访问数据库
2、当我们从数据库找不到的时候,我们也将这个空对象设置到缓存里边去。下次再请求的时候,就可以从缓存里边获取了。(这种情况我们一般会将空对象设置一个较短的过期时间。)
3、利用布隆过滤器

布隆过滤器:

它是一种基于概率的数据结构可以用来快速检测一个元素是否存在一个集合中,但是判断存在不一定真存在,判断不存在则一定不存在。
Redis布隆过滤器在Redis 4.0版本中被引入。

关于布隆过滤器详细讲解文章:传送

缓存击穿

缓存中某一个热点Key突然失效。

当某一个 key 非常热,访问非常频繁,处于集中式高并发的情况,当这个key在失效的瞬间,大量的请求就击穿了缓存,直接请求数据库。

如何解决缓存击穿

1、将该热点数据设置为永不过期
2、加互斥锁。多线程同时去查询数据库,那么我们就可以在第一个查询数据库请求使用互斥锁来锁主它, 其他线程拿不到锁就会等着,等第一个线程查询到了数据,然后做了缓存,后面线程就会直接走缓存了。