问题来源redis
最近项目中用到tornado + mongodb + redis,以前写爬虫的时候用到过redis-py感受简单容易上手,结合tornado使用就出现了链接池中链接失效重连耗时过久的问题。mongodb
代码例子以下:socket
import timeide
import redistornado
redis_setting = dict(.net
host='127.0.0.1',blog
)文档
db = redis.Redis(connection_pool=redis.ConnectionPool(**redis_setting))get
def do_with_redis():it
now = time.time()
db.get('a')
print(time.time() - now)
def do_something():
do_with_redis() # 第一次查询
time.sleep(301) # do something other,一些业务逻辑
do_with_redis() # 第二次查询
do_something()
获得的结果是:
第一次查询耗时0.018s左右
第二次查询耗时20.018s左右
查看了官方文档说redis链接默认20s超时,关键代码是client.py中669行。
当链接池中的socket已经失效,等待20s s.recv()没有响应,就会抛出异常走到671行,重连继续运行。
解决方案1(不彻底)
把链接超时时间缩短,而后超时后断开重连
redis_setting = dict(
host='127.0.0.1',
socket_timeout=1,
socket_connect_timeout=1,
retry_on_timeout=True
)
可是这样仍是须要忍受1s的时间
解决方案2(推荐)
让socket链接保持心跳,维持链接状态。找了一堆的socket资料,再读一遍源代码,终于发现还能这样用。
redis_setting = dict(
host='127.0.0.1',
socket_keepalive=True,
socket_keepalive_options={socket.TCP_KEEPIDLE: 60, socket.TCP_KEEPINTVL: 30, socket.TCP_KEEPCNT: 3}
)
————————————————
版权声明:本文为CSDN博主「cau_eshao」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处连接及本声明。
原文连接:https://blog.csdn.net/dslkfajoaijfdoj/article/details/83692668