DEBUG.WIKI
PanstarCloud:部署应用,接入 AI,云服务器与 AI 网关
雨云;给项目一台云服务器
IPPeak:从目标地区访问网页,住宅代理、SEO 监测、广告验证

redis-py 7.2.0 Unix socket 报连接没有 port 属性

redis-py 7.2.0 在观测记录中读取 Unix socket 不具备的端口属性,命令可能已执行。采用含修补的正式客户端,保留 socket 连接方式并核对写入状态。

使用 Unix socket 连接 Redis,认证没有问题,第一次 SET 或 GET 却报:

AttributeError: 'UnixDomainSocketConnection' object has no attribute 'port'

redis-py 7.2.0 存在这条客户端路径:命令执行后的观测记录直接读取连接的 host、port,而 Unix socket 连接没有 TCP 端口。报错中的 port 不表示 socket 路径写错,也不意味着必须把 Redis 改成监听 TCP。

命令可能已经发给 Redis

这次属性读取出现在命令调用及响应解析之后;异常处理分支又会读取同一类端口属性,可能叠出第二段 traceback。因此,调用方看到 AttributeError 时,服务端上的写操作可能已经完成。

对 SET、计数递增或队列写入,先用业务编号和原有查询方式确认状态,不要因为客户端抛异常就无条件重发。尤其是非幂等操作,重复提交可能比这次记录错误造成更大的影响。

核对执行请求的解释器中,Python 包 redis 是否为 7.2.0,并记录栈是否指向 redis/client.py 的 record_operation_duration 或 record_error_count。Redis 服务端版本和客户端版本要分开,更新服务端镜像无法替换 Python 环境中的这段代码。

使用已经处理可选连接属性的正式客户端

redis-py 7.2.1 的正式源码已把这些位置改成带缺省值的属性读取,例如连接没有 port 时取 None;当前正式 8.1.0 也保留了相应处理。

项目仍在 7.2 系列时,可优先评估包含该修补且满足现有依赖和支持要求的版本,按项目锁文件与部署流程更新实际运行环境。不要只根据问题被关闭或补丁合并就认定安装的 7.2.0 已经变化,也不必为了这一项修补直接跨多个主版本。

Unix socket 的路径、容器挂载、权限和认证继续使用原来的约定。若更新后变成文件不存在、PermissionError 或认证错误,那是需要分别解决的连接条件;不能再把它们当作同一个 port 属性问题。

不建议给连接对象硬塞 port=0,也不要为绕开这条异常打开对外 TCP 端口。前者修改了库内部对象和观测语义,后者扩大了服务暴露面,却没有修好原本需要的连接方式。

验收读取,也核对一次写入的实际次数

在隔离实例或获准的测试键空间,用已知字符串覆盖写入、读取、键不存在和预期认证失败等入口。正常路径应返回原有类型;失败路径应报告真实异常,而不是再次被 port 属性错误遮住。测试键名与值应独立于业务数据,并按原约定清理。

如果应用还用 pipeline、PubSub 或异步客户端,按各自实际入口单独验证,不能从一次同步 get() 成功推断所有路径都已恢复。对于升级前已经抛错的业务写入,保留并核对服务端状态;修补客户端不会撤销那些可能已经执行的命令。