Redis.Client 初始化必须显式配置PoolSize和Timeout,否则裸连会导致压测卡死或i/o timeout;PoolSize按QPS×响应时间×1.5估算并向上取整,Timeout须设为有限值(如5s),MinIdleConns=PoolSize/2,MaxConnAge防NAT断连;所有调用必传context(如r.Context()衍生),禁用硬写Background/TOD0;redis.Nil需单独判断;全局复用单例Client,禁用手动Conn管理;Docker需确认端口映射与Addr可达;优先使用github.com/redis/go-redis/v9,注意v8/v9路径隔离与版本统一。

redis.Client 初始化必须配 PoolSize 和 Timeout
不设 PoolSize 和 Timeout 就等于裸连 Redis,线上一压测就卡死或报 read tcp 127.0.0.1:6379: i/o timeout。默认 PoolSize = 10、Timeout = 0(无限等待),根本扛不住并发或网络抖动。
-
PoolSize建议按公式粗估:QPS × 平均响应时间(秒)× 1.5,再向上取整到 16/32/64 等整数;例如 200 QPS × 0.04s × 1.5 ≈ 12 → 实际设 16 更稳妥 -
Timeout必须显式设(如5 * time.Second),否则 HTTP handler 里一个慢请求会拖住整个 goroutine -
MinIdleConns设为PoolSize / 2,避免冷启动后首次请求因建连慢而超时 - 别漏掉
MaxConnAge(如30 * time.Minute),否则 NAT 或防火墙可能静默断开长空闲连接
所有 Redis 调用必须传 context.Context
硬写 context.Background() 或 context.TODO() 是生产事故高发点。用户关浏览器、API 超时、K8s probe 失败时,没上下文控制的 Redis 请求还在后台跑,白占连接和资源。
- HTTP handler 中务必用
r.Context()衍生子 ctx:ctx, cancel := context.WithTimeout(r.Context(), 2*time.Second) - 调用前记得
defer cancel(),防止 ctx 泄露 - 若需重试,用
backoff库 +context.WithDeadline控制总耗时,别写 for 循环硬等 - 对
redis.Nil错误要单独判断,它不是真正的 error,而是语义上的“键不存在”
别碰 redis.Conn,全局只用一个 redis.Client 实例
老项目里残留的 redis.Dial()、手动 redis.Conn 管理,现在必须全删掉。这类写法极易导致连接泄露、超时堆积、panic 后连接不释放,压测时常见 too many open files。
-
redis.Client是线程安全的,内部自带连接池与自动重连,初始化一次即可全局复用 - 不要在每次操作前 new Conn 或调用
client.Dial()—— Client 自己取/还连接 -
client.Close()只需在进程退出前调一次(如defer rdb.Close()放在main()末尾) - 如果用 Docker 启 Redis,确认容器端口映射正确(如
-p 6379:6379),且Addr配的是宿主机可访问地址(本地开发用"localhost:6379",K8s 里得用 service 名)
v8 和 v9 导入路径别混用,优先选 github.com/redis/go-redis/v9
社区已逐步迁移到 github.com/redis/go-redis/v9(官方维护),旧的 github.com/go-redis/redis/v8 虽仍可用,但新特性(如更细粒度的哨兵通知、Redis Stack 支持)只在 v9 更新。
- 安装命令必须带版本号:
go get github.com/redis/go-redis/v9 - import 必须严格匹配:
import "github.com/redis/go-redis/v9",不能漏v9或错写成go-redis - v9 的
redis.Nil类型是error接口,判断方式仍是errors.Is(err, redis.Nil),但类型定义位置变了,混用会导致编译失败 - 若项目依赖了多个间接引用 v8/v9 的模块,用
go mod graph | grep redis检查冲突,必要时加replace统一版本
连接池参数、context 生命周期、Client 单例模式、v9 路径一致性——这四点任何一个没对齐,都会在高并发或网络波动时突然暴露问题,而且往往不是报错,而是缓慢、超时、连接耗尽这种难定位的症状。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











