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

相關文章
相關標籤/搜索