問題來源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