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缓存问题及解决方案

posted @ 2020-01-18 17:25  如幻行云  阅读(169)  评论(0编辑  收藏  举报