83 lines
2.0 KiB
Go
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)
|
|
}
|