Redis缓存异常

缓存雪崩

大量缓存数据在同一时间过期或者Redis服务器宕机的时候,如果此时有大量的用户请求,会造成无法在Redis里面处理,于是全部都请求在了MySQL数据库上面,数据库不堪重负,系统崩溃。

针对大量数据同时过期解决办法有以下几种:

  1. 均匀随机设置过期时间
  2. 互斥锁;也业务线程在处理用户请求的时候,如果发现访问的数据不在Redis里面,那就给这个数据加上一个互斥锁,保证在同一时间内只有一个请求在构建缓存,构建完成之后再释放锁。 未能够获取互斥锁的请求,要么堵塞等待,要么直接返回空值或者是默认值
  3. 后台更新缓存

针对Redis故障宕机而引发的缓存雪崩问题解决方法:

  1. 服务熔断或者请求限流
  2. 构建Redis缓存高可用集群

缓存击穿

如果缓存中的某个热点数据过期了,此时有大量的请求访问了该热点数据,缓存失效,直接访问数据库,数据库很容易不堪重负,这就是缓存击穿,缓存击穿是缓存雪崩的一个子集。

解决方案两种:

  1. 互斥锁
  2. 后台异步更新缓存

缓存穿透

缓存雪崩或者是击穿的时候,数据库内部最终还是存储了需要的数据,如果一旦恢复了相应的缓存,就可以减轻数据库的压力。

但是缓存穿透就不一样了,缓存穿透既不在缓存中,也不在数据库中,最终大量请求把数据库搞崩溃了。

一般缓存穿透的发生有两种情况:

  • 业务误操作
  • 黑客恶意攻击

解决办法:

  • 非法请求限制
  • 缓存空值或者默认值
  • 使用布隆过滤器来快速判断数据是否存在,避免通过查询数据库来判断数据是否存在

你可能感兴趣的:(Redis,缓存,redis,数据库)