面试题答案
一键面试结合分布式缓存与本地缓存满足需求的方式
- 分布式缓存:
- 作用:采用如Redis这样的分布式缓存,它可以存储大量数据,为整个分布式系统提供统一的缓存服务。多个节点可以共享这些缓存数据,适合存储那些不常变化且访问频繁的数据,比如一些基础配置信息、热门商品信息等。
- 优点:具备高可用性和可扩展性,能够应对高并发的读请求。
- 本地缓存:
- 作用:在每个应用节点上使用本地缓存,例如Guava Cache。它主要用于存储本节点近期频繁访问的数据,进一步减少对分布式缓存的访问压力,降低延迟。比如某个节点在处理特定业务流程中反复用到的用户信息片段等。
- 优点:访问速度极快,因为数据就在本地内存中,无需网络通信。
- 结合方式:
- 读取流程:应用首先尝试从本地缓存中读取数据。若命中,则直接返回数据;若未命中,再从分布式缓存中读取。如果分布式缓存也未命中,才从数据源(如数据库)读取数据,读取后将数据同时放入本地缓存和分布式缓存。
- 写入流程:当数据发生变化时,先更新数据源,然后同时更新分布式缓存和本地缓存,确保数据一致性。
面临的挑战及解决方案
- 数据同步:
- 挑战:在分布式环境下,多个节点可能同时更新数据,导致本地缓存和分布式缓存以及数据源之间的数据不一致。
- 解决方案:
- 采用分布式锁:在更新数据时,先获取分布式锁,只有获取到锁的节点才能进行数据更新操作,并同步更新分布式缓存和本地缓存。操作完成后释放锁。
- 使用消息队列:数据更新后,将更新消息发送到消息队列。各个节点监听消息队列,接收到消息后更新本地缓存和分布式缓存,保证数据一致性。
- 缓存穿透:
- 挑战:恶意请求访问不存在的数据,每次都绕过缓存直接访问数据源,导致数据源压力过大。
- 解决方案:
- 布隆过滤器:在缓存之前使用布隆过滤器,将所有可能存在的数据哈希到一个足够大的位数组中。当请求到达时,先通过布隆过滤器判断数据是否存在。如果不存在,直接返回,不再访问分布式缓存和数据源。
- 空值缓存:当从数据源查询到数据不存在时,也将这个空值缓存起来,并设置较短的过期时间,防止后续相同的无效请求穿透。
- 缓存雪崩:
- 挑战:大量缓存数据在同一时间过期,导致大量请求直接访问数据源,可能使数据源不堪重负甚至崩溃。
- 解决方案:
- 随机过期时间:在设置缓存过期时间时,为每个缓存数据设置一个随机的过期时间,避免大量数据同时过期。
- 缓存预热:系统启动时,提前将部分热点数据加载到缓存中,并设置合理的过期时间,避免启动后短时间内大量缓存失效。
- 搭建多级缓存:除了分布式缓存和本地缓存,还可以设置如CDN这样的前端缓存,分担后端缓存和数据源的压力,即使部分缓存失效,也能通过其他缓存层缓解压力。