共计 788 个字符,预计需要花费 2 分钟才能阅读完成。
一、缓存穿透
缓存穿透是指查问一个数据库肯定不存在的数据。
咱们以前失常的应用 Redis 缓存的流程大抵是:
1、数据查问首先进行缓存查问
2、如果数据存在则间接返回缓存数据
3、如果数据不存在,就对数据库进行查问,并把查问到的数据放进缓存
4、如果数据库查问数据为空,则不放进缓存
例如咱们的数据表中主键是自增产生的,所有的主键值都大于 0。此时如果用户传入的参数为 -1,会是怎么样?这个 -1,就是肯定不存在的对象。程序就会每次都去查询数据库,而每次查问都是空,每次又都不会进行缓存。如果有人歹意攻打,就能够利用这个破绽,对数据库造成压力,甚至压垮咱们的数据库。
为了避免有人利用这个破绽歹意攻打咱们的数据库,咱们能够采取如下措施:
如果从数据库查问的对象为空,也放入缓存,key 为用户提交过去的主键值,value 为 null,只是设定的缓存过期工夫较短,比方设置为 60 秒。这样下次用户再依据这个 key 查问 redis 缓存就能够查问到值了(当然值为 null),从而爱护咱们的数据库免遭攻打。
二、缓存雪崩
缓存雪崩,是指在某一个时间段,缓存集中过期生效。在缓存集中生效的这个时间段对数据的拜访查问,都落到了数据库上,对于数据库而言,就会产生周期性的压力波峰。
为了防止缓存雪崩的产生,咱们能够将缓存的数据设置不同的生效工夫,这样就能够防止缓存数据在某个时间段集中生效。例如对于热门的数据(拜访频率高的数据)能够缓存的工夫长一些,对于冷门的数据能够缓存的时间段一些。甚至对于一些特地热门的数据能够设置永不过期。
三、缓存击穿
缓存击穿,是指一个 key 十分热点(例如双十一期间进行抢购的商品数据),在不停的扛着大并发,大并发集中对这一个点进行拜访,当这个 key 在生效的霎时,继续的大并发就穿破缓存,间接申请到数据库上,就像在一个屏障上凿开了一个洞。
咱们同样能够将这些热点数据设置永不过期就能够解决缓存击穿的问题了。