缓存穿透
参考
缓存穿透是值缓存和数据库中都没有数据,而用户不断发起请求,如发起id为特别大或者不存在的数据。这时的用户很可能是攻击者,攻击会导致数据库压力过大。
解决办法
- 可以为这些key在缓存中设置对应的值为null,后面查询这个key的时候就不用查询数据库了
boolem Filter
使用不领过滤器,我们把有数据的key
都放在布隆过滤器中,每次查询的时候都先去布隆过滤器中判断,如果没有直接返回null
缓存击穿—大量请求一个key
在高并发的情况下,大量的请求同时查询同一个key时
,此时这个key正好失效了,就会导致同一时间,这些请求都会去查询数据库,这样的现象我们称为缓存击穿
解决办法
采用分布式锁,只有拿到锁的第一个线程去请求数据库,然后插入缓存,当然每次拿到锁的时候都要去查询一下缓存有没有
缓存雪崩
缓存在同一时间大面积的失效,所以后面的请求都会落在数据库上,造成数据库接受大量的请求而崩掉。
解决办法
- 缓存数据的过期时间设置随机,防止同一时间大量数据过期现象发生
- 设置热点数据永不失效
- 如果缓存数据库是分布式部署,将热点数据均匀分布子啊不同的缓存数据库中
ehcache本地缓存 + Hystrix限流&降级
ehcache 本地缓存的目的也是考虑在 Redis Cluster 完全不可用的时候,ehcache 本地缓存还能够支撑一阵
使用 Hystrix进行限流 & 降级 ,比如一秒来了5000个请求,我们可以设置假设只能有一秒 2000个请求能通过这个组件,那么其他剩余的 3000 请求就会走限流逻辑