必须使用 redis.client 而非 redis.conn:client 线程安全、带连接池与自动重连;手动管理 conn 易致连接泄露、超时堆积;需配置 poolsize、timeout、minidleconns、maxconnage,并始终传入 context 控制生命周期。

Go 连接 Redis 用 redis.Client,别碰 redis.Conn
老项目里还能看到用 redis.Dial 或 redis.Conn 手动管理连接的写法,现在必须换掉。官方 github.com/go-redis/redis/v9 的 redis.Client 是线程安全、带连接池、自动重连的默认选择;手动维护 Conn 容易漏关连接、超时没处理、panic 后连接泄露。
常见错误现象:read tcp 127.0.0.1:6379: i/o timeout 频发,或压测时大量 too many open files —— 基本都是没走 Client 连接池,自己 new Conn 又不 Close。
- 初始化只做一次:
client := redis.NewClient(&redis.Options{Addr: "localhost:6379"}),全局复用 - 不要在每次操作前
client.Dial()或redis.Dial(),Client内部自动取/还连接 - 显式调用
client.Close()只需在进程退出前(比如defer client.Close()放在 main 函数末尾)
设置连接池和超时:不配 PoolSize 和 Timeout 就等于裸奔
默认 PoolSize = 10,Timeout = 0(无限等待),线上服务扛不住并发或网络抖动时,请求会卡死或堆积。Redis 操作不是 CPU 密集型,但阻塞在 I/O 上会拖垮整个 HTTP handler。
Go语言(Golang)1.26.0版本提供 Go 官方 Windows amd64 MSI 安装包下载入口,版本号 1.26.0,可用于旧项目维护、兼容性测试和指定版本开发环境配置。
-
PoolSize建议设为 QPS × 平均响应时间(秒)× 1.5,例如 100 QPS × 0.05s × 1.5 ≈ 8 → 实际设16更稳妥 -
Timeout必须设(比如5 * time.Second),否则网络延迟突增时 goroutine 全卡住 -
MinIdleConns可设为PoolSize / 2,避免冷启动后首次请求慢 - 别忽略
MaxConnAge(如30 * time.Minute),防止连接长期空闲被中间设备(NAT/防火墙)静默断开
ctx 传参不能省:没有上下文控制的 Redis 调用是定时炸弹
所有 client.Get()、client.Set() 等方法第一个参数都必须是 context.Context。不用 context.Background() 硬编码,尤其在 HTTP handler 里要用 r.Context() —— 否则用户关浏览器、API 超时、K8s readiness probe 失败,你的 Redis 请求还在后台跑着,浪费连接和资源。
- HTTP handler 中:用
ctx, cancel := context.WithTimeout(r.Context(), 2*time.Second),再传给client.Get(ctx, key) - 别用
context.TODO()占位,它只是临时兜底,不是生产选项 - 如果 Redis 操作本身要重试,用
backoff库 +context.WithDeadline控制总耗时,而不是靠 for 循环硬等
连接验证别只靠 Ping():得测读写通路
初始化 client 后调 client.Ping(ctx).Err() 只能说明“连得上”,不代表能读写。Redis 配了密码、ACL、只读从节点、或开启了 rename-command,Ping 成功但 Set 报 NOAUTH 或 READONLY 错误很常见。
- 启动时加一步真实写入验证:
client.Set(ctx, "health:startup", time.Now().Unix(), 1*time.Second).Err() - 检查返回 err 是否为
redis.Nil(key 不存在)、redis.Error(权限/语法错)、还是网络类 error(net.OpError) - K8s liveness probe 可复用这套逻辑,但记得设短超时(
500ms),避免 probe 卡住影响滚动更新
真正难的不是连上 Redis,而是让连接在故障、扩容、配置变更时依然稳定可用——所有配置项和 ctx 控制点,本质都是在给不确定性留退路。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!










