You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

重启电脑后Go应用无法连接Redis Docker容器问题排查

Go应用重启电脑后无法连接Redis容器:加载incr Lua脚本时触发panic(EOF)

问题描述

我的Go应用之前能正常连接Redis Docker容器达2周,重启电脑后突然出现连接异常。目前已确认以下信息:

  • 6379端口未被其他容器或进程占用
  • 通过CLI可以正常进入Redis容器执行setget等操作
  • 会话管理模块(基于github.com/rbcervilla/redisstore/v8)能正常连接Redis,但限流组件(基于github.com/ulule/limiter/v3/drivers/store/redis)在调用redisLimiter.NewStoreWithOptions时触发panic:failed to load incr lua script: EOF

环境与配置

Docker Redis容器状态

Docker Desktop显示Redis容器运行状态:

Configuration loaded;Running mode=standalone, port=6379.;Server initialized;Ready to accept connections

Redis配置文件(redis.conf)

bind 127.0.0.1
port 6379

Dockerfile

FROM redis:6.0.9
COPY redis.conf /usr/local/etc/redis/redis.conf
CMD [ "redis-server", "/usr/local/etc/redis/redis.conf" ]

相关Go代码片段

import (
    redisLimiter "github.com/ulule/limiter/v3/drivers/store/redis"
    redisSessions "github.com/rbcervilla/redisstore/v8"
    "github.com/go-redis/redis/v8"
    "github.com/ulule/limiter/v3"
    "github.com/gorilla/sessions"
    "log"
    "context"
)

// RedisLimiterInstance 包含限流用的Redis客户端和存储实例
type RedisLimiterInstance struct {
    Client redisLimiter.Client
    Store  limiter.Store
}

// RedisSessionInstance 包含会话用的Redis客户端和存储实例
type RedisSessionInstance struct {
    Client *redis.Client
    Store  *redisSessions.RedisStore
}

var redisLimiterInstance RedisLimiterInstance
var redisSessionInstance RedisSessionInstance

func connectToRedisLimiterDatabase() error {
    redisLimiterClient := redis.NewClient(&redis.Options{
        Addr:     "localhost:6379",
        Password: "", // 未设置密码
        DB:       0,  // 使用默认数据库
    })
    store, err := redisLimiter.NewStoreWithOptions(redisLimiterClient, limiter.StoreOptions{
        Prefix:   "rate_limiter_",
        MaxRetry: 3,
    })
    if err != nil {
        panic(err)
    } // 触发panic: failed to load incr lua script: EOF
    redisLimiterInstance = RedisLimiterInstance{
        Client: redisLimiterClient,
        Store:  store,
    }
    return nil
}

func connectToRedisSessionDatabase() error {
    redisSessionClient := redis.NewClient(&redis.Options{
        Addr:     "localhost:6379",
        Password: "", // 未设置密码
        DB:       0,  // 使用默认数据库
    })
    // 创建默认Redis存储实例
    store, err := redisSessions.NewRedisStore(context.Background(), redisSessionClient)
    if err != nil {
        log.Fatal("failed to create redis store: ", err)
    }
    store.KeyPrefix("session_")
    store.Options(sessions.Options{
        Path:     "/",
        MaxAge:   86400 * 7,
        HttpOnly: false,
    })
    redisSessionInstance = RedisSessionInstance{
        Client: redisSessionClient,
        Store:  store,
    }
    return nil
}

已尝试的排查步骤

  1. 多次重启Redis容器,问题未解决
  2. 验证端口占用:执行lsof -i :6379,仅Redis容器进程占用该端口
  3. 容器内CLI操作正常:通过docker exec -it <container-id> redis-cli进入容器,set test 123get test均可正常执行
  4. 确认Go依赖无变动:执行go mod tidy后没有新增或更新依赖包

恳请社区协助排查该问题的根本原因。

内容的提问来源于stack exchange,提问作者Steven

火山引擎 最新活动