fix: 修复管理页面活跃会话数始终显示为0的问题
问题原因:Redis Pipeline 执行 Lua 脚本时出现 NOSCRIPT 错误, 因为 redis.NewScript 使用 EVALSHA 执行脚本,当 Redis 重启或 脚本未被缓存时,Pipeline 模式无法自动回退到 EVAL。 解决方案:在 NewSessionLimitCache 初始化时预加载所有 Lua 脚本 到 Redis,确保后续 Pipeline 执行时脚本已被缓存。
This commit is contained in:
@@ -3,6 +3,7 @@ package repository
|
|||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"log"
|
||||||
"strconv"
|
"strconv"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
@@ -153,6 +154,21 @@ func NewSessionLimitCache(rdb *redis.Client, defaultIdleTimeoutMinutes int) serv
|
|||||||
if defaultIdleTimeoutMinutes <= 0 {
|
if defaultIdleTimeoutMinutes <= 0 {
|
||||||
defaultIdleTimeoutMinutes = 5 // 默认 5 分钟
|
defaultIdleTimeoutMinutes = 5 // 默认 5 分钟
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 预加载 Lua 脚本到 Redis,避免 Pipeline 中出现 NOSCRIPT 错误
|
||||||
|
ctx := context.Background()
|
||||||
|
scripts := []*redis.Script{
|
||||||
|
registerSessionScript,
|
||||||
|
refreshSessionScript,
|
||||||
|
getActiveSessionCountScript,
|
||||||
|
isSessionActiveScript,
|
||||||
|
}
|
||||||
|
for _, script := range scripts {
|
||||||
|
if err := script.Load(ctx, rdb).Err(); err != nil {
|
||||||
|
log.Printf("[SessionLimitCache] Failed to preload Lua script: %v", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return &sessionLimitCache{
|
return &sessionLimitCache{
|
||||||
rdb: rdb,
|
rdb: rdb,
|
||||||
defaultIdleTimeout: time.Duration(defaultIdleTimeoutMinutes) * time.Minute,
|
defaultIdleTimeout: time.Duration(defaultIdleTimeoutMinutes) * time.Minute,
|
||||||
|
|||||||
Reference in New Issue
Block a user