缓存穿透、缓存击穿和缓存雪崩
缓存穿透
缓存穿透是指缓存和数据库中都没有的数据,而用户不断发起请求,如发起为id为“-1”的数据或id为特别大不存在的数据。这时的用户很可能是攻击者,攻击会导致数据库压力过大。
解决方案:
1 接口层增加校验,如用户鉴权校验,id做基础校验,id<=0的直接拦截;
2 从缓存取不到的数据,在数据库中也没有取到,这时也可以将key-value对写为key-null(即把该key缓存起来值为null),缓存有效时间可以设置短点,如30秒(缓存NULL的时间不能太长,否则NULL数据长时间得不到更新),这样可以防止攻击用户反复用同一个id暴力攻击。
3 布隆过滤器
缓存击穿
在高并发下,对同一个特定的值(热点数据)进行查询,但是这个时候缓存正好过期了,缓存没有命中,导致大量请求直接落到数据库上。
解决方案:
1. 设置热点数据永远不过期。
缓存雪崩
是指在某一个时间段,缓存集中过期失效,引起数据库压力过大甚至down机。
解决方案:
1. 缓存数据的过期时间设置随机,防止同一时间大量数据过期现象发生。
2. 设置热点数据永远不过期。
缓存预热
当系统上线前,需要先把缓存数据加载到缓存,不然系统一启动缓存都是空的全部都要查数据库,数据库压力会突然增大,甚至宕机。