Add RedisClient implementation for managing Redis connections, including methods for connecting, closing, pinging, and checking connection status.
This commit is contained in:
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