一、缓存穿透:
描述:
缓存穿透是指数据在缓存和数据库中都没有的现象。若不断发起请求,如id为 “-1” 的数据或id为特别大不存在的数据,这时的用户很可能是攻击者,攻击会导致数据库压力过大。
解决方案:
(1)接口层增加校验,id<=0的直接拦截;
(2)从缓存取不到的数据,在数据库中也没有取到,这时也可以将key-value对缓存为key-null,有效时间可以设置稍短,如30秒(设置太长会导致正常情况也没法使用)。这样可以防止攻击用户反复用同一个id暴力攻击。
二、缓存击穿:
描述:
缓存击穿是指数据在缓存中没有但存在于数据库中的现象(一般是缓存到期)。此时若有大量并发请求过来,由于缓存中没有数据,只能转而去数据库获取,造成数据库服务器压力瞬间剧增。
解决方案:
(1)设置热点数据永不过期;
(2)引入互斥锁(如图1所示):
三、缓存雪崩:
描述:
缓存雪崩是指缓存中大量数据到达过期时间,使得瞬间访问数据库的请求剧增,导致数据库服务器压力过大甚至宕机的现象。和缓存击穿不同的是,缓存雪崩是因为大量数据同时过期,而缓存击穿是因为某一时刻大量请求去获取同一数据。
解决方案:
(1)给缓存过期时间加上随机因子,避免数据大面积失效 或 统一规划有效期,使得失效时间均匀分布;
(2)如果缓存数据库分布式部署,考虑将热点数据均匀分布在不同缓存数据库中;
(3)配置二级缓存;
(4)设置热点数据永不失效;