reconnect-mym #1
88
redis.go
Normal file
88
redis.go
Normal file
@@ -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)
|
||||
}
|
||||
Reference in New Issue
Block a user