正常的缓存,查到返回,查不到就null的,而没有缓存key,持续大量请求,都查询到数据库了。
这个也类似网页端的DDOS攻击
时间太久远差点记不起来了。
类似这样的攻击,都与缓存中第一个问题还是有相似之处,因为都是恶意人为的攻击。
缓存穿透
(根据某个key查不到缓存的数据,用户不会一直请求,额外情况是也许不是恶意的,比如taobao的秒杀活动和其它优惠限时限量活动,12306的抢票,用户还是需要刷网页或者刷某个接口的)
第一种缓存问题 缓存穿透的解决方式
TTL:
当 key 不存在时,返回 -2 。 当 key 存在但没有设置剩余生存时间时,返回 -1 。 否则,以毫秒为单位,返回 key 的剩余生存时间。
注意:在 Redis 2.8 以前,当 key 不存在,或者 key 没有设置剩余生存时间时,命令都返回 -1 。
redis> FLUSHDB
OK
redis> TTL key
(integer) -2
# key 存在,但没有设置剩余生存时间
redis> SET key value
OK
redis> TTL key
(integer) -1
# 有剩余生存时间的 key
redis> EXPIRE key 10086
(integer) 1
redis> TTL key
(integer) 10084
ps:话说有些教程网站上的编辑啊真不用心
推荐的redis教程还是cn官方好 https://www.redis.net.cn/
缓存的第二个问题
缓存雪崩
缓存雪崩的问题就是说很多TTL设定的规格一致,失效时都失效,造成数据库的大面积压力
解决方式是错开TTL设定的时长
3
缓存击穿
缓存击穿是说,这个key有,但是一旦过期失效时,特大量请求贯穿而入,导致数据库的压力
“在一张薄膜纸上凿出了一个洞️”
解决方式:设定这个热点的key 不过期