From 597e1cf840125bfa7fffcad289c6b727de156208 Mon Sep 17 00:00:00 2001 From: mayiming <1627832236@qq.com> Date: Fri, 12 Dec 2025 15:48:54 +0800 Subject: [PATCH] Add RedisClient implementation for managing Redis connections, including methods for connecting, closing, pinging, and checking connection status. --- redis.go | 88 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 88 insertions(+) create mode 100644 redis.go diff --git a/redis.go b/redis.go new file mode 100644 index 0000000..d831b86 --- /dev/null +++ b/redis.go @@ -0,0 +1,88 @@ +package reconnect + +import ( + "context" + "fmt" + "sync" + + "github.com/redis/go-redis/v9" +) + +// RedisClient Redis客户端包装器 +type RedisClient struct { + options *redis.Options + client *redis.Client + mu sync.RWMutex +} + +// NewRedisClient 创建新的Redis客户端 +func NewRedisClient(options *redis.Options) *RedisClient { + return &RedisClient{ + options: options, + } +} + +// Connect 建立Redis连接 +func (r *RedisClient) Connect(ctx context.Context) error { + r.mu.Lock() + defer r.mu.Unlock() + + if r.client != nil { + _ = r.client.Close() + } + + client := redis.NewClient(r.options) + if err := client.Ping(ctx).Err(); err != nil { + return fmt.Errorf("redis ping failed: %w", err) + } + + r.client = client + return nil +} + +// Close 关闭Redis连接 +func (r *RedisClient) Close() error { + r.mu.Lock() + defer r.mu.Unlock() + + if r.client != nil { + err := r.client.Close() + r.client = nil + return err + } + return nil +} + +// Ping 检查Redis连接是否健康 +func (r *RedisClient) Ping(ctx context.Context) error { + r.mu.RLock() + defer r.mu.RUnlock() + + if r.client == nil { + return fmt.Errorf("redis client is nil") + } + + return r.client.Ping(ctx).Err() +} + +// IsConnected 检查连接状态 +func (r *RedisClient) IsConnected() bool { + r.mu.RLock() + defer r.mu.RUnlock() + + return r.client != nil +} + +// GetClient 获取底层的Redis客户端 +func (r *RedisClient) GetClient() *redis.Client { + r.mu.RLock() + defer r.mu.RUnlock() + + return r.client +} + +// RedisManager 创建Redis重连管理器 +func RedisManager(options *redis.Options, config *Config) *Manager { + client := NewRedisClient(options) + return NewManager(client, config) +}