参考资料:《Redis开发与运维》、《数学之美》
缓存的好处
1.减少数据库压力(减少数据库连接)
2.减少计算过程(缓存异构数据)
3.提高查询响应速度(Redis基于内存的kv缓存)
缓存层开发的常规流程
1.客户端请求查询数据
2.根据参数key查询缓存
3.如果存在数据,直接返回结果
4.如果不存在数据,查询数据库
5.如果数据库查询结果不为空,则将返回值写入缓存层(并设置超时时间)
什么是缓存穿透?
缓存穿透是指,查询一个根本不存在的key,缓存层与存储层均不会命中。通常,存储层查不到数据,则不会写入缓存层。
关键点:
1.key根本不存在
2.缓存层未命中
3.存储层未命中,不会将空值更新至缓存层
4.返回空结果
后果:
缓存穿透致使每次请求都将到存储层查询数据,是缓存失去了屏障的意义。进而使后端存储层负载加大,最坏结果将导致后端存储宕掉(即缓存雪崩)。
原因:
1.自身业务代码或者数据出现问题
2.恶意攻击或爬虫造成大量空命中
避免(监控):
可以再程序中对总调用数、缓存命中数、存储层命中数进行统计、监控、预警。
解决:
1.缓存空值,顾名思义,将缓存层、存储层均未命中的数据,缓存至缓存层,即key-null,但是这也意味着占用了更多的缓存空间,如果存在恶意攻击,后果更加严重,引起缓存污染,缓存中几乎没有有效数据。
2.布隆过滤器,bloom filter实际是由一个很长的二进制向量和一系列的随机映射函数(Hash)构成。将存在的key保存到布隆过滤器中做第一层拦截,如果key不存在,就不会访问存储层。
什么是缓存击穿?
缓存击穿,是指一个key非常热点,经常扛着高并发的访问,由于缓存数据存在生命后期(或超时剔除),当这个key在失效的瞬间,导致高并发的访问击穿缓存层,直接请求存储层,就像在一个屏障上凿开了一个洞口。
关键点:
1.热点key
2.超时剔除,瞬间失效
后果:
同理,使后端存储层负载加大,最坏结果将导致后端存储宕掉(即缓存雪崩)。
避免:
区分热点数据与冷门数据,区别对待,设置不同的过期时间。
什么是缓存雪崩?
由于缓存层承载着大量的请求,有效地保护了存储层,但是如果缓存层由于某些原因不能提供服务,于是所有请求都会到达存储层,存储层的调用量会暴增,造成存储层也会级联宕机的情况。
避免:
1.保证缓存层服务高可用性。
2.依赖隔离组件为后端限流并降级
最佳实践
1.缓存层高可用
2.缓存命中相关数据收集、统计、监控、预警
3.布隆过滤器降低穿透率
4.热点业务区别处理,降低击穿率
5.后端服务限流
6.后端fail-fast降级