缓存穿透
当用户想到查询的key的值,在redis 中查询不到时,而这时有大量的请求访问这个key,会导致缓存没有命中,从而去访问数据库,这时会给数据库带来很大的查询压力,从而导致性能下降
解决方式
1 布隆过滤器 :布隆过滤器是一种数据结构,对所有可能查询到的参数多是以hash的方式去存储,先在控制层进行校验,不符合的话,则丢弃,这就避免了对底层存储系统的压力
2 缓存空的对象
缓存击穿
某个key在失效的瞬间,有大量的请求访问这个key,这种数据又是热点数据 ,由于当前key在缓存过期的瞬间,请求会同时访问到持久化的数据库来查询数据,并且会将数据写回缓存,此时就会导致数据库瞬间的压力过大,导致击穿
解决方式
1 将热点数据设置不过期,不设置过期时间,就不会出现热点 key 过期的瞬间造成问题
2 加锁,保证对于每一个 key ,同时只有一个服务进行访问,其他的服务没有获取到锁,就不能访问 redis 的这个 key,那么就需要等待获取锁
缓存雪崩
就是在某一个时间段,缓存集中过期,或者 redis 宕机的情况会出现
解决方式
1 将 redis 做成高可用的
搭建 redis 集群,异地多活,既然担心 redis 会挂,那么我们就多准备一些 redis ,做成主备,或者异地多活
2 限流降级
就是在缓存失效的时候,通过锁的方式来限制访问数据顺序,或者关掉一些不重要的服务,让资源和性能全力提供给我们的主要服务
3 做数据预热
数据预热就是咱们在正式要上线之前,咱们就先将需要访问的数据预先访问一次,这样就可以将大量要访问数据库的数据写到缓存中
这样就可以在即将发生的高并发访问数据前手动的触发并加载不同的 key ,且会设置不同的过期时间,主要是可以将缓存失效的事情均衡一些,这样就尽量避免掉大量的 key 集中过期的情况