服务端2月19日 13:28
Redis 是什么?核心特点有哪些?## Redis 是什么?
Redis(Remote Dictionary Server)是用 C 语言编写的开源高性能键值存储系统。它将数据全部驻留在内存中,通过单线程事件驱动模型处理请求,单机 QPS 可达 10 万+。与 Memcached 等纯缓存不同,Redis 提供持久化、事务、Lua 脚本、发布订阅等能力,既能做缓存,也能承担消息队列、会话存储、排行榜等业务角色。
## 主要特点
### 基于内存的高性能读写
Redis 所有数据存储在内存中,内存访问延迟在纳秒级,远低于磁盘的毫秒级延迟。配合 I/O 多路复用(epoll/kqueue)和单线程事件循环,避免了线程...服务端2月19日 13:28
Redis 有哪些数据类型?各自的底层实现和使用场景是什么?Redis 提供了丰富的数据类型,面试中经常考察每种类型的底层编码、转换条件以及典型场景。下面从五大数据类型讲起,再覆盖后续新增的特殊类型。
## String:最基础的键值类型
String 是 Redis 最简单的数据类型,可以存储字符串、整数、浮点数,最大 512MB。
**底层实现**:Redis 没有直接使用 C 语言字符串,而是自己实现了 SDS(Simple Dynamic String)。SDS 在 C 字符串末尾 \0 的基础上增加了 len 和 alloc 字段:len 记录已用长度,alloc 记录分配总空间。这样做带来了三个好处——获取字符串长度从 O(N)...服务端2月19日 13:29
Redis 性能优化有哪些策略?Redis 性能优化是面试中的高频考点,也是生产环境中必须掌握的实战技能。本文从内存、网络、CPU、持久化、集群、监控、OS、客户端、架构九大维度系统梳理优化策略,并结合面试常见追问给出关键知识点。
## 内存优化
**选择合适的数据结构**是内存优化的第一步:
- 用 Hash 存储对象字段,比多个 String 节省内存(底层 ziplist/listpack 编码)
- 用 ZSet 做排行榜,避免 List 排序开销
- 用 Bitmap 存布尔型标记位,空间仅为 Set 的 1/64
- 用 HyperLogLog 做基数统计,固定 12KB 即可统计亿级去重
**控制键...服务端2月19日 13:28
Redis 的 RDB 和 AOF 持久化有什么区别?如何选择?Redis 提供两种持久化机制将内存数据写入磁盘:RDB(快照)和 AOF(追加日志)。理解两者的原理和取舍是后端面试的高频考点,也是生产环境配置的基础。
## RDB 持久化:定时快照
RDB 在指定时间间隔内对数据集生成时间点快照,写入压缩的二进制文件 `dump.rdb`。
**触发方式**:
- 手动触发:执行 `SAVE`(阻塞主进程)或 `BGSAVE`(fork 子进程后台执行)
- 自动触发:配置 `save <seconds> <changes>` 条件满足时自动执行 `BGSAVE`
- `shutdown` 时若开启 RDB 且无 AOF,默认执行 `BGSA...服务端2月20日 21:49
GraphQL 测试有哪些策略和最佳实践## 测试金字塔:GraphQL 测试的分层思路
面试中回答 GraphQL 测试问题,不要上来就列工具,先讲清楚测试金字塔的分层逻辑:**单元测试打底,集成测试验证核心链路,E2E 测试覆盖关键用户流程**。GraphQL 的特殊性在于 Resolver 是天然可隔离的单元,Schema 是集成测试的契约,订阅(Subscription)则需要专门的实时性测试策略。这个分层思路适用于任何 GraphQL 项目的自动化测试流程搭建。
## 单元测试:Resolver 级别的逻辑验证
Resolver 是 GraphQL 的核心,每个 Resolver 函数接收 `parent`、`...服务端2月20日 21:46
GraphQL 缓存策略有哪些实现方式?## Prettier 和 ESLint 有什么本质区别?
Prettier 是代码**格式化工具**,ESLint 是代码**质量检查工具**,二者不是替代关系而是互补关系。
核心区别在于工作原理:Prettier 将代码解析为 AST(抽象语法树),然后按照自己的规则重新输出,保证同样的输入永远得到同样的输出;ESLint 则基于规则引擎逐行扫描代码,检测潜在的错误和反模式。
实际项目中标准做法是两者结合:用 `eslint-config-prettier` 关闭 ESLint 中与格式化重叠的规则,让 Prettier 完全负责格式化(缩进、换行、引号风格),ESLint 专...服务端2月20日 21:48
GraphQL Subscriptions 如何实现实时数据推送?## 核心回答
GraphQL 订阅基于 WebSocket 实现持久连接,服务端通过 PubSub 模式在事件触发时主动向客户端推送数据,区别于 Query/Mutation 的请求-响应模式。完整实现涉及三个关键环节:传输层(WebSocket 或 SSE)、PubSub 引擎(内存 / Redis / 消息队列)、订阅解析器(过滤与鉴权)。
## 实现原理与通信流程
订阅的生命周期分为五步:
1. 客户端通过 WebSocket 握手建立持久连接
2. 客户端发送 subscription 操作文档和变量
3. 服务端将订阅注册到 PubSub 引擎的对应 topic
4....计算机基础2月19日 14:36
什么是 CDN 边缘计算?有哪些应用场景?## CDN 边缘计算是什么?
CDN 边缘计算是将计算能力从中心化源站下沉到 CDN 边缘节点,在靠近用户的网络边缘执行计算任务的一种架构模式。传统 CDN 只做静态内容缓存,而边缘计算让边缘节点具备了运行业务逻辑的能力——请求不必回源,直接在边缘节点处理并返回结果。
两者的核心区别:CDN 解决的是"内容离用户更近"的问题,边缘计算解决的是"计算离用户更近"的问题。当两者结合,边缘节点既能缓存静态资源,又能执行动态计算,形成完整的边缘服务能力。
## 为什么需要边缘计算?
### 延迟:从数百毫秒到数十毫秒
传统架构下,动态请求必须回源处理:用户 → 边缘节点 → 源站(可...服务端2月20日 21:32
GraphQL 高级概念与架构设计模式有哪些核心要点## 联合类型和接口类型有什么区别,分别适合什么场景
GraphQL 的联合类型(Union)和接口类型(Interface)都用于处理"一个字段可能返回多种类型"的情况,但设计意图和适用场景不同。
**接口类型**定义了一组共享字段,实现接口的类型必须包含这些字段。适合多个类型有共同特征的场景,比如 `Node` 接口要求所有实现类型都有 `id` 和 `createdAt`,这是 Relay 全局 ID 规范的基础。
```graphql
interface Node {
id: ID!
createdAt: DateTime!
}
type User impleme...服务端2月20日 21:26
GraphQL 查询、变更和订阅有什么区别## 一句话回答
GraphQL 的三种操作类型各有分工:**Query 读数据、Mutation 写数据、Subscription 监听数据变化实时推送**。它们在执行语义、传输协议、缓存策略上都有本质区别,面试时把核心差异说清楚就能拿分。
## 核心区别一览
| 维度 | Query | Mutation | Subscription |
|------|-------|----------|--------------|
| 用途 | 读取数据 | 修改数据 | 实时监听数据变化 |
| REST 类比 | GET | POST / PUT / DELETE | WebSoc...