orion_intervew
🟢 一、后端(NestJS + MongoDB + Redis)
NestJS 基础
NestJS 中的依赖注入(DI)是如何实现的?和传统的 Express 框架相比有什么优势? NestJS 基于 TypeScript 的 reflect-metadata 实现 IOC 容器,通过 @Injectable 装饰器注册 provider,自动管理实例生命周期。相比 Express,它解耦了业务逻辑,利于测试和模块化。
请解释一下 Guard、Interceptor、Middleware 的区别和适用场景。 Middleware:在路由前执行,处理日志、请求解析等。 Guard:决定请求是否被处理(权限、认证)。 Interceptor:在路由调用前后执行,适合统一响应、缓存、数据转换。
在 NestJS 中如何优雅地处理全局异常?
数据库(MongoDB)
MongoDB 与关系型数据库相比,适合什么业务场景?
在房产类应用中,如果要支持“按地理位置范围搜索房源”,MongoDB 提供了哪些功能?
如何在 MongoDB 中设计一个房源集合,以便快速支持多条件检索(如价格区间 + 面积 + 标签)?
利用 2dsphere 索引,可以用 $near、$geoWithin 实现范围查询,适合房源按地铁口、区域等条件检索。
缓存(Redis)
Redis 的常见数据结构及其使用场景? 数据结构:String(缓存 token)、Hash(用户对象)、Set(去重)、SortedSet(排行榜)。 分布式锁:SETNX + EXPIRE,避免重复任务;高级场景用 RedLock 算法。
如何使用 Redis 来优化 RAG 检索或 LLM 请求的性能?
解释一下 Redis 中的 分布式锁,在什么情况下会用到?
谈谈你对redis缓存过期策略的理解
Redis 缓存过期是控制内存占用、保证数据时效性的核心机制,指为缓存的 Key 设置过期时间(TTL, Time To Live),当达到过期时间后,Redis 会自动将该 Key 从内存中删除,避免无效数据长期占用内存,同时确保缓存数据与后端数据源(如数据库)的一致性。
特殊说明
- 对 Key 执行 SET、GETSET 等覆盖写命令时,会清除该 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~24 小时),结合后台异步更新(如定时任务从数据库拉取最新数据刷新缓存),避免频繁失效。
- 非热点数据:设置较短的过期时间(如 5~30 分钟),减少内存占用。
- 防止缓存雪崩:为同一类 Key 的过期时间添加随机偏移量,例如
EX 3600 + rand()%600,避免大量 Key 同时过期。
- 避免永不过期的 Key
- 除非是静态配置类数据,否则不建议设置永不过期的 Key,防止内存持续膨胀。
- 结合业务场景调整删除策略
- 对内存敏感的场景:可适当提高定期删除的扫描频率(需权衡 CPU 消耗)。
- 对 CPU 敏感的场景:降低定期删除频率,依赖惰性删除 + 内存淘汰策略兜底。
🟢 二、PC 前端(React + Radix-UI)
React 基础
react hooks? Hooks 是 React 16.8 引入的特性,本质是一系列用于在函数组件中 “钩入” React 状态和生命周期等特性的函数。它的设计目的是解决类组件的缺陷(如逻辑复用复杂、生命周期函数混杂多种逻辑等),让函数组件也能拥有状态管理、副作用处理等能力。 常见的 Hooks 包括: useState:管理组件状态 useEffect:处理副作用(如数据请求、DOM 操作) useCallback:缓存函数引用 useMemo:缓存计算结果 useContext:获取上下文数据 以及自定义 Hooks(基于内置 Hooks 封装的复用逻辑)
React 18 中的并发特性(Concurrent Features)解决了什么问题? 支持可中断渲染(Concurrent Rendering),结合 useTransition、Suspense,提升大规模渲染场景下的响应性。
useEffect 与 useLayoutEffect 的区别是什么? useEffect:异步执行,不阻塞绘制,用于副作用。 useLayoutEffect:同步执行,在 DOM 更新后、绘制前运行,用于测量布局。
React useCallback 与普通函数有哪些区别,主要解决哪些问题? useCallback 是 专门用于缓存函数引用的 Hooks,它的核心作用是避免函数在组件重新渲染时被频繁创建新的引用,从而优化依赖该函数的子组件或副作用的性能。 (1)优化子组件渲染 (2)稳定 useEffect 的依赖项 useCallback 的设计基于 React 的渲染机制和性能优化原则: React 函数组件每次状态更新都会重新执行,函数内部定义的变量 / 函数会被重新创建(引用变化)。 对于不依赖组件状态的函数,其引用变化是无意义的,但会触发依赖它的逻辑(如子组件渲染、副作用执行)。 useCallback 通过依赖项数组跟踪函数内部使用的变量,仅当依赖变化时才更新函数引用,否则返回缓存的旧引用,从而减少不必要的计算和渲染。
在 react 中,虚拟 DOM 更新和 Diff 算法是怎么工作的?
UI 框架(Radix-UI)
Radix-UI 和 antd/mui 等传统组件库有什么区别? Radix-UI 提供无样式、可访问性良好的基础组件,更适合与 TailwindCSS 配合构建定制化 UI,不像 antd 强耦合样式。
Radix-UI 提供的无样式基础组件如何结合 TailwindCSS 来构建一致的 UI 体系?
如果要实现一个级联选择器(行政区级联),Radix-UI 能否直接支持?如果不能,你会怎么扩展?
🟢 三、移动端(React Native Expo + 高德地图)
React Native Expo
Expo 与纯 RN 有什么区别?在生产环境中有哪些利弊? Expo 提供打包、OTA、内置 API,降低门槛。但限制原生扩展,复杂场景需要 Eject。适合快速 MVP 开发。
如何在 Expo 项目中处理权限申请(例如定位权限)? expo-permissions(旧)或 expo-location 提供 API,Android 需在 AndroidManifest.xml 配置,iOS 需在 Info.plist 写描述。
Expo 中如何优化启动速度和 bundle 体积?
高德地图 SDK
如何在 React Native 中集成高德地图并实现路线规划? 通过高德 URI Scheme(amapuri://route/plan?...),传递起点/终点经纬度 + 名称,支持驾车、公交、步行等模式。
高德地图 WebView 和 Native SDK 方案的优劣?
如果用户规划路线后,要一键跳转到高德地图 App 并加载该路线,你会怎么实现?
Page Source