redis.go 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. package repository
  2. import (
  3. "crypto/tls"
  4. "time"
  5. "github.com/Wei-Shaw/sub2api/internal/config"
  6. "github.com/redis/go-redis/v9"
  7. )
  8. // InitRedis 初始化 Redis 客户端
  9. //
  10. // 性能优化说明:
  11. // 原实现使用 go-redis 默认配置,未设置连接池和超时参数:
  12. // 1. 默认连接池大小可能不足以支撑高并发
  13. // 2. 无超时控制可能导致慢操作阻塞
  14. //
  15. // 新实现支持可配置的连接池和超时参数:
  16. // 1. PoolSize: 控制最大并发连接数(默认 128)
  17. // 2. MinIdleConns: 保持最小空闲连接,减少冷启动延迟(默认 10)
  18. // 3. DialTimeout/ReadTimeout/WriteTimeout: 精确控制各阶段超时
  19. func InitRedis(cfg *config.Config) *redis.Client {
  20. client := redis.NewClient(buildRedisOptions(cfg))
  21. if cfg.Server.EnableServerTiming {
  22. client.AddHook(serverTimingRedisHook{})
  23. }
  24. return client
  25. }
  26. // buildRedisOptions 构建 Redis 连接选项
  27. // 从配置文件读取连接池和超时参数,支持生产环境调优
  28. func buildRedisOptions(cfg *config.Config) *redis.Options {
  29. opts := &redis.Options{
  30. Addr: cfg.Redis.Address(),
  31. Username: cfg.Redis.Username,
  32. Password: cfg.Redis.Password,
  33. DB: cfg.Redis.DB,
  34. DialTimeout: time.Duration(cfg.Redis.DialTimeoutSeconds) * time.Second, // 建连超时
  35. ReadTimeout: time.Duration(cfg.Redis.ReadTimeoutSeconds) * time.Second, // 读取超时
  36. WriteTimeout: time.Duration(cfg.Redis.WriteTimeoutSeconds) * time.Second, // 写入超时
  37. PoolSize: cfg.Redis.PoolSize, // 连接池大小
  38. MinIdleConns: cfg.Redis.MinIdleConns, // 最小空闲连接
  39. }
  40. if cfg.Redis.EnableTLS {
  41. opts.TLSConfig = &tls.Config{
  42. MinVersion: tls.VersionTLS12,
  43. ServerName: cfg.Redis.Host,
  44. }
  45. }
  46. return opts
  47. }