2012-10-19 81 views
35

我在我的python應用程序中使用redis-py在Redis數據庫中存儲簡單變量或變量列表,所以我認爲最好每次需要時創建一個到redis服務器的連接保存或檢索變量,因爲這不是經常進行的操作,並且不希望有可能超時的永久連接。從Python管理與redis的連接

通讀一些基本教程我使用Redis類創建了連接,但沒有找到關閉連接的方法,因爲這是我第一次使用Redis。我不確定我是否正在使用最佳方法來管理連接,所以我想爲此提供一些建議。 這是我是如何set亭或get婷現在的變量:

import redis 

def getVariable(variable_name): 
    my_server = redis.Redis("10.0.0.1") 
    response = my_server.get(variable_name) 
    return response 

def setVariable(variable_name, variable_value): 
    my_server = redis.Redis("10.0.0.1") 
    my_server.set(variable_name, variable_value) 

我基本上使用此代碼來存儲最終連接時間或獲得每秒請求的平均做我的應用程序和類似的東西那。

感謝您的建議。

回答

54

Python使用引用計數器機制來處理對象,因此在塊的末尾,my_server對象將自動銷燬並關閉連接。你不需要明確地關閉它。

現在,您不應該如何管理Redis連接。每個操作的連接/斷開過於昂貴,所以維護連接打開要好得多。隨着Redis的-PY它可以通過聲明的連接池來實現:

import redis 

POOL = redis.ConnectionPool(host='10.0.0.1', port=6379, db=0) 

def getVariable(variable_name): 
    my_server = redis.Redis(connection_pool=POOL) 
    response = my_server.get(variable_name) 
    return response 

def setVariable(variable_name, variable_value): 
    my_server = redis.Redis(connection_pool=POOL) 
    my_server.set(variable_name, variable_value) 

請注意連接池管理主要是自動的,Redis的-PY內完成。

+0

謝謝我不知道這一點,但如果我創建連接池我有一種方法來關閉它,當我離開這個模塊或任何它不是必要的任何方式嗎? – jeruki

+2

沒有必要。當對POOL對象的最後一個引用將被銷燬時(這裏在腳本的末尾),Python將關閉連接。 –

+0

非常感謝你這就是我需要知道的 – jeruki

2

@ sg1990如果您有10.000個用戶同時需要redis,該怎麼辦?他們不能共享一個連接,並且你剛剛創建了一個瓶頸。

通過一個連接池,您可以創建任意數量的連接,只需使用get_connection()release(),從redis-py docs即可。

每個用戶的連接是一個巨大的矯枉過正,因爲每個連接都需要維護一個開放的套接字。這樣你會自動減少一些例如併發websocket用戶,你的機器可以處理一半。

+0

AFAIK連接池是自動創建的,無論您是否明確指定它。對於我可以從源https://github.com/andymccurdy/redis-py/blob/master/redis/client.py#L493中看到的情況 –