package database import ( "context" "fmt" "github.com/go-redis/redis/v8" "log" "speech-nlu-parse/global" "time" ) var redisClient *redis.Client // 初始化 Redis 连接 func InitRedis() { redisClient = redis.NewClient(&redis.Options{ Addr: fmt.Sprintf("%s:%s", global.RedisSetting.Host, global.RedisSetting.Port), Username: global.RedisSetting.Username, Password: global.RedisSetting.Password, DB: global.RedisSetting.Dbname, PoolSize: 100, PoolTimeout: 2 * time.Second, }) if err := redisClient.Ping(context.Background()).Err(); err != nil { global.Logger.Errorf("Redis连接失败: %v", err) return } } // 更新会话(首次创建或续期) func UpdateSession(mac, sessionId string) { //, expiration time.Duration ctx := context.Background() key := getSessionKey(mac) //log.Println("更新会话") //log.Println(key, sessionId) // 直接设置键值并指定过期时间 err := redisClient.Set(ctx, key, sessionId, time.Minute*10).Err() if err != nil { global.Logger.Errorf("会话更新失败 (MAC: %s): %v", mac, err) } } func getSessionKey(mac string) string { return fmt.Sprintf("snp:rsid:%s:str", mac) } // GetSession 根据 MAC 地址查询对应的 sessionId func GetSession(mac string) (string, error) { ctx := context.Background() key := getSessionKey(mac) // 从 Redis 获取 sessionId sessionId, err := redisClient.Get(ctx, key).Result() if err != nil { if err == redis.Nil { // Key 不存在(不是错误,是正常情况) return "", nil } // 其他错误(如连接问题) global.Logger.Errorf("查询会话失败 (MAC: %s): %v", mac, err) return "", err } return sessionId, nil } // 获取会话并自动续期 func GetAndRefreshSession(mac string, expiration time.Duration) (string, bool) { ctx := context.Background() key := getSessionKey(mac) // 使用 Lua 脚本保证原子性:获取值 + 刷新过期时间 script := redis.NewScript(` local key = KEYS[1] local expire = tonumber(ARGV[1]) local value = redis.call("GET", key) if not value then return nil end redis.call("EXPIRE", key, expire) return value `) result, err := script.Run(ctx, redisClient, []string{key}, expiration.Seconds()).Result() if err != nil { if err == redis.Nil { return "", false } log.Printf("会话获取失败 (MAC: %s): %v", mac, err) return "", false } return result.(string), true }