缓存雪崩
缓存雪崩是指在某一个时刻出现大规模的缓存失效的情况,大量的请求直接打在数据库上面,可能会导致数据库宕机,如果这时候重启数据库并不能解决根本问题,会再次造成缓存雪崩。
为什么会造成缓存雪崩?
一般来说,造成缓存雪崩主要有两种可能
- Redis 宕机了
- 很多 key 采取了相同的过期时间
如何解决缓存雪崩?
- 为避免 Redis 宕机造成缓存雪崩,可以搭建 Redis 集群。
- 尽量不要设置相同的过期时间,可以在原有的过期时间加上随机数。
- 服务降级,当流量达到一定的阈值时,就直接返回“系统繁忙”之类的提示,防止过多的请求直接打在数据库上,这样虽然难用,但是至少可以避免服务器宕机。
缓存击穿
缓存雪崩是大规模的 key 失效,而缓存击穿是一个热点的 key,有大量并发集中对其访问,突然间这个 key 失效了,导致大量并发请求全部打在数据库上, 导致数据库压力剧增,这种现象就叫做缓存击穿。
比较经典的例子就是商品秒杀时,大量的用户在抢某个商品时,商品的 key 突然过期失效了,所有请求都到数据库上了。
如何解决缓存击穿?
- 热点 key 不设置过期时间,避免 key 过期失效。
- 加锁,如果缓存失效的情况,只有拿到锁才能查询数据库,降低了在同一时刻打在数据库上的请求,防止数据库宕机,不过这样会导致系统的性能变差。
缓存穿透
缓存穿透是指用户的请求没有经过缓存而直接请求到数据库上了,比如用户请求的 key 在 Redis 中不存在,或者用户恶意伪造大量不存在的 key 进行请求,都可以绕过缓存,导致数据库压力太大宕机。
如何解决缓存穿透?
- 参数校验,例如可以对用户 id 进行校验,直接拦截不合法的请求。
- 缓存空值,如果某个 key 在 Redis 中不存在,在数据库中也不存在,则把这个 key 值保存到 Redis,设置 value = “null”。
- 布隆过滤器,布隆过滤器可以判断这个 key 在不在数据库中,特点是:如果判断这个 key 不在数据库,那么这个 key 一定不在数据库中,如果判断这个 key 在数据库中,也不能保证这个 key 一定在数据库中。就是会有少数漏网之鱼,造成这种现象的原因是因为布隆过滤器使用了 hash 算法,对 key 进行 hash 时,不同的 key 的 hash 值一定不同,但是相同的 hash 值不能说明这两个 key 相同。