1. 课程导入与平台全景

在开始写第一行代码之前,我们需要先建立一张“地图”。本课程要构建的不是一个简单的 Redis 缓存示例,而是一个面向真实业务的会话与实时状态平台:它要同时承载用户登录态、在线状态、设备心跳、消息未读计数、限流令牌、排行榜、分布式锁等高频读写数据,并在多实例、多机房、高并发条件下保持低延迟与一致性。Redis 之所以成为这类平台的核心,是因为它把“内存级读写速度”和“丰富的数据结构”结合在了一起,让会话与状态这类生命周期短、访问频繁、结构多样的数据有了天然归宿。

先看整体定位。传统做法把会话放在应用进程内存里,一旦扩容或重启就会丢失,多实例之间也无法共享;放进关系型数据库,又会因为每次请求都要读写磁盘而拖垮连接池。Redis 处在应用与持久化存储之间,扮演高速状态层的角色:应用把“当前这一刻必须快速读到、且允许按 TTL 自动过期”的数据交给 Redis,把“必须长期留存、可审计”的数据交给 MySQL 或对象存储。理解这条边界,是后续所有设计决策的起点。

会话与实时状态平台全景架构 接入层 Web / App 客户端 API 网关 负载均衡 / TLS 鉴权与限流前置 应用服务层 会话服务 登录态 / Token 状态服务 在线 / 心跳 计数与排行 未读 / 榜单 协调服务 锁 / 限流 / 幂等 Redis 高速状态层 String / Hash 会话对象、Token 用户属性缓存 Set / ZSet 在线集合、排行榜 去重与权重排序 Pub/Sub · Stream 实时事件分发 消息队列与回放 TTL · 过期策略 自动清理会话 惰性 + 定期删除 持久化与审计层 MySQL 用户与会话归档 Kafka 事件总线 对象存储 / 日志 请求 读写状态 异步落库

这张全景图自上而下分为四层。最上面是接入层,负责把用户请求安全地送进来;第二层是应用服务层,按职责拆成会话、状态、计数、协调四类服务;第三层是 Redis 高速状态层,用不同数据结构承载不同形态的状态;最下面是持久化与审计层,负责把需要长期保留的数据异步落库。箭头方向表示数据流向:请求自上而下进入,状态读写集中在 Redis 层,异步落库自 Redis 向持久层流动。理解这个分层,就能明白为什么 Redis 不是“可选项”,而是整个平台的性能枢纽。

关键模块与数据形态的对应关系

平台里每一类业务状态,几乎都能在 Redis 中找到最匹配的数据结构。会话对象通常是一个包含用户 ID、角色、登录时间、设备指纹的 Hash,键名形如 sess:{sessionId},并设置 1800 秒 TTL;在线状态用 Set 维护 online:users,配合每个用户的心跳键 hb:{userId} 设置 30 秒过期,过期即视为离线;未读计数用 Hash 的 HINCRBY 原子递增;排行榜用 ZSet 的 ZINCRBY 累加分数;分布式锁用 SET lock:order:{id} token NX PX 10000 实现。这些不是随意选择,而是由“读写频率、是否需要排序、是否需要原子计数、是否允许过期”四个维度共同决定的。

举个具体的会话写入例子。用户登录成功后,应用执行:

HSET sess:a1b2c3 uid 10086 role "vip" loginAt 1735689600 device "ios-15"
EXPIRE sess:a1b2c3 1800
SET hb:10086 1 EX 30

这三条命令分别完成:写入会话主体、设置 30 分钟过期、刷新心跳。后续每次请求携带 a1b2c3,应用先 EXISTS sess:a1b2c3 判断会话是否有效,再 HGETALL 取出用户信息。如果返回空,说明会话已过期,需要重新登录。这里的关键判断依据是:EXISTS 返回 1 表示会话有效,返回 0 表示已过期或不存在。心跳键则用于在线状态判断,EXISTS hb:10086 为 1 即在线。

学习路径与工程关注点

本课程后续会沿着“数据建模 → 读写路径 → 过期与淘汰 → 高可用与分片 → 一致性与并发 → 监控与排障”这条主线展开。每一章都会落到具体命令、参数和判断依据上,而不是停留在概念介绍。比如讲到过期策略时,会区分惰性删除与定期删除的触发条件;讲到分片时会讨论 Redis Cluster 的 16384 个槽位如何映射;讲到并发时会分析 WATCH 与 Lua 脚本在原子性上的差异。

学习建议:每学完一个模块,回到这张全景图,问自己三个问题——这个模块的数据放在哪一层?用了哪种数据结构?它的过期或一致性策略是什么?能回答清楚,说明你已经把知识点挂到了整体架构上。