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:
@ -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)
|
||||
|
||||
@ -8,11 +8,12 @@ import (
|
||||
"metazone.cc/metalab/internal/repository"
|
||||
"metazone.cc/metalab/internal/service"
|
||||
|
||||
"github.com/redis/go-redis/v9"
|
||||
"gorm.io/gorm"
|
||||
)
|
||||
|
||||
func buildDeps(db *gorm.DB, cfg *config.Config, siteSettings *config.SiteSettings) *dependencies {
|
||||
userRepo, sessionMgr, authService, _, authCtrl, avatarSvc, authMdw, adminController := buildDepsCore(db, cfg, siteSettings)
|
||||
func buildDeps(db *gorm.DB, cfg *config.Config, siteSettings *config.SiteSettings, redisClient *redis.Client) *dependencies {
|
||||
userRepo, sessionMgr, authService, _, authCtrl, avatarSvc, authMdw, adminController := buildDepsCore(db, cfg, siteSettings, redisClient)
|
||||
|
||||
auditRepo := repository.NewAuditRepo(db)
|
||||
notificationRepo := repository.NewNotificationRepo(db)
|
||||
|
||||
@ -5,15 +5,16 @@ import (
|
||||
"metazone.cc/metalab/internal/middleware"
|
||||
|
||||
"github.com/gin-gonic/gin"
|
||||
"github.com/redis/go-redis/v9"
|
||||
"gorm.io/gorm"
|
||||
)
|
||||
|
||||
// Setup 注册所有路由
|
||||
func Setup(r *gin.Engine, db *gorm.DB, cfg *config.Config, siteSettings *config.SiteSettings) {
|
||||
func Setup(r *gin.Engine, db *gorm.DB, cfg *config.Config, siteSettings *config.SiteSettings, redisClient *redis.Client) {
|
||||
r.Use(middleware.SecurityHeaders())
|
||||
r.Use(middleware.InjectSiteInfo(siteSettings))
|
||||
|
||||
deps := buildDeps(db, cfg, siteSettings)
|
||||
deps := buildDeps(db, cfg, siteSettings, redisClient)
|
||||
|
||||
// 维护模式中间件(全局,在路由匹配之前)
|
||||
r.Use(deps.maintenanceMdw.Handler())
|
||||
|
||||
Reference in New Issue
Block a user