一、缓存雪崩
什么是缓存雪崩
缓存中某一时间大面积热点数据失效。
如果我们的缓存挂掉了,这意味着我们的全部请求都跑去数据库了。
我们都知道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、加互斥锁。多线程同时去查询数据库,那么我们就可以在第一个查询数据库请求使用互斥锁来锁主它, 其他线程拿不到锁就会等着,等第一个线程查询到了数据,然后做了缓存,后面线程就会直接走缓存了。
当前共有 0 条评论