2024-03-23 08:53

Redis 缓存击穿与缓存雪崩

wanmatea

JavaEE

(358)

(0)

收藏

缓存击穿

缓存击穿是指在使用缓存时,对某个特定的键(key)进行频繁的请求,但是该键在缓存中不存在或已过期,导致所有的请求都穿透缓存,直接访问后端数据源(如数据库),增加了后端负载,降低了系统性能。


缓存击穿通常发生在以下情况下:


高并发访问和低缓存命中率:当有大量并发请求涌入系统,而缓存命中率较低时,就容易出现缓存击穿现象。


缓存数据过期:如果某个缓存键已过期,而此时正有大量请求访问该键,就会发生缓存击穿。


热点数据访问:当某个特定的缓存键受到高频访问,而该键又不在缓存中时,就容易发生缓存击穿。


预防缓存击穿

设置键永远不过期

对于热点数据,可以考虑使用永久缓存,或者根据数据的变化情况主动更新缓存。


这种方案由于没有设置真正的过期时间, 实际上已经不存在热点 key 产生的一系列危害, 但是会存在数据不一致的情况, 同时代码复杂度会增大。


加锁或互斥操作

当缓存未命中时,可以采用加锁或互斥操作的方式,确保只有一个请求去加载数据到缓存,其他请求等待并共享加载完成后的缓存数据。


这种方案思路比较简单, 但是存在一定的隐患, 如果构建缓存过程出现问题或者时间较长, 可能会存在死锁和线程池阻塞的风险, 但是这种方法能够较好地降低后端存储负载, 并在一致性上做得比较好。


缓存雪崩

由于缓存层承载着大量请求, 有效地保护了存储层, 但是如果缓存层由于某些原因不能提供服务, 于是所有的请求都会达到存储层, 存储层的调用量会暴增, 造成存储层也会级联宕机的情况。


Redis缓存雪崩通常发生在以下情况下:


缓存中大量的数据同时过期:如果缓存中的大量数据在同一时间点过期,那么所有对这些数据的请求都会落到后端数据源上。


缓存服务宕机或发生故障:如果Redis缓存服务器宕机、网络异常或运行出现故障,所有的请求将无法命中缓存,都会直接访问后端数据源。


缓存层不可用:网络分区、硬件故障或其他问题导致无法访问缓存层,请求直接落到后端数据源。


预防缓存雪崩

多级缓存策略

和飞机都有多个引擎一样, 如果缓存层设计成高可用的,使用多级缓存架构,引入分布式缓存来分担缓存层的负载压力,并减少单点故障的风险。 即使个别节点、 个别机器、 甚至是机房宕掉, 依然可以提供服务。


限流和熔断策略

作为并发量较大的系统, 假如有一个资源不可用, 可能会造成线程全部阻塞( hang) 在这个资源上, 造成整个系统不可用。为后端数据源设置合适的限流策略,确保只有承受得起的请求量进入后端数据源,防止过多的请求集中到数据库上。


在实际项目中, 我们需要对重要的资源( 例如Redis、 MySQL、HBase、 外部接口) 都进行隔离, 让每种资源都单独运行在自己的线程池中, 即使个别资源出现了问题, 对其他服务没有影响。


提前演练

在项目上线前, 演练缓存层宕掉后, 应用以及后端的负载情况以及可能出现的问题, 在此基础上做一些预案设定。


设置合理的过期时间

通过合理设置缓存数据的过期时间,将过期时间分散在不同的时间段。


实施缓存数据的自动续期,在数据即将过期时,异步或者定时地更新缓存中的数据,避免大量数据同时过期。


做好容灾处理

监控缓存层的状态,及时发现异常情况并采取相应的故障恢复措施,例如快速的替换或修复故障节点。


小结

缓存穿透(Cache Penetration): 缓存穿透是指一个查询非常频繁,但是缓存中没有相关数据,每次查询都需要经过缓存层到达数据库或其他存储系统,导致查询的性能下降。通常发生在恶意请求或者查询不存在的数据。缓存穿透会给系统增加不必要的负载。


缓存击穿(Cache Breakdown): 缓存击穿是指一个热点数据在缓存中过期或被清除,同时有大量的请求同时访问这个数据,导致这些请求全部穿透到后端存储系统(如数据库),造成数据库负载激增。缓存击穿通常发生在热点数据失效并且需要重新加载到缓存时。


缓存雪崩(Cache Avalanche): 缓存雪崩是指当缓存中的大量数据同时失效或被清除,而后续的请求又无法从缓存中获取到数据,导致所有的请求都直接落到后端存储系统(如数据库),造成严重的性能问题甚至系统崩溃。缓存雪崩通常发生在缓存服务器宕机、网络故障等情况下,导致缓存无法正常工作。


区分这些问题的关键在于它们发生的原因和表现。缓存穿透通常发生在查询不存在的数据,缓存击穿发生在热点数据失效时受到并发请求的影响,而缓存雪崩则是由于大量的缓存数据同时失效导致的系统崩溃。解决这些问题的方法也不尽相同,可以通过使用布隆过滤器来避免缓存穿透,设置合理的过期时间和使用互斥锁来避免缓存击穿,以及使用多级缓存和冗余备份来避免缓存雪崩。

0条评论

点击登录参与评论