缓存穿透
原因:
穿透,透的是缓存层,到了数据库。
用户的请求,没有命中缓存层,直接查询到数据库,且数据库也没有,不能缓存到缓存里面。
类似查询id为一个不存在的ID :-1。 会导致恶意攻击
解决办法
对数据库查询不到的值,或者是查询的值为 null 的 情况下,也缓存一下。时间可以稍微短一点,30秒或者60秒,业务上做一下控制,不做实时性这么高。
缓存雪崩
原因:
雪崩,一大片的雪,同一个时间奔溃。 意思是,同一个时间点,大批量的数据在 缓存中失效,导致大批量的请求同一个时间都直达数据请求数据
查询量过大,导致down机
解决办法:
人为控制,key的失效时间错开
数据不设置过期时间,定时任务去刷新缓存里面的数据。(依赖业务)
缓存击穿
原因:
击穿,和穿透的概念不好区别。我的理解是 击穿是需要很大的力,穿透稍微缓和一点。
所以击穿是同时大量的请求。 实际的情况是,数据库中有数据,缓存中数据在某一个点失效了。集中去请求数据库了。
解决办法
设置数据不过期,定时任务去刷新
对数据库请求,加锁