redis-py设置socket超时参数后未触发连接超时是什么原因
问题核心原因
你遇到的阻塞问题核心是两个原因:
- redis-py的
StrictRedis是懒加载连接设计:实例化阶段不会真实发起TCP连接,只有第一次执行set这类数据操作时才会建连,所以日志会走到Setting key后才进入连接逻辑,这是符合设计的。 - 你没有关闭redis-py默认的重试机制:默认配置下redis-py会对连接失败、超时等异常进行多次重试,你设置的5秒是单次连接/操作的超时阈值,多次重试累加后总等待时间会远超过5秒,看起来就像持续阻塞。
修复方案
根据你使用的redis-py版本调整初始化参数即可:
1. redis-py 4.x及以上版本
需要显式传入无重试的重试策略:
from redis import StrictRedis from redis.retry import Retry from redis.backoff import NoBackoff print('Connecting') redis_instance = StrictRedis( host=settings.REDIS_HOST, port=settings.REDIS_PORT, db=settings.REDIS_DB, socket_connect_timeout=5, socket_timeout=5, # 关闭重试逻辑 retry=Retry(NoBackoff(), retries=0) ) print('Setting key') redis_instance.set('X','Y') print('Key SET')
2. redis-py 3.x及以下版本
直接设置max_retries=0关闭重试即可:
from redis import StrictRedis print('Connecting') redis_instance = StrictRedis( host=settings.REDIS_HOST, port=settings.REDIS_PORT, db=settings.REDIS_DB, socket_connect_timeout=5, socket_timeout=5, # 关闭重试逻辑 max_retries=0 ) print('Setting key') redis_instance.set('X','Y') print('Key SET')
额外可选适配
如果修改后还是存在超时不生效的情况,可以额外增加connect_timeout=5参数兼容部分低版本redis-py的参数识别问题。
内容的提问来源于stack exchange,提问作者Walucas
相关产品推荐
相关产品推荐

