Redis 缓存问题(一致性、穿透、击穿和雪崩)
简介:缓存机制能避免请求过多的直接与数据库操作,从而造成系统瓶颈,极大的提升了用户体验和系统稳定性。虽然给系统带来了一定质的提升,但是也带来一些问题。
1. 缓存一致性
A. 定义:当数据时效性要求很高时,需要保证缓存中的数据与数据库中的保持一致,而且需要保证缓存节点和副本中的数据也保持一致,不能出现差异的现象。
2. 缓存穿透
A. 定义:在高并发场景下,如果某一个key被高并发访问,没有被命中缓存,出于对容错性考虑,会尝试去从后端数据库中获取,从而导致大量的请求达到数据库,而当key对应的数据本身就是空的情况下,这就导致数据库中并发的执行了很多不必要的查询操作,从而导致巨大冲击和压力,针对并发查同一条缓存和数据库中都没有的数据;
B. 解决方案
缓存空对象:如果是集合就缓存一个空集合,而非null,如果是对象就用字段标识来区分,但是失效时间应设置短一些;
过滤:接口层增加校验;
布隆过滤器(BloomFilter);
C. BloomFilter实例
3. 缓存击穿
A. 定义:是指缓存中没有数据,但是数据库是有数据的,例如缓存key到期,这时由于并发用户特别多,同时读缓存没读到数据,又同时去数据库去取数据,引起数据库压力瞬间增大,造成过大压力,针对并发查同一条过期数据;
B. 解决方案:设置热点数据永不过期;服务限流、熔断或降级;加互斥锁;
C. 分布式锁示例
4. 缓存雪崩
A. 定义:指由于缓存的原因,如缓存服务器故障、key失效时间相同等,导致大量请求达到后端数据库,从而导致数据库崩溃,进而引发系统崩溃,针对并发查多条同时过期的数据;
B. 解决方案
若因key失效时间相同,就让key失效时间错开;
若因缓存服务器故障,建立分布式高可用的缓存系统,即缓存预备。
5. 缓存预热
A. 定义:指系统上线后,将相关的缓存数据直接加载到缓存系统,这样就可以避免在用户请求的时候,先查询数据库,然后再将数据缓存的问题;
B. 解决方案:代码+人工实现;定时刷新缓存。
可参考:Redis缓存问题及解决方案