feat: 实现 Redis 会话存储,支持内存/Redis 双模式自动切换

- 新增 go-redis/v9 依赖
- 新增 config.yaml redis 配置段 + RedisConfig 结构体 + REDIS_PASSWORD 环境变量覆盖
- 新增 common/redis.go Redis 客户端初始化
- 完整实现 session/redis_store.go,实现 Store 接口全部 7 个方法
- Redis TTL 自动过期,无须后台清理 goroutine
- deps_core.go 根据 cfg.Redis.Enabled 自动选择 RedisStore/MemoryStore
- router.go + main.go 透传 redisClient 参数
This commit is contained in:
2026-05-31 11:24:39 +08:00
parent 55c408d86c
commit d6d03a7c3c
11 changed files with 332 additions and 41 deletions

View File

@ -1,6 +1,7 @@
package router
import (
"log"
"time"
"metazone.cc/metalab/internal/config"
@ -11,6 +12,7 @@ import (
"metazone.cc/metalab/internal/service"
"metazone.cc/metalab/internal/session"
"github.com/redis/go-redis/v9"
"gorm.io/gorm"
)
@ -29,20 +31,29 @@ type dependencies struct {
siteSettingCtrl *adminCtrl.SiteSettingController
}
func buildDepsCore(db *gorm.DB, cfg *config.Config, siteSettings *config.SiteSettings) (
func buildDepsCore(db *gorm.DB, cfg *config.Config, siteSettings *config.SiteSettings, redisClient *redis.Client) (
*repository.UserRepo, *session.Manager, *service.AuthService,
*middleware.RateLimiter, *controller.AuthController,
*service.AvatarService, *middleware.AuthMiddleware, *adminCtrl.AdminController,
) {
userRepo := repository.NewUserRepo(db)
// Session 存储:内存模式(后续可切换为 RedisStore
sessionStore := session.NewMemoryStore(
time.Duration(cfg.Session.IdleTimeout)*time.Minute,
time.Duration(cfg.Session.RememberTimeout)*time.Minute,
)
// 启动后台过期清理 goroutine
sessionStore.StartCleanup(time.Duration(cfg.Session.CleanupInterval) * time.Second)
idleTimeout := time.Duration(cfg.Session.IdleTimeout) * time.Minute
rememberTimeout := time.Duration(cfg.Session.RememberTimeout) * time.Minute
var sessionStore session.Store
if cfg.Redis.Enabled && redisClient != nil {
// Redis 模式(生产环境推荐)
sessionStore = session.NewRedisStore(redisClient, idleTimeout, rememberTimeout)
log.Println("[Router] 会话存储: Redis")
} else {
// 内存模式(开发/单实例)
memStore := session.NewMemoryStore(idleTimeout, rememberTimeout)
memStore.StartCleanup(time.Duration(cfg.Session.CleanupInterval) * time.Second)
sessionStore = memStore
log.Println("[Router] 会话存储: 内存")
}
sessionMgr := session.NewManager(sessionStore, userRepo, cfg)
authService := service.NewAuthService(userRepo, sessionMgr, cfg, siteSettings)