一.缓存击穿
1.当用户根据key查询数据时,先查询缓存,如果缓存有命中,返回。
2.但是如果缓存没有命中直接穿过缓存层,访问数据层,如果有,则存储 至缓存。
3.但是同样如果没有命中(也就是说数据库也没有数据)直接返回用户,但是不缓存。
总结:如果某一个key请求量很大,但是存储层也没有数据,大量的请求都会达到存储层就会造成数据库压力巨大,有可能宕机的情况。
解决:
1.当缓存中没有命中的时候,从数据库获取。
2.当数据库中也没有数据的时候,我们直接将null作为值设置Redis中的Key上。
3.这时如果没有数据,一般情况下都需要设置一个过期时间,例如:5分钟失效。
4.返回给用户,当用户再次访问时,已经有了key,此时key的值时null而已,这样就可以缓存中命中,解决了缓存穿透的问题。
二.缓存穿透
是指缓存和数据库中都没有的数据,而用户不断发送请求,如发起id为“-1”的数据或者id为不存在的数据。这时用户很可能时攻击者,攻击会导致数据库压力过大。
解决:利用缓存预热,缓存预热就是将数据提前加入到缓存中,当数据发生变更,再将最新的数据更新到缓存。
三.缓存雪崩
缓存雪崩是指缓存数据大批量到过期时间,而查询数据量巨大,引起数据库压力过大至宕机,和缓存击穿不同的时,缓存击穿指并发查同一条数据,缓存雪崩是不同数据都过期了,很多数据都查不到从而查询数据库。
解决:
1.设置热点数据永远不过期。
2.缓存预热。
3.其他等等。