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.在缓存数据失效前,用异步的方式提前更新缓存