面试篇四:并发编程

  • 如何保证缓存一致性

一般是在数据发生变更时,主动更新缓存中的数据或者移除对应缓存。

当缓存中的某个key在被更新时,同时被大量请求要获取该key,这时怎么解决数据一致性问题?

锁:在缓存更新或过期时,先获取锁,等到更新或从数据库获取完成并存入缓存后,再释放锁,这个过程,其他线程就一直处理等待中。

  • 缓存雪崩

缓存没查到的数据,则会去后段数据库查询;这时如果多个请求并发的要从数据库获取数据,对数据库造成很大的压力,就可能出现缓存雪崩。

如某个时间节点内,缓存集中失效,如果大量请求获取数据,就可能出现缓存雪崩。

该数据是可以从数据库查询到的,这是和下面说的缓存穿透不一样的地方。

怎么解决?

(1)借助限流、降级、熔断等手段可降低影响。

(2)设置多级缓存,分别设置不同的过期策略。

  • 缓存穿透

缓存查不到的数据,出现大量请求并发查询,这时候就会一直访问后段数据库,实际上,后段数据库本身也不存在该数据,实际上是不必要的查询,这种就是缓存穿透。怎么解决?

(1)缓存一个空对象,设置较短的过期时间。这种解决方法适合命中率不高,但更新频繁的数据。

(2)把可能出现数据为null的所有key,存在在一个集合中,在每次请求前先拦截。这种解决方法适合命中率不高、更新不频繁的数据。

  • 限流

限流就是只允许程序能处理的请求数进来,其他的丢弃掉。

  • 降级

降级就是把非核心功能暂时关闭掉。

  • 熔断

熔断是应对外部系统的故障。比如A服务调用B服务的某个接口,响应很慢时,导致A服务的线程都卡在这里了,A服务的其它功能变慢。此时就需要熔断机制,让A服务调用B服务的接口就直接返回错误,从而避免整个A服务被拖慢。

猜你喜欢

转载自www.cnblogs.com/scorpio-cat/p/12820948.html
今日推荐