2012-10-19 11 views
35

Używam redis-py w mojej aplikacji Pythona do przechowywania prostych zmiennych lub list zmiennych w bazie danych Redis, więc pomyślałem, że byłoby lepiej utworzyć połączenie z serwerem Redis za każdym razem, gdy potrzebuję zapisz lub pobierz zmienną, ponieważ nie jest to wykonywane zbyt często i nie chcesz mieć stałego połączenia, które może przekroczyć limit czasu.Zarządzanie połączeniem z Redis z Python

Przeglądając kilka podstawowych samouczków, utworzyłem połączenia za pomocą klasy Redis, ale nie znalazłem sposobu na zamknięcie połączenia, ponieważ po raz pierwszy używam Redis. Nie jestem pewien, czy używam najlepszego podejścia do zarządzania połączeniami, więc chciałbym poradzić sobie z tym. ten sposób jestem set ting ting lub get zmienna teraz:

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) 

I w zasadzie użyć tego kodu do przechowywania czasu ostatniego połączenia lub uzyskać średnio żądań na sekundę wyrządzone mojej aplikacji i takie że.

Dzięki za porady.

Odpowiedz

54

Python używa mechanizmu licznika odniesienia do obsługi obiektów, więc na końcu bloków obiekt my_server zostanie automatycznie zniszczony, a połączenie zamknięte. Nie musisz tego wyraźnie zamykać.

To nie jest sposób zarządzania połączeniami Redis. Podłączanie/odłączanie dla każdej operacji jest zbyt kosztowne, więc znacznie lepiej jest utrzymać otwarte połączenie. Z Redis-Py można to zrobić deklarując pulę połączeń:

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) 

Uwaga Połączenie zarządzanie Basen jest głównie zautomatyzowane i wykonane w ciągu Redis-Py.

+0

dzięki nie wiedziałem o tym, ale jeśli utworzyć pulę połączeń czy mam metodę, aby zamknąć go w dowolny sposób, gdy jestem z tego modułu lub nie jest to konieczne? – jeruki

+2

Niepotrzebne. Python zamknie połączenie, gdy ostatnia referencja do obiektu POOL zostanie zniszczona (tutaj na końcu skryptu). –

+0

dziękuję bardzo to wszystko, co musiałem wiedzieć – jeruki

2

@ sg1990 co, jeśli masz 10.000 użytkowników, którzy wymagają redizji w tym samym czasie? Nie mogą udostępnić jednego połączenia, a Ty sam stworzyłeś wąskie gardło.

Dzięki puli połączeń można utworzyć dowolną liczbę połączeń i po prostu użyć get_connection() i release(), z redis-py docs.

Połączenie dla jednego użytkownika to ogromny przeskok, ponieważ każde połączenie musi utrzymywać otwarte gniazdo. W ten sposób automatycznie zmniejszysz liczbę np. współbieżni użytkownicy sieci Web, których Twoja maszyna może obsłużyć o połowę.

+0

Pula połączeń AFAIK jest tworzona automatycznie albo jawnie, albo nie.Dotyczy to tego, co widzę ze źródła https://github.com/andymccurdy/redis-py/blob/master/redis/client.py#L493 –