orion_intervew

🟢 一、后端(NestJS + MongoDB + Redis)

NestJS 基础

数据库(MongoDB)

利用 2dsphere 索引,可以用 $near、$geoWithin 实现范围查询,适合房源按地铁口、区域等条件检索。

缓存(Redis)

谈谈你对redis缓存过期策略的理解

Redis 缓存过期是控制内存占用、保证数据时效性的核心机制,指为缓存的 Key 设置过期时间(TTL, Time To Live),当达到过期时间后,Redis 会自动将该 Key 从内存中删除,避免无效数据长期占用内存,同时确保缓存数据与后端数据源(如数据库)的一致性。

特殊说明 - 对 Key 执行 SETGETSET 等覆盖写命令时,会清除该 Key 原有的过期时间,需重新设置。 - 对 Hash、List 等复合数据结构,只能为整个 Key 设置过期时间,不能为内部元素单独设置。 - 执行 PERSIST key 命令可移除 Key 的过期时间,使其变为永久有效。

Redis 不会在 Key 过期的瞬间立即全部删除,而是采用 「惰性删除 + 定期删除」 结合的策略,平衡内存释放效率和 CPU 资源消耗。 1. 惰性删除(Lazy Expiration) - 核心逻辑:只有当客户端主动访问某个 Key 时,Redis 才会检查该 Key 是否过期。若已过期,则删除 Key 并返回 nil;若未过期,则正常返回值。 - 优点:CPU 友好,只在必要时执行删除操作,不会浪费资源扫描所有过期 Key。 - 缺点:内存不友好,若大量过期 Key 长期未被访问,会一直占用内存,可能导致内存泄漏。 2. 定期删除(Periodic Expiration) - 核心逻辑:Redis 会每隔一段时间(默认 100ms)主动触发一次过期扫描,流程如下: 1. 从设置了过期时间的 Key 集合中,随机抽取一定数量的 Key(默认 20 个)。 2. 检查这些 Key 是否过期,删除其中已过期的 Key。 3. 若过期 Key 占比超过 25%,则重复上述步骤,直到占比低于 25% 或达到最大执行时长(避免阻塞主线程)。 - 优点:主动清理过期 Key,缓解惰性删除的内存泄漏问题。 - 缺点:扫描频率和扫描数量需合理配置,否则会占用过多 CPU 资源,影响 Redis 正常读写。

三、过期策略与持久化的关联

当 Redis 开启持久化(RDB/AOF)时,过期 Key 的处理会与持久化文件联动,保证重启后数据的一致性: 1. RDB 持久化 - 生成 RDB 文件时,Redis 会过滤掉已过期的 Key,不会将其写入 RDB 文件。 - 加载 RDB 文件时,若 Redis 是主节点,会忽略 RDB 文件中的过期 Key;若为从节点,则会保留过期 Key,待与主节点同步时再清理。 2. AOF 持久化 - 当过期 Key 被惰性删除或定期删除时,Redis 会向 AOF 文件中追加一条 DEL key 命令,记录该删除操作。 - AOF 重写时,会过滤掉已过期的 Key,减少 AOF 文件体积。

四、分布式场景下的过期一致性问题

在 Redis 主从集群或 Redis Cluster 中,过期 Key 的处理存在主从同步延迟的问题: 1. 问题表现 - 主节点删除过期 Key 后,若同步指令(如 DEL)未及时发送到从节点,此时访问从节点可能会读取到已过期的 Key。 2. 解决方案 - 业务层面可优先从主节点读取热点数据,或接受短暂的数据不一致。 - 依赖 Redis 主从同步的最终一致性,待从节点执行同步指令后,过期 Key 会被清理。

五、过期时间设置的最佳实践

  1. 差异化设置过期时间
    • 热点数据:设置较长的过期时间(如 1~24 小时),结合后台异步更新(如定时任务从数据库拉取最新数据刷新缓存),避免频繁失效。
    • 非热点数据:设置较短的过期时间(如 5~30 分钟),减少内存占用。
    • 防止缓存雪崩:为同一类 Key 的过期时间添加随机偏移量,例如 EX 3600 + rand()%600,避免大量 Key 同时过期。
  2. 避免永不过期的 Key
    • 除非是静态配置类数据,否则不建议设置永不过期的 Key,防止内存持续膨胀。
  3. 结合业务场景调整删除策略
    • 对内存敏感的场景:可适当提高定期删除的扫描频率(需权衡 CPU 消耗)。
    • 对 CPU 敏感的场景:降低定期删除频率,依赖惰性删除 + 内存淘汰策略兜底。

🟢 二、PC 前端(React + Radix-UI)

React 基础

UI 框架(Radix-UI)

🟢 三、移动端(React Native Expo + 高德地图)

React Native Expo

高德地图 SDK


Page Source