1. 项目背景
1.1 业务场景
团队技术栈多样,运维老李的笔记本是 Ubuntu,后端开发小王是 Windows 11 + WSL2,测试张姐用的是公司配的 MacBook。上周小王照着网上的教程,直接下载了一个 Windows 版的redis-server.exe,启动后发现版本是 5.0,但项目要求用 Redis 8.6 的 Stream 消费组和字段级过期能力。更糟的是,小王在 Windows 上能正常运行BGSAVE(因为 Windows 版的 fork 实现不同),但同样的命令在 Linux 生产环境却因为内存过大导致 fork 失败。
张姐那边也有问题——她用 Docker 启动了 Redis,连上 RedisInsight 后发现看不到数据,排查了半天才发现 Docker 的网络模式让她从宿主机访问localhost:6379时走的是另一个网络命名空间。三个人折腾了一天,愣是没让环境统一起来。
1.2 痛点
环境不一致是实战学习中最大的阻力来源:
| 问题 | 表现 | 后果 |
|---|---|---|
| Redis 版本不同 | Windows 版只到 5.0,Linux 版到 8.6 | Stream、ACL v2、字段级过期等新能力无法验证 |
| 配置不统一 | 有人用默认配置(无密码、无 AOF),有人改了但没记录 | “我这里可以,你那里不行” |
| 数据目录混乱 | 持久化文件散落各处 | 容器重启后数据丢失,无法复现持久化恢复流程 |
| 网络不通 | 宿主机、容器、WSL2 的网络栈不同 | RedisInsight 连不上、redis-benchmark 报错 |
| 缺少可视化工具 | 只用 redis-cli 看文本输出 | 无法直观观察 key 分布、内存占用、慢查询趋势 |
1.3 本章目标
不只"装一个 Redis",而是搭建一套可重复、可销毁、可扩展、接近生产的实验环境。这个环境将支撑后续所有章节的实战内容——从单机数据结构到 Sentinel 高可用、Cluster 集群、Prometheus 监控,全程不需要重新折腾环境。
具体交付物:
- 一份
redis.conf最小但合理的配置文件(带密码、AOF、数据目录)。 - 一份
docker-compose.yml(Redis + RedisInsight 可视化工具)。 - 掌握
redis-cli、redis-benchmark、redisinsight的使用。 - 一份环境故障排查清单(端口冲突、认证失败、挂载异常、网络不通)。
2. 项目设计
2.1 第一幕:为什么不用 Windows 原生版?
小胖:“我以前学 Redis,直接官网下载一个redis-server.exe,双击就启动了,多简单。为什么还要装 Docker?Docker Desktop 占好几 G 内存呢。”
小白:“Windows 原生版的 Redis 是微软维护的 fork,最新版本只到 5.0.x。我们专栏要用的 Stream 消费组、ACL v2、字段级过期、Redis Functions、JSON 模块、Vector 检索,这些在 5.0 上全都没有。难道你打算每个新功能都去网上找’降级方案’吗?”
小胖:“那 WSL2 呢?我听说 WSL2 可以直接用 Linux 版 Redis?”
大师:“WSL2 确实可以用 Linux 版,但它和 Docker Desktop 之间是互补关系。我从三方面总结一下:”
| 环境方案 | Redis 版本 | 启动方式 | 文件系统 | 网络 | 适合谁 |
|---|---|---|---|---|---|
| Windows 原生 .exe | 最高 5.0 | 双击 exe | Windows 路径 | Windows 网络栈 | 不推荐——版本和生产差距大 |
| WSL2 直接安装 | 可装 8.x | apt install | WSL2 虚拟磁盘 | WSL2 独立 IP | 适合习惯 Linux 命令行、想深入系统层的同学 |
| Docker Desktop (Windows) | 任意版本 | docker run | WSL2 后端 | 端口映射 | 专栏首选——版本可控、配置挂载、环境可销毁重建 |
| Docker (WSL2 内) | 任意版本 | docker run | WSL2 内目录 | 端口映射到宿主机 | 进阶推荐——更接近生产体验 |
大师:“就像去健身房。Windows 原生版是你家客厅的健身环——能出汗,但和专业器械完全不同。WSL2 是社区健身房——器械齐全,但你要自己带毛巾和水杯。Docker 是标准化的健身包——每次打开都是一套标准器械,坏了换一包就行。”
技术映射:Docker 通过镜像固定 Redis 版本,通过 Compose 固定启动参数、网络拓扑和数据卷。这是实现"开发/测试/生产环境一致性"最低成本的方式。
小胖:“那听你的,用 Docker。但我有个小问题——Docker Desktop 和 WSL2 是啥关系?我装了 Docker Desktop 之后,好像自动装了一个 WSL2?”
大师:“好问题。Docker Desktop for Windows 默认使用 WSL2 作为后端引擎。你在 Windows 上运行docker run,实际是在 WSL2 的 Linux 内核里跑的。WSL2 里的/var/lib/docker存储镜像和容器数据,你在 Windows 上是看不到的——也别去手动动它。”
2.2 第二幕:学习环境需要配密码和 AOF 吗?
小胖:“学习环境配密码不是给自己添麻烦吗?每次连 redis-cli 都要加-a redis123。还有 AOF(Append Only File),我一台学习机,数据丢了就丢了呗。”
小白:“我倒是觉得早点接触密码好。至少不会养成’Redis 无密码裸奔’的习惯。上次公司代码审查,我发现有人把 Redis 密码硬编码在前端配置文件里——因为他从学习阶段就觉得’密码可有可无’。”
大师:“密码和 AOF 不是’生产才需要的东西’,而是’理解 Redis 边界的东西’。”
他画了一张对比图:
无密码的环境 带密码的环境 ┌─────────────────┐ ┌─────────────────┐ │ redis-cli │ │ redis-cli │ │ │ │ │ │ │ │ │ 直接连接 │ │ │ -a redis123 │ │ ▼ │ │ ▼ │ │ Redis Server │ │ Redis Server │ │ (无密码,无安全) │ │ (ACL 校验) │ └─────────────────┘ └─────────────────┘ 无 AOF 的环境 带 AOF 的环境 ┌─────────────────┐ ┌─────────────────┐ │ 重启 → 数据全丢 │ │ 重启 → AOF 回放 │ │ "Redis 不稳?" │ │ 数据基本恢复 │ └─────────────────┘ └─────────────────┘大师:“密码让你理解 Redis 的安全模型——它不是’内网就绝对安全’,你后面会学到 ACL 用户体系、TLS 加密、命令权限。AOF 让你理解 Redis 的持久化模型——不是’内存数据库就是临时数据’,Redis 可以选择性地持久化,不同场景用不同策略。”
技术映射:学习环境的配置应该向生产靠近,否则形成错误认知(“Redis 不要密码”“Redis 重启数据就丢”)后很难纠正。
小白:“那我追问一个问题——学习环境的数据挂载到宿主机,有什么坑吗?”
大师:“三个关键点。第一,Windows 路径不能有中文、空格和特殊字符,否则 Docker Desktop 的 WSL2 后端可能无法正确挂载。第二,持久化文件(RDB、AOF)放在/data目录,不要在外部手动修改这些文件。第三,权限问题——某些 Docker 镜像的 Redis 以redis用户运行(UID 999),如果宿主机目录权限不对,Redis 可能无法写入 AOF 文件。”
2.3 第三幕:RedisInsight 到底有多大用?
小胖:“redis-cli 不就能看所有数据吗?还要装一个 RedisInsight,又是浏览器又是界面,多麻烦。”
小白:“redis-cli 看单个 key 还行,但你能一眼看出当前有多少 key、各类型分布、内存占用最大的 key 是哪个吗?如果要分析慢查询日志的趋势,redis-cli 只能一条一条SLOWLOG GET。”
大师:“RedisInsight 是 Redis 官方出的可视化管理工具。它不替代 redis-cli——redis-cli 是调试利器,RedisInsight 是全景地图。我给你列几个用 redis-cli 做不到或者很麻烦的事情:”
| 操作 | redis-cli | RedisInsight |
|---|---|---|
| 发现大 key | 需要redis-cli --bigkeys扫描 | 一键查看 key 大小排行,按类型筛选 |
| 分析慢查询 | SLOWLOG GET 10手动查看 | 图表展示慢查询趋势,支持筛选时间范围 |
| 内存分析 | 需要MEMORY USAGE key逐个查看 | 内存分布饼图,按命名空间聚合 |
| 批量操作 | 需要写脚本 | 可视化过滤、编辑、删除 |
| 实时监控 | MONITOR是一条条刷屏 | 图表展示 QPS、延迟、连接数 |
大师:“学习阶段,RedisInsight 最大的价值是让你’看见’ Redis 里面发生了什么。比如你写入 100 个购物车 key,它能用饼图展示 Hash 类型的占比;你设置了不同 TTL 的 key,它能直观显示哪些即将过期。”
技术映射:redis-cli 是"命令行显微镜"——精确但不直观;RedisInsight 是"运营仪表盘"——帮你快速发现问题,再决定去哪里放大观察。
3. 项目实战
3.1 准备项目目录
在实验目录(建议放在纯英文路径下)创建以下结构:
redis-lab/ ├── docker-compose.yml # 编排文件 ├── redis.conf # Redis 配置文件 ├── data/ # 持久化数据目录(RDB、AOF 文件) └── README.md # 环境说明(可选)# PowerShell (Windows)mkdirredis-labcdredis-labmkdirdata New-Item-ItemTypeFile-Namedocker-compose.yml New-Item-ItemTypeFile-Nameredis.conf3.2 编写 redis.conf
# === 网络配置 === bind 0.0.0.0 port 6379 protected-mode yes timeout 300 tcp-keepalive 300 # === 安全配置 === requirepass redis123 # === 持久化配置 === # AOF appendonly yes appendfsync everysec auto-aof-rewrite-percentage 100 auto-aof-rewrite-min-size 64mb # RDB save 900 1 save 300 10 save 60 10000 # 数据目录 dir /data # === 内存配置 === # 学习环境限制 512MB,生产需按实际规划 maxmemory 512mb maxmemory-policy allkeys-lru # === 慢查询日志 === slowlog-log-slower-than 10000 slowlog-max-len 128 # === 日志 === loglevel notice logfile "" # === 其他 === databases 16关键配置解释:
| 配置项 | 值 | 说明 |
|---|---|---|
bind 0.0.0.0 | 绑定所有网卡 | 容器内使用,让宿主机能访问。生产环境应限制为内网 IP |
protected-mode yes | 启用保护模式 | 无密码时只允许本地连接。配合requirepass使用更安全 |
requirepass redis123 | 密码 | 学习环境用简单密码,生产必须用强密码且定期轮换 |
appendfsync everysec | 每秒刷盘 | 性能和安全的折中——最多丢 1 秒数据 |
save 900 1 | 900 秒内至少 1 个 key 变化则触发 bgsave | RDB 自动触发条件 |
maxmemory 512mb | 最大内存 | 容器无法获取宿主机的真实内存限制,手动指定避免 OOM |
maxmemory-policy allkeys-lru | 淘汰策略 | 内存满时淘汰最近最少使用的 key |
slowlog-log-slower-than 10000 | 10 毫秒 | 超过此时长的命令记录到慢查询日志 |
loglevel notice | 日志级别 | 学习环境用 notice,生产调试时可用 verbose |
logfile "" | 空字符串 | 输出到 stdout,方便docker logs查看 |
3.3 编写 docker-compose.yml
version:"3.8"services:redis:image:redis:8.6container_name:redis-labrestart:unless-stoppedports:-"6379:6379"volumes:-./redis.conf:/usr/local/etc/redis/redis.conf:ro-./data:/datacommand:["redis-server","/usr/local/etc/redis/redis.conf"]healthcheck:test:["CMD","redis-cli","-a","redis123","ping"]interval:10stimeout:5sretries:3start_period:10snetworks:-redis-netredisinsight:image:redis/redisinsight:latestcontainer_name:redisinsight-labrestart:unless-stoppedports:-"5540:5540"volumes:-./redisinsight-data:/dbnetworks:-redis-netnetworks:redis-net:driver:bridge编排说明:
| 配置 | 说明 |
|---|---|
restart: unless-stopped | 容器异常退出时自动重启,除非手动 stop。学习环境防止误关后自动拉起 |
volumes中的:ro | redis.conf 以只读模式挂载,避免容器内误改 |
healthcheck | Docker 健康检查——每 10 秒发一次 PING,连接失败视为不健康 |
redisinsight-data目录 | RedisInsight 自己会管理连接配置,挂载到宿主机方便反复创建 |
networks | 两个容器在同一网络中,RedisInsight 用redis-lab:6379即可连接 |
3.4 启动并验证环境
# 启动所有服务(后台运行)dockercompose up-d# 查看容器状态dockercomposeps# 期望输出:# NAME STATUS PORTS# redis-lab Up (healthy) 0.0.0.0:6379->6379/tcp# redisinsight-lab Up 0.0.0.0:5540->5540/tcp# 查看 Redis 日志dockerlogs redis-lab--tail20# 观察健康检查状态dockerinspect redis-lab--format='{{json .State.Health}}'|ConvertFrom-Json|Select-Object Status3.5 使用 redis-cli 连接
带密码连接:
# 方式一:命令行指定密码dockerexec-itredis-lab redis-cli-aredis123# 方式二:先进入再认证dockerexec-itredis-lab redis-cli127.0.0.1:6379>AUTH redis123 OK# 方式三:通过环境变量(redis-cli 6.0+ 支持 --pass 等价 -a)dockerexec-itredis-lab redis-cli--passredis123执行第一组验证命令:
127.0.0.1:6379>PING PONG127.0.0.1:6379>SET lab:env"docker-compose-v1"OK127.0.0.1:6379>GET lab:env"docker-compose-v1"# 验证 AOF 已开启127.0.0.1:6379>CONFIG GET appendonly1)"appendonly"2)"yes"# 验证 maxmemory 配置127.0.0.1:6379>CONFIG GET maxmemory1)"maxmemory"2)"536870912"# 512 MB = 536870912 字节# 验证数据目录127.0.0.1:6379>CONFIG GETdir1)"dir"2)"/data"3.6 测试持久化:数据在重启后是否还在
# 写入一些测试数据dockerexecredis-lab redis-cli-aredis123 SET check:restore"before-restart"dockerexecredis-lab redis-cli-aredis123 SET check:counter42# 重启容器dockercompose restart redis# 等待 Redis 启动完成(healthcheck 通过)Start-Sleep-Seconds5# 读取之前的数据dockerexecredis-lab redis-cli-aredis123 GET check:restore# 期望输出: "before-restart"dockerexecredis-lab redis-cli-aredis123 GET check:counter# 期望输出: "42"如果返回(nil),说明 AOF 或 RDB 没有正确加载。检查日志:
dockerlogs redis-lab|Select-String-Pattern"DB loaded|AOF"3.7 配置 RedisInsight
浏览器打开:http://localhost:5540
添加 Redis 数据库:
- 点击 “Add Redis Database”。
- 填写连接信息:
- Host:
redis-lab(容器间通信使用 Compose 的 service name) - Port:
6379 - Database Alias:
本地学习环境 - Username:留空(暂未配置 ACL 多用户)
- Password:
redis123
- 点击 “Test Connection”,确认连接成功。
- 点击 “Add Redis Database”。
也可以在宿主机上使用不同方式连接:
| 连接来源 | Host | 说明 |
|---|---|---|
| RedisInsight 容器内 | redis-lab | Docker 内部 DNS 解析 service name |
| 宿主机浏览器 (RedisInsight UI) | host.docker.internal或localhost | 取决于 RedisInsight 是连接宿主机端口还是内部网络 |
推荐把 RedisInsight 和 Redis 放在同一个 Compose 网络中(本章就是这么做),这样 RedisInsight 直接通过 service nameredis-lab:6379连接,不走宿主机端口映射。
连接成功后,在 RedisInsight 中浏览:
- Browser:查看和搜索 key,支持按类型筛选。
- CLI:内置命令行,支持命令补全。
- Analysis→Memory Analyzer:查看内存使用分布。
- Analysis→Slow Log:查看慢查询记录和趋势。
3.8 使用 redis-benchmark 基础压测
# 在容器内执行压测dockerexec-itredis-lab redis-benchmark-aredis123-n100000-c50-tget,set-q# 输出示例:# SET: 82345.67 requests per second, p50=0.247 msec# GET: 86956.52 requests per second, p50=0.233 msec# 测试不同并发数下的表现dockerexec-itredis-lab redis-benchmark-aredis123-n100000-c10-tget-qdockerexec-itredis-lab redis-benchmark-aredis123-n100000-c100-tget-qdockerexec-itredis-lab redis-benchmark-aredis123-n100000-c200-tget-q# 带延迟分位数的压测dockerexec-itredis-lab redis-benchmark-aredis123-n100000-c50--csv预期现象:
- 低并发时(10-50),P50 延迟通常在 0.2-0.3ms。
- 高并发时(200+),延迟略微增加,主要瓶颈在客户端并发模型而非 Redis 本身。
- 如果 QPS 远低于预期(例如只有几万),检查是否在虚拟机中运行,或宿主机 CPU 资源不足。
3.9 常见坑与解决
坑1:端口冲突
# 现象Error starting userland proxy: listen tcp40.0.0.0:6379: bind: address alreadyinuse# 诊断netstat-ano|findstr :6379# 或Get-NetTCPConnection-LocalPort6379# 解决方式一:停止占用端口的进程taskkill /PID<PID>/F# 解决方式二:修改 docker-compose.yml 端口映射ports: -"6380:6379"# 宿主机 6380 → 容器 6379坑2:认证失败
# 现象 127.0.0.1:6379> GET foo (error) NOAUTH Authentication required. # 原因:连接时未提供密码 # 解决:AUTH redis123 # 现象 127.0.0.1:6379> AUTH wrongpassword (error) WRONGPASS invalid username-password pair or user is disabled. # 原因:密码不匹配 # 解决:检查 redis.conf 中 requirepass 的值坑3:数据卷挂载失败
# 检查挂载是否生效dockerinspect redis-lab--format='{{json .Mounts}}'|ConvertFrom-Json# 预期输出包含:# "Source": "/host_mnt/d/your/path/redis-lab/data"# "Destination": "/data"# 如果 Mounts 为空或路径不对,检查:# 1. docker-compose.yml 中是否使用了相对路径(相对于 compose 文件所在目录)# 2. Windows 路径中是否有中文或特殊字符# 3. Docker Desktop 的 Resources → File Sharing 是否包含实验目录坑4:容器内 AOF 写权限问题
# 现象:Redis 启动后日志显示# Can't open the append-only file: Permission denied# 诊断dockerexecredis-labls-la/data# 如果输出为空目录或权限显示 nobody:# 原因:Redis 容器内以 redis 用户(UID 999)运行,宿主机 data/ 目录权限不足# 解决:给 data 目录开放写权限(Windows 上通常不需要额外处理)# 如果问题持续,可以尝试删除 data 目录后重新创建Remove-Item-Recurse-Force.\datamkdirdatadockercompose down&&dockercompose up-d坑5:RedisInsight 连不上 Redis
常见原因排查: 1. Redis 是否在运行:docker compose ps 2. RedisInsight 的 Host 写对了吗: - 如果 RedisInsight 和 Redis 在同一个 docker-compose 网络 → Host 填 redis-lab - 如果从宿主机浏览器通过端口映射访问 → Host 填 localhost 或 宿主机 IP 3. 密码是否匹配 redis.conf 中的 requirepass 4. 防火墙是否拦截了 5540 或 6379 端口坑6:WSL2 内存占用过高
Docker Desktop 基于 WSL2,WSL2 默认会占用较多内存。可以限制:
在用户目录C:\Users\<用户名>\.wslconfig创建文件:
[wsl2] memory=4GB processors=2 swap=2GB然后重启 WSL:
wsl--shutdown3.10 环境清理与重建
当你需要"从头开始"时(比如实验把数据搞乱了):
# 停止并删除容器(数据卷保留)dockercompose down# 停止并删除容器 + 数据卷(彻底重置)dockercompose down-v# 清理持久化数据Remove-Item-Recurse-Force.\data\*mkdirdata# 重新启动dockercompose up-d4. 项目总结
4.1 交付物检查清单
| 交付物 | 验证方式 |
|---|---|
| docker-compose.yml 可正常启动 | docker compose up -d→docker compose ps显示 healthy |
| redis.conf 密码生效 | redis-cli无密码连接报 NOAUTH |
| AOF 持久化生效 | CONFIG GET appendonly返回 yes,/data/下有 appendonly.aof 文件 |
| 重启后数据保留 | 写入 key →docker compose restart→ 读取 key 成功 |
| RedisInsight 可连接 | 浏览器 http://localhost:5540,添加数据库连接成功 |
| redis-benchmark 可运行 | 输出 QPS 和延迟分位数 |
4.2 优点与缺点
| 方案特点 | 详细说明 |
|---|---|
| 优点1:版本可控 | 镜像redis:8.6固定版本,团队所有人启动后获得完全相同的 Redis 环境和能力 |
| 优点2:配置透明 | redis.conf集中管理所有配置,修改一处立即生效,方便团队 Code Review |
| 优点3:可销毁重建 | 实验环境玩坏了不需要手动修复,docker compose down -v && docker compose up -d即可恢复 |
| 优点4:可视化加持 | RedisInsight 让学习者直观看见内存分布、key 类型和慢查询趋势 |
| 优点5:扩展方便 | 后续加 Sentinel、Cluster、Prometheus 只需在 compose 文件加 service |
| 缺点1:Docker Desktop 较重 | 占用磁盘和内存,但对学习来说利大于弊 |
| 缺点2:网络模型有差异 | Docker 的网络抽象增加了一层复杂度,连接方式需要理解容器网络 |
| 缺点3:性能受限 | 容器内的 Redis 性能略低于裸金属(但学习场景完全够用) |
| 缺点4:WSL2 需要单独配置 | 内存和处理器限制需手动配置,否则可能占用过多资源 |
4.3 适用与不适用场景
适用场景:
- 本地学习和实验——后续 40 章全部基于此环境。
- 团队新成员培训——一份 compose 文件交给新人,10 分钟启动。
- 功能验证——需要快速验证某个命令或配置的效果。
- 故障演练——可以放心地制造崩溃、配置错误等场景。
- 中小规模 Demo 开发——作为临时 Redis 依赖。
不适用场景:
- 生产部署——需要 ACL、TLS、监控、备份、资源限制和高可用架构(将在第 29-31 章展开)。
- 高并发压测——容器网络和资源限制会影响真实 QPS,压测应在裸金属或 K8s 中进行。
- 需要直连 Windows 进程的场景——如果你的应用是 Windows 原生进程且不方便改网络配置,可能需要在 WSL2 中运行应用。
4.4 常见踩坑经验
| 案例 | 表象 | 根因 | 解法 |
|---|---|---|---|
| 团队新人启动失败 | docker compose up报错 “port already in use” | 本地已安装 MySQL 占用 6379 端口 | 修改 compose 端口映射为 6380:6379,环境文档注明 |
| AOF 文件把宿主机 C 盘写满 | 电脑变卡,发现data/目录下 AOF 文件超过 5GB | 开启了 appendonly 但没有配置 rewrite 阈值,学习环境的压测数据被全部记录 | 添加auto-aof-rewrite-min-size配置,定期清理 data 目录 |
| RedisIninsight 连不上 | 页面 “Connection refused” | 把 Host 写成 localhost,但 RedisInsight 在容器内,localhost 指向自己 | Host 使用 Compose service nameredis-lab |
| Windows 路径中文导致挂载失败 | 容器内/data为空 | Docker Desktop 对包含中文的路径处理有 bug | 把实验目录移到纯英文路径下,如 D:\projects\redis-lab |
| WSL2 内存占用过高 | 任务管理器显示 vmmem 进程占用 8GB | WSL2 默认不限制内存,Docker 未使用的内存也不会释放给宿主机 | 创建 .wslconfig 限制内存和处理器数量 |
4.5 思考题
环境题:如果有一天你需要把本章的 Docker Compose 环境从 Windows 迁移到 Linux 生产服务器,
docker-compose.yml和redis.conf中分别需要修改哪些配置?请至少列出 5 项。故障题:你在本地执行
docker compose up -d后,docker compose ps显示redis-lab状态是Up (unhealthy)。请列出从最快到最深的排查步骤(至少 4 步),最终定位根因并修复。
(答案提示将在下一章末尾给出。)
上一章思考题答案提示(第1章):
第1题:key 格式建议为
sms:daily:{userId}:{date},如sms:daily:1001:20260718。写入时执行INCR sms:daily:1001:20260718,如果是首次递增则配合EXPIRE设置到当天 23:59:59 的剩余秒数。过期策略:计算距离当天结束的剩余秒数作为 TTL,确保 key 在跨天后自动清除。第2题(至少 5 种根因):① 上游服务调用量骤降(业务侧问题);② 网络故障导致客户端无法连接到 Redis(但 connected_clients 显示旧连接未断开);③ 客户端连接池耗尽,新请求在客户端排队但未到达 Redis;④ Redis 主线程被慢命令阻塞(需看 slowlog);⑤ 客户端连接未减少但都处于 IDLE 状态——优先排查慢查询日志和延迟监控。
下一章预告:第3章——字符串 String 实战:验证码、计数器与分布式开关。
延伸阅读与资源
MongoDB 实战进阶与内核修炼
python入门:Rquests从菜鸟脚本到企业级SDK的网络实战圣经
Milvus向量数据库实战修炼:从 0 到 1精通向量检索与生产落地
后端工程师的 AI 转型第一课:Ollama 与私有化大模型实战
10倍开发者的 Dify 魔法书:从零构建全栈 AI 应用
后端工程师转型AI第一课-Ollama 与私有化大模型实战
大型语言模型(LLM) vLLM 高性能推理落地实战
Agent开发之LlamaIndex 实战修炼与源码进阶
大语言模型Transformers 实战修炼与源码剖析