1.缓存穿透:请求访问了缓存中没有的数据,或者缓存宕机,导致请求直接查db。
解决办法:把没有的数据也缓存一分,但是设置较短的缓存时间。
2.缓存雪崩:由于大量的缓存设置了相同的过期时间,导致再同一时刻,大面积的缓存失效,会出现请求不命中,导致去访问数据库。
解决办法:修改过期时间,加随机数,尽量保证不是同一时间过期。
3.缓存击穿:应用中一些热点有很高的访问量,缓存过期时也会导致大量请求到发数据库,导致数据库不可用。
解决办法:分布式锁,可以借用redis的setnx实现最简单的分布式锁,这样只有持锁的请求能到达数据库,然后查完数据后别忘了更新缓存!!后面的请求再一查缓存就有数据了,不用再去获取锁!
4.还有些问题:获取锁后长时间没有释放,怎么办?比如再做一个十分复杂的业务,5分钟没有响应,而其他请求也不能获取锁!!!该怎么处理呢
解决办法,用setnxex带有过期时间,而且是原子操作。当由于各种原因持时间过长就会锁失效!
5.其中缓存雪崩和缓存击穿很像,但是缓存失效面积不同,雪崩指的是大面积,击穿指的是某一点!