穿透
原因: 客户端一直在查数据库没有的数据,导致没有查缓存然后直接到了数据库。
解决方式: 1. 布隆过滤器 :预先把数据ID全存在过滤器里面(实时更新),当在查缓存为空时,再判断过滤器里面有没 有,没有的话直接返回,有的话再查数据库 。
2. 预存一个空数据然后在击中的时候进行判断
击穿
原因 : 客户端查一个正好过期的value,大量请求进来没有查缓存然后直接到了数据库。
解决方式 : 1.当缓存没有数据时,查数据库的时候加锁,排队只有一个线程拿到锁,然后查数据库更新缓存。其他线程等 待一会,然后再从缓存取。
2.用一个定时器在数据失效的时候定时进行更新
3.设置热点数据永远不过期
雪崩
原因 :大量缓存到期, 客户端大量请求,没有走缓存,直接到数据库,导致数据库奔溃。
解决方式: 1.如击穿
2..分布式部署缓存 过期时间设置随机不固定