会话存储迁移:Redis → Postgres
由 Claude Code 生成 · 2026-09-28 · 待审阅
背景
会话数据现在放在单实例 Redis 里,没有开持久化。上周两次重启,各丢了约 4 万个登录态。本计划把会话移到现有的 Postgres 集群,Redis 只留作读缓存。
方案对比
| 方案 | 持久化 | 读延迟 P95 | 改动量 |
|---|---|---|---|
| A:开启 Redis AOF | 秒级 | 0.8 ms | 小 |
| B:迁到 Postgres | 事务级 | 2.4 ms | 中 |
| C:B + Redis 读缓存 | 事务级 | 0.9 ms | 中 |
建议选 C:持久化与 B 相同,读延迟接近现状。
迁移步骤
- 建表
sessions,按user_id建索引 - 双写:新会话同时写入 Redis 和 Postgres
- 回填存量会话(约 120 万条)
- 读路径切到 Postgres,Redis 降为缓存
- 观察 7 天,再去掉对 Redis 持久化的依赖
数据流
回填脚本
-- 只回填未过期的会话
INSERT INTO sessions (id, user_id, data, expires_at)
SELECT id, user_id, data, expires_at
FROM staging_sessions
WHERE expires_at > now()
ON CONFLICT (id) DO NOTHING;
风险
警告WARNING
回填期间如果双写冲突,以 Postgres 为准。回填开始前,先冻结会话结构的变更。
回滚
读路径由开关 SESSION_READ_FROM_PG 控制。关掉开关就回到 Redis,不需要重新部署。