redis链接池优化

问题来源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

相关文章
相关标签/搜索