缓存击穿

什么是缓存击穿

  • 发生了高并发时,因为1个key的缓存过期 导致大批量的数据越过了缓存访问到了db层。

解决方案

  • 对并发请求使用分布式锁如redis 的setnx
拿到了拿不到尝试获取key拿到key?直接响应对该操作添加分布式锁从数据库查询并回写到redis中
  • 上述操作存在一个问题,如果redis锁过期了,会导致别的线程乱入,可以这么解决:使用一个线程去获取db,另一个线程check 过期时间 自动给锁续期.

缓存穿透

什么是缓存穿透

  • 发生了高并发时,因为大量系统中不存在的key 打到了系统中导致了系统中压根不存在的数据打到了db层。

解决方案

缓存雪崩

什么是缓存雪崩

  • 发生了高并发时,因为大量key的缓存过期 导致大批量的数据越过了缓存访问到了db层。
  • 和缓存击穿区别是缓存击穿是因为一个key ,雪崩是大量的key

解决方案

准确0点过期

  • 参考击穿的解决方案,利用分布式锁,一个个排着队去获取key。

时长过期

  • 使用随机时间过期策略