MST

星途 面试题库

面试题:Node.js缓存策略在复杂业务场景下的优化

在一个具有复杂业务逻辑的Node.js电商系统中,涉及商品详情页、购物车等不同模块,且各模块数据更新频率不同。请设计一套全面的缓存策略,以实现最优性能,并说明如何应对缓存穿透、缓存雪崩等问题。
24.6万 热度难度
前端开发Node.js

知识考点

AI 面试

面试题答案

一键面试

缓存策略设计

  1. 商品详情页缓存
    • 缓存粒度:以商品ID为缓存键,缓存整个商品详情对象。因为商品详情数据相对稳定,更新频率较低。
    • 缓存时间:设置较长的过期时间,例如24小时。但为了应对商品信息的突然变更(如库存紧急调整等),可在更新数据库商品信息时,同时删除对应的缓存。
    • 缓存级别:采用多级缓存,如先在进程内缓存(如使用Node.js的Map数据结构),如果进程内缓存未命中,再去访问分布式缓存(如Redis)。进程内缓存可以快速响应频繁的读请求,减少对分布式缓存的压力。
  2. 购物车缓存
    • 缓存粒度:以用户ID为缓存键,缓存用户的购物车信息。购物车信息更新频率相对较高,每次用户添加、删除商品或修改数量都可能导致缓存更新。
    • 缓存时间:由于购物车数据实时性要求较高,可设置较短的过期时间,如15分钟。同时,每次购物车操作(添加、删除、修改)都直接更新缓存,并且在过期时间内,如果有频繁操作,可适当延长过期时间。
    • 缓存级别:同样采用多级缓存,先在进程内缓存,未命中再访问分布式缓存。对于购物车这种与用户会话紧密相关的数据,还可以考虑在客户端(如浏览器)进行一定程度的缓存,通过localStoragesessionStorage存储部分购物车信息,减轻服务器端缓存压力。

应对缓存穿透问题

  1. 布隆过滤器:在系统启动时,将所有可能存在的商品ID(或其他业务关键ID)加载到布隆过滤器中。当查询请求到来时,先通过布隆过滤器判断该ID是否可能存在,如果布隆过滤器判断不存在,则直接返回,不再查询数据库。布隆过滤器存在一定的误判率,但可以大大减少无效查询对数据库的压力。在Node.js中,可以使用bloom - filter库来实现布隆过滤器。
  2. 空值缓存:当查询数据库发现某个ID对应的记录不存在时,也将该ID和空值缓存起来,并设置较短的过期时间(如5分钟)。这样后续相同的无效查询直接从缓存中获取空值,避免再次查询数据库。

应对缓存雪崩问题

  1. 设置随机过期时间:对于不同模块的缓存,在设置过期时间时,不要设置固定的过期时间,而是在一个合理的时间范围内设置随机过期时间。例如,商品详情页缓存过期时间设置为20 - 28小时之间的随机值,这样可以避免大量缓存同时过期,降低缓存雪崩的风险。
  2. 缓存降级:当检测到大量缓存失效,系统负载急剧上升时,启用缓存降级策略。例如,对于商品详情页,可以暂时返回一个简化的、静态的商品信息页面,不依赖实时的数据库查询和缓存,以保证系统的基本可用性。同时,记录相关日志,及时通知运维人员处理缓存问题。
  3. 构建多级缓存架构:除了上述提到的进程内缓存和分布式缓存,还可以引入二级分布式缓存(如Memcached作为Redis的补充)。当Redis出现大量缓存失效时,Memcached可以作为备用缓存,分担部分读请求,减少对数据库的冲击。