feat: FallbackStore 恢复时静默迁移内存会话到 Redis

- MemoryStore 新增 Snapshot() 返回活跃会话副本
- Redis 恢复时自动将降级期间的内存会话 Pipeline 写入 Redis
- 迁移成功后再切换 healthy 标记,用户无需重新登录
- 迁移失败则保持内存模式,避免切到空的 Redis 再被迫降级
This commit is contained in:
2026-05-31 11:46:50 +08:00
parent 12de8be0cf
commit 37c83d4c12
2 changed files with 75 additions and 10 deletions

View File

@ -211,3 +211,23 @@ func (ms *MemoryStore) Metrics() StoreMetrics {
ActiveCount: count,
}
}
// Snapshot 返回所有活跃会话的副本(用于 Redis 恢复时迁移)
func (ms *MemoryStore) Snapshot() []*Session {
ms.mu.RLock()
defer ms.mu.RUnlock()
var active []*Session
for _, s := range ms.sessions {
timeout := ms.idleTimeout
if s.RememberMe {
timeout = ms.rememberTimeout
}
if !s.IsExpired(timeout) {
// 返回副本,避免外部修改内部 map
copyS := *s
active = append(active, &copyS)
}
}
return active
}