重启电脑后Go应用无法连接Redis Docker容器问题排查
Go应用重启电脑后无法连接Redis容器:加载incr Lua脚本时触发panic(EOF)
问题描述
我的Go应用之前能正常连接Redis Docker容器达2周,重启电脑后突然出现连接异常。目前已确认以下信息:
- 6379端口未被其他容器或进程占用
- 通过CLI可以正常进入Redis容器执行
set、get等操作 - 会话管理模块(基于
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 }
已尝试的排查步骤
- 多次重启Redis容器,问题未解决
- 验证端口占用:执行
lsof -i :6379,仅Redis容器进程占用该端口 - 容器内CLI操作正常:通过
docker exec -it <container-id> redis-cli进入容器,set test 123和get test均可正常执行 - 确认Go依赖无变动:执行
go mod tidy后没有新增或更新依赖包
恳请社区协助排查该问题的根本原因。
内容的提问来源于stack exchange,提问作者Steven




