缓存穿透,缓存击穿,缓存雪崩问题及其解决方案
1.缓存穿透:
缓存和数据库中都没有的数据,而用户不断发起请求,如发起id为-1的数据或特别大不存在的数据,这时的用户很有可能数攻击者,攻击会导致数据库压力过大,如下面的代码就存在缓存穿透的问题:
用户controller不断的访问这个方法,缓存中没有数据库也没有就会一直去数据库查询,数据库压力变大。
解决方案:
1.接口层加校验,如用户鉴权校验,id做基础校验,id < 0 的直接拦截。
2.从缓存取不到的数据,在数据库中也没有取到,这时可以将 key-value对写为 key-0,可以防止攻击用户反复的使用同一个 id 暴力攻击,代码示例:
3.使用缓存预热,就是将数据提前加入到缓存中,当数据发生变更,再讲最新的数据更新到缓存。即将数据库的数据先导入缓存,查询的时候直接去缓存中查,不去数据库查,缓存中查不到也不再向数据库查,缓存中没有就是没有。
2.缓存击穿
缓存击穿是指缓存中没有但数据库中有的数据,这是由于并发用户特别多,同时读缓存没读到数据,又同时去数据库中去读数据,引起和数据库压力瞬间增大。
如以下代码会造成缓存击穿:
在某一个时间大量用户访问这个方法,查到的数据为空,大量请求再去数据库查,造成数据库压力过大。
解决方案:
1.设置热点和数据永不过期。
2.缓存预热
3.缓存雪崩
缓存雪崩是指缓存数据大批量到过期时间,而查询量巨大,引起数据库压力过大,和缓存击穿不同的是,缓存击穿是指并发查同一条数据,缓存雪崩是不同数据都过期了,很多数据都查不到从而聪数据库查。
解决方案:
1.缓存数据的过期时间设置伪随机,防止同一时间大量数据发生过期现象产生。
2.设置热点数据永不过期。
3.使用缓存预热。