2025-11-28 23:30:49 +08:00
|
|
|
|
package redis
|
|
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
|
"fmt"
|
2025-12-24 16:03:46 +08:00
|
|
|
|
"os"
|
2025-11-28 23:30:49 +08:00
|
|
|
|
|
2025-12-24 16:03:46 +08:00
|
|
|
|
"github.com/alicebob/miniredis/v2"
|
|
|
|
|
|
redis9 "github.com/redis/go-redis/v9"
|
2025-11-28 23:30:49 +08:00
|
|
|
|
"go.uber.org/zap"
|
|
|
|
|
|
)
|
|
|
|
|
|
|
2026-06-15 16:40:36 +08:00
|
|
|
|
// 本文件原包含基于 sync.Once 的全局单例(Init/GetClient/MustGetClient/Close)。
|
|
|
|
|
|
//
|
|
|
|
|
|
// 在 DI 迁移(阶段4)后,全局单例已被移除。Redis 客户端由 fx.Provide 构造
|
|
|
|
|
|
// (见 internal/app/infra_module.go 的 provideRedis,包含 miniredis 回退逻辑),
|
|
|
|
|
|
// 通过构造函数参数注入到各消费者。
|
|
|
|
|
|
//
|
|
|
|
|
|
// Redis 客户端构造逻辑见 redis.go 的 New()。
|
2025-11-28 23:30:49 +08:00
|
|
|
|
|
2026-06-15 16:40:36 +08:00
|
|
|
|
// AllowFallbackToMiniRedis 检查当前环境是否允许回退到 miniredis(仅开发/测试环境)。
|
|
|
|
|
|
func AllowFallbackToMiniRedis() bool {
|
2025-12-24 16:03:46 +08:00
|
|
|
|
env := os.Getenv("ENVIRONMENT")
|
|
|
|
|
|
return env == "development" || env == "test" || env == "dev" ||
|
|
|
|
|
|
os.Getenv("USE_MINIREDIS") == "true"
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-06-15 16:40:36 +08:00
|
|
|
|
// InitMiniRedis 初始化 miniredis(用于开发/测试环境的 DI 回退)。
|
|
|
|
|
|
func InitMiniRedis(logger *zap.Logger) (*Client, error) {
|
|
|
|
|
|
mr, err := miniredis.Run()
|
2025-12-24 16:03:46 +08:00
|
|
|
|
if err != nil {
|
|
|
|
|
|
return nil, fmt.Errorf("启动miniredis失败: %w", err)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
redisClient := redis9.NewClient(&redis9.Options{
|
2026-06-15 16:40:36 +08:00
|
|
|
|
Addr: mr.Addr(),
|
2025-12-24 16:03:46 +08:00
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
|
|
client := &Client{
|
|
|
|
|
|
Client: redisClient,
|
|
|
|
|
|
logger: logger,
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-06-15 16:40:36 +08:00
|
|
|
|
logger.Info("miniredis已启动", zap.String("addr", mr.Addr()))
|
2025-12-24 16:03:46 +08:00
|
|
|
|
return client, nil
|
|
|
|
|
|
}
|