Files
2026-04-20 18:26:54 +08:00

83 lines
2.0 KiB
Go

// Package redis 提供 Redis 数据库连接和管理功能。
// 支持 Unix Socket 和 TCP 两种连接方式。
// 注意:此包作为纯内存缓存使用,不开启持久化。
package redis
import (
"context"
"fmt"
"log"
"time"
"github.com/redis/go-redis/v9"
"sese-engine/config"
)
// Client 是 Redis 客户端连接
var Client *redis.Client
// Open 初始化 Redis 连接
// 根据配置自动选择 Unix Socket 或 TCP 连接
// 注意:不开持久化,作为纯内存缓存使用
func Open() error {
cfg := config.Global.Redis
opt := &redis.Options{
Addr: config.RedisAddr(),
Password: config.RedisPassword(),
DB: config.RedisDB(),
PoolSize: config.RedisPoolSize(),
MinIdleConns: config.RedisMinIdleConns(),
ReadTimeout: time.Duration(config.RedisReadTimeout()) * time.Millisecond,
WriteTimeout: time.Duration(config.RedisWriteTimeout()) * time.Millisecond,
// 禁用持久化 - 作为纯内存缓存
// 不设置任何 save 策略即可禁用 RDB
}
client := redis.NewClient(opt)
Client = client
// 验证连接
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
if err := client.Ping(ctx).Err(); err != nil {
return fmt.Errorf("redis.Ping: %w", err)
}
log.Printf("[redis] connected via %s (DB=%d)", formatAddr(opt), cfg.DB)
return nil
}
// Close 关闭 Redis 连接
func Close() error {
if Client != nil {
return Client.Close()
}
return nil
}
// Ping 检查 Redis 连接是否正常
func Ping() error {
if Client == nil {
return fmt.Errorf("redis not initialized")
}
return Client.Ping(context.Background()).Err()
}
// FlushDB 清空当前数据库(谨慎使用,仅用于测试或重置)
func FlushDB() error {
if Client == nil {
return fmt.Errorf("redis not initialized")
}
return Client.FlushDB(context.Background()).Err()
}
// formatAddr 格式化地址用于日志
func formatAddr(opt *redis.Options) string {
if opt.Addr != "" {
return opt.Addr
}
return fmt.Sprintf("%s:%d", opt.Addr, 6379)
}