MST

星途 面试题库

面试题:分布式系统下本地缓存与分布式缓存结合使用的场景设计与挑战

假设你正在设计一个高并发、低延迟且数据一致性要求较高的分布式系统,阐述如何巧妙结合分布式缓存与本地缓存以满足需求,并分析在结合使用过程中可能面临的数据同步、缓存穿透、缓存雪崩等挑战以及对应的解决方案。
17.7万 热度难度
后端开发分布式系统

知识考点

AI 面试

面试题答案

一键面试

结合分布式缓存与本地缓存满足需求的方式

  1. 分布式缓存
    • 作用:采用如Redis这样的分布式缓存,它可以存储大量数据,为整个分布式系统提供统一的缓存服务。多个节点可以共享这些缓存数据,适合存储那些不常变化且访问频繁的数据,比如一些基础配置信息、热门商品信息等。
    • 优点:具备高可用性和可扩展性,能够应对高并发的读请求。
  2. 本地缓存
    • 作用:在每个应用节点上使用本地缓存,例如Guava Cache。它主要用于存储本节点近期频繁访问的数据,进一步减少对分布式缓存的访问压力,降低延迟。比如某个节点在处理特定业务流程中反复用到的用户信息片段等。
    • 优点:访问速度极快,因为数据就在本地内存中,无需网络通信。
  3. 结合方式
    • 读取流程:应用首先尝试从本地缓存中读取数据。若命中,则直接返回数据;若未命中,再从分布式缓存中读取。如果分布式缓存也未命中,才从数据源(如数据库)读取数据,读取后将数据同时放入本地缓存和分布式缓存。
    • 写入流程:当数据发生变化时,先更新数据源,然后同时更新分布式缓存和本地缓存,确保数据一致性。

面临的挑战及解决方案

  1. 数据同步
    • 挑战:在分布式环境下,多个节点可能同时更新数据,导致本地缓存和分布式缓存以及数据源之间的数据不一致。
    • 解决方案
      • 采用分布式锁:在更新数据时,先获取分布式锁,只有获取到锁的节点才能进行数据更新操作,并同步更新分布式缓存和本地缓存。操作完成后释放锁。
      • 使用消息队列:数据更新后,将更新消息发送到消息队列。各个节点监听消息队列,接收到消息后更新本地缓存和分布式缓存,保证数据一致性。
  2. 缓存穿透
    • 挑战:恶意请求访问不存在的数据,每次都绕过缓存直接访问数据源,导致数据源压力过大。
    • 解决方案
      • 布隆过滤器:在缓存之前使用布隆过滤器,将所有可能存在的数据哈希到一个足够大的位数组中。当请求到达时,先通过布隆过滤器判断数据是否存在。如果不存在,直接返回,不再访问分布式缓存和数据源。
      • 空值缓存:当从数据源查询到数据不存在时,也将这个空值缓存起来,并设置较短的过期时间,防止后续相同的无效请求穿透。
  3. 缓存雪崩
    • 挑战:大量缓存数据在同一时间过期,导致大量请求直接访问数据源,可能使数据源不堪重负甚至崩溃。
    • 解决方案
      • 随机过期时间:在设置缓存过期时间时,为每个缓存数据设置一个随机的过期时间,避免大量数据同时过期。
      • 缓存预热:系统启动时,提前将部分热点数据加载到缓存中,并设置合理的过期时间,避免启动后短时间内大量缓存失效。
      • 搭建多级缓存:除了分布式缓存和本地缓存,还可以设置如CDN这样的前端缓存,分担后端缓存和数据源的压力,即使部分缓存失效,也能通过其他缓存层缓解压力。