Session 儲存遷移:Redis → Postgres
由 Claude Code 產生 · 2026-09-28 · 待審閱
背景
Session 資料目前存放在單一 Redis 執行個體中,且未開啟持久化。上週兩次重新啟動,各遺失約 4 萬筆登入狀態。本計畫將 Session 移至現有的 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建立索引 - 雙寫:新的 Session 同時寫入 Redis 和 Postgres
- 回填既有 Session(約 120 萬筆)
- 讀取改走 Postgres,Redis 降為快取
- 觀察 7 天,再移除對 Redis 持久化的依賴
資料流
回填指令碼
-- 只回填未過期的 Session
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 結構的變更。
回滾
讀取路徑由 SESSION_READ_FROM_PG 開關控制。關閉開關即退回 Redis,不需要重新部署。