缓存的穿透、击穿、雪崩的概念及解决方案

1.缓存领域相关的概念

1.1.缓存命中:数据存在于缓存中,不需要从数据库取

1.2.Cache miss:数据不存在于缓存中,需要从数据库取,如果还有缓存空间,一般会把取到的数据加入到缓存

1.3.存储成本:缓存未命中时,将从数据库取得的数据加入到缓存所需要的时间和空间,称为缓存成本

1.4.缓存失效:数据库中的数据发生变化时,缓存中对应的数据即为失效数据

1.5.缓存污染:将不经常访问的数据放置到缓存中,致使高频访问数据无法放入缓存

1.6.替代策略:当缓存空间不足时,需要删除缓存空间中已有的数据,选择删除数据的策略为替代策略

 

2.缓存场景

2.1.缓存穿透

现象:每次请求都无法在缓存中找到数据,需要直接查数据库,增加了数据库压力

原因:通常对于在缓存中找不到的数据,一般的做法是去查找数据库,将查到的数据加入到缓存中,但如果数据库也查不到,就不会被加入到缓存,所以对于不存在的key,每一次请求都会直接查数据库,故缓存被穿透,形同虚设

解决方案:

a.保存所有有效的key,过滤掉不存在的key

b.如果缓存空间够大,从数据库查不到数据时,保存一个空对象到缓存中

c.针对业务场景对请求的参数进行有效性校验,过滤非法请求

 

2.2.缓存击穿

现象:当某一个key失效时,造成大量请求到数据库

原因:为了保证缓存数据的时效性,通常会设置一个有效时间,如果是热点key,在热点key失效时,高并发时会有大量请求越过缓存层到数据库

解决方案:

a.使用互斥锁,当缓存数据失效时,保证只有一个请求能访问数据库,并更新缓存

b.设置缓存数据永不过期。但是这样会造成缓存失效的问题,所以可以在缓存数据失效之前,用异步的方式提前更新缓存

 

2.3缓存雪崩

现象:多个key失效,造成大量请求到数据库

原因:在设置缓存时采用了相同的过期时间,导致多个缓存数据在某一个时刻同时失效,大量请求到数据库

解决方案:

a.使用互斥锁,保证对于同一个key,只有一个请求能到数据库

b.在统一的失效时间的基础上,加上一个随机值

c.在缓存数据失效前,用异步的方式提前更新缓存

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值