缓存中的问题

缓存中的问题

缓存穿透

原因:

查询数据库中肯定不存在的数据,多次查询造成数据库压力过大。
一般我们一次查询的请求流程是,先去查询缓存中是否有数据,如果没有就去数据库中查,然后将查询的数据写到缓存中。
如果有人恶意查询,比如像id=-1的数据库中肯定不存在。那么在大量请求查询id=-1的情况下,就会给数据库造成巨大的压力,甚至可能崩溃,这就是缓存穿透带来的问题。简单说就是查询数据库中肯定没有的数据,缓存相当于被绕了过去,直接给服务器造成巨大压力,这就是缓存穿透。

解决:

数据库中查询不存在的数据时校验查询字段,或以Null的形式写到缓存中去。但是光这样做还是存在很大的问题,如果给缓存中写入了Null,一直保存Null也会给其他用户产生问题,所以在这里建议给缓存中写入Null的数据设置较短的过期时间,这样既能防止缓存穿透带来的服务器压力问题,也可以防止影响其他用户。

缓存击穿

原因:

一条数据被大量的请求频繁查询,也就是一条热点信息。在某一个时间节点时,缓存过期。那么此时这些请求就会大量涌入直接访问数据库,给服务器带来巨大的压力,这就是缓存击穿。

解决:

最简单的办法当然是给热点数据在缓存中设置成永不过期就好了,这已经满足了大部分公司的需求。
而对于极少数并发量数据量极高的公司可以加上互斥锁来解决缓存击穿问题,具体步骤如下:

  1. 请求过来,先去缓存中查询是否有数据
  2. 没有数据,则获取锁,然后去数据中取数据,写入到缓存中
  3. 若获取锁失败,则等待一段时间再发起请求

缓存雪崩

原因:

缓存中数据的key大量同时间过期,导致大量请求直接访问数据库,造成数据库压力过大甚至有宕机的风险。

解决:

在设置key的过期时间时,设计为一个随机的数,防止key同时过期。也可以将部分热点数据设置成永不过期来防止雪崩。如果系统部署了多个服务器,则可以将需求量大的热点数据放置在不同的服务器上,避免过期后的访问量过大。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值