缓存雪崩(大面积缓存失效,导致数据库请求量过大)
例子:比如对电商首页的热点产品信息,进行了缓存如果查不到则去数据中查找,再加入缓存。则如果12点集中缓存的1小时,到1点钟缓存同时失效,这个时候所有对这批商品的信息查询都会落到库上,对数据库来说抗不住这个大的并发,会导致数据库被打挂,开发又重启了数据库,但是缓存中还是没有数据,这批数据的请求还是落在数据库上,起来后又瞬间挂了
解决方案
对数据进行缓存时,对缓存时间添加一个随机数,这样可以避免缓存同时失效,少量更新缓存
缓存击穿(当个热点数据缓存失效,导致数据库请求量过大)
这个和缓存血本有点像,但又不太一样,这个是当个热点失效,导致大并发直接请求数据库,导致数据库挂了
解决方案
对热点数据永不过期,再数据更新时同时更新缓存
缓存穿透(访问不存在的数据,且没有对其缓存)
业务代码添加缓存一般是一下几个步骤
- 查询缓存是否有数据,有则返回
- 没有则查询数据库
- 数据库中查到则添加到缓存中
- 查到为null则不添加
一般数据库中的id都是大于0的 如果黑客一直使用-1 或者数据库中明显不存在的数据比如说Long的最大值 查询是查不到数据的 会一直请求数据库,数据量大会直接把数据库打挂
解决方案
- 对这些异常数据添加校验,不合法直接跑异常,不再走缓存也不走数据库
- 对null的数据进行缓存,但是时间30s左右,避免数据更新没有发觉