Redis缓存穿透、缓存击穿、缓存雪崩

参考资料:《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降级

你可能感兴趣的:(Redis开发与运维)