client.go 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. package redisx
  2. import (
  3. "context"
  4. "fmt"
  5. "sync"
  6. "time"
  7. "github.com/redis/go-redis/v9"
  8. )
  9. // 统一初始化与连接管理(支持单机、哨兵、集群)
  10. var (
  11. client redis.UniversalClient
  12. once sync.Once
  13. )
  14. type Config struct {
  15. Mode string
  16. Addrs []string
  17. Username string
  18. Password string
  19. DB int
  20. MasterName string
  21. PoolSize int
  22. MinIdleConns int
  23. DialTimeout time.Duration
  24. ReadTimeout time.Duration
  25. WriteTimeout time.Duration
  26. }
  27. func Init(cfg *Config) {
  28. once.Do(func() {
  29. client = redis.NewUniversalClient(&redis.UniversalOptions{
  30. Addrs: cfg.Addrs,
  31. Username: cfg.Username,
  32. Password: cfg.Password,
  33. DB: cfg.DB,
  34. MasterName: cfg.MasterName,
  35. PoolSize: cfg.PoolSize,
  36. MinIdleConns: cfg.MinIdleConns,
  37. DialTimeout: cfg.DialTimeout,
  38. ReadTimeout: cfg.ReadTimeout,
  39. WriteTimeout: cfg.WriteTimeout,
  40. })
  41. ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
  42. defer cancel()
  43. if ping := client.Do(ctx, "PING"); ping.Err() != nil {
  44. fmt.Println(cfg.Addrs)
  45. errStr := fmt.Sprintf("Redis 无法访问: %s", ping.Err().Error())
  46. panic(errStr)
  47. }
  48. })
  49. }
  50. // getClient 获取 Redis 客户端
  51. func getClient() redis.UniversalClient {
  52. if client == nil {
  53. panic("redisx not initialized, call redisx.Init() first")
  54. }
  55. return client
  56. }
  57. // Close 关闭 Redis 连接
  58. func Close() error {
  59. if client != nil {
  60. return client.Close()
  61. }
  62. return nil
  63. }