建议: 在响应可以被清空时,避免在上下文超时时关闭池化连接
作者: jronak创建于 2026年5月8日更新于 2026年7月26日
□ 预期行为
当“ContextTimeout Enabled”启用且调用者上下文的最后期限已到期时,go-Redis应当能够返回`ctx.ERR ()'而不总是关闭基本的集合连接,只要连接能够安全地恢复到ResSP同步。
□ 当前的行为
上下文取消/死线错误作为不良连接错误处理. 如果通过上下文退出命令时,连接会被从池中移除并关闭.
这很安全,但对于Redis在TLS上却很昂贵,因为频繁的上下文最后期限会导致频繁的TCP/TLS重联.
□ 可能的解决方案
添加选入模式, 例如 :
开始 排出 Context Time出轨 内地时间 排出时间 。 会期
行为:
1. 在调用人上下文到期时,将`ctx.Err ()'还给调用人。
2.使接通出池.
3. 在限定的内部超时下,继续读取/丢弃未完成的Redis响应.
4. 如果排水成功,将连接到水池。
5. 如果排水失败或排出时间,应像今天那样关闭/取消连接。
□ 步骤重现
1. 使用带有 " 文字时间允许:真实 " 的go-Redis。
2. 通过TLS连接到Redis.
3. 在短的上下文截止日期内运行命令。
4. 观察暂停行动关闭集合连接并触发新的TLS握手。
□ 背景(环境)
- go-Redis 版本:v9/主
- Redis版本:Redis 7+
- 使用大小写:在荷载下使用简短的呼叫者最后期限
□ 详细描述
目标不是忽略呼叫取消. 面向用户的命令仍应以`文字'结尾。 已过期 " / " 内容 " 。 当呼叫者上下文到期时取消。
建议的更改只涉及已经写好的指令在那个点之后的连接会发生什么. 客户端与其立即关闭连接,不如在试图消耗并丢弃未完成的RESP回复时,让其他呼叫者无法使用该连接. 如果清理成功,连接可以被再利用;否则仍然应该关闭.
□ 可能的实现
对于成功写入的命令,在调用者上下文到期后使用内部超时读取响应. 仅在读取/排取成功时标记连接可重复使用 。
我有一个原型,并且可以打开 PR,如果这个方向是可以接受的.
内容来源: redis/go-redis