- 如何保证缓存一致性
一般是在数据发生变更时,主动更新缓存中的数据或者移除对应缓存。
当缓存中的某个key在被更新时,同时被大量请求要获取该key,这时怎么解决数据一致性问题?
锁:在缓存更新或过期时,先获取锁,等到更新或从数据库获取完成并存入缓存后,再释放锁,这个过程,其他线程就一直处理等待中。
- 缓存雪崩
缓存没查到的数据,则会去后段数据库查询;这时如果多个请求并发的要从数据库获取数据,对数据库造成很大的压力,就可能出现缓存雪崩。
如某个时间节点内,缓存集中失效,如果大量请求获取数据,就可能出现缓存雪崩。
该数据是可以从数据库查询到的,这是和下面说的缓存穿透不一样的地方。
怎么解决?
(1)借助限流、降级、熔断等手段可降低影响。
(2)设置多级缓存,分别设置不同的过期策略。
- 缓存穿透
缓存查不到的数据,出现大量请求并发查询,这时候就会一直访问后段数据库,实际上,后段数据库本身也不存在该数据,实际上是不必要的查询,这种就是缓存穿透。怎么解决?
(1)缓存一个空对象,设置较短的过期时间。这种解决方法适合命中率不高,但更新频繁的数据。
(2)把可能出现数据为null的所有key,存在在一个集合中,在每次请求前先拦截。这种解决方法适合命中率不高、更新不频繁的数据。
- 限流
限流就是只允许程序能处理的请求数进来,其他的丢弃掉。
- 降级
降级就是把非核心功能暂时关闭掉。
- 熔断
熔断是应对外部系统的故障。比如A服务调用B服务的某个接口,响应很慢时,导致A服务的线程都卡在这里了,A服务的其它功能变慢。此时就需要熔断机制,让A服务调用B服务的接口就直接返回错误,从而避免整个A服务被拖慢。