高并发场景下缓存常见问题
1.缓存一致性
当数据时效要求很高的时候,我们就要保证缓存中的数据与数据库中的数据保持一致,并且要保证缓存节点与副本中的数据也保持一致。这就比较依赖缓存中的过期和更新策略,一般会在数据更改的时候主动更新缓存中的数据,或者移除对应的缓存,这个时候在并发情况下就可能出现缓存一致性的问题。

缓存一致性主要包含这四种情况。 在这四种情况需要注意。
2.缓存并发问题
缓存过期后将尝试从数据库中获取数据,这是一个看似合理的过程。但是在高并发环境下,多个请求并发的从数据库中获取数据,对数据库造成极大的冲击,甚至宕机。此外当某个缓存的key被更新时,同时可能会有大量请求在获取,这也会导致一致性的问题。

我们想到的解决方案是加锁,在缓存过期或是尝试更新的情况下,获取锁当数据同步后再释放锁,这样只需要牺牲一定的等待时间。
3.缓存穿透问题
缓存穿透也叫击穿,通常的理解是由于缓存故障或是缓存过期,导致大量的请求穿透到数据库服务器,从而对数据库造成冲击。但是在高并发下,却是这样的:如果某一个key未被命中,出于容错性的考虑,会尝试从数据库中获取,从而导致大量的请求达到数据库,而如果该key对应数据为空的情况下,这就导致数据库中执行了很多遍不必要的查询操作,从而导致了巨大的冲击和压力。所以说白了就是查询结果为空,缓存未缓存,在该查询结果下,数据库就暴露出来了。
这种情况可以通过缓存空对象,单独过滤处理来解决
缓存空对象:对查询结果为空的对象也进行缓存(如果查询结果为集合且为空的情况下,也进行缓存,但不是空,是缓存空的集合。) 这样避免请求穿透到后端数据库,同时也需要保证缓存数据的时效性。这种方式比较简单,适合命中不高但可能被频繁更新的数据。
单独过滤处理:所有可能数据为空的情况进行统一的存放,并在请求前做拦截,这样避免请求穿透到数据库。 这种方式实现较复杂,比较适合命中不高且更新不频繁的数据
4.缓存的雪崩现象
先介绍一下缓存的颠簸问题,缓存颠簸又叫缓存抖动,这是一种比雪崩更轻微的现象,但是也会在一定时间内对系统造成冲击和性能影响。一般由于缓存节点故障导致,业内推荐的做法是通过一致性哈希算法解决。这个算法以后单独拿出来更新一期。
而缓存雪崩则是由于缓存的原因导致大量的请求穿透到数据库,导致数据库崩溃,从而整个系统崩溃。导致雪崩的原因有很多种,上面提到的问题都有可能导致雪崩现象,甚至可能被恶意攻击者所利用。还有一种情况是假设某个时间点内系统预加载的缓存周期性集中失效,也有可能导致此问题。这里可以通过设置不同的过期时间*来错开缓存过期时间。从应用架构角度,我们可以通过限流,降级,熔断等手段来降低影响,也可以通过多级缓存来避免这种灾难,此外在设计阶段,应加强压力测试,尽量模拟真实场景尽早暴露问题,从而防范。
网友评论