2012-10-19 3 views
35

Sto usando redis-py nella mia applicazione python per memorizzare variabili semplici o elenchi di variabili in un database Redis, quindi ho pensato che sarebbe stato meglio creare una connessione al server redis ogni volta che ho bisogno di salva o recupera una variabile in quanto non viene eseguita molto spesso e non vuoi avere una connessione permanente che potrebbe scadere.Gestione della connessione a redis da Python

Leggere alcune esercitazioni di base Ho creato le connessioni utilizzando la classe Redis, ma non ho trovato un modo per chiudere la connessione, poiché è la prima volta che utilizzo Redis. Non sono sicuro se sto usando il miglior approccio per la gestione delle connessioni, quindi vorrei un consiglio per questo. Questo è come io sono set ting ting o get una variabile ora:

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) 

io fondamentalmente utilizzare questo codice per memorizzare l'ultimo tempo di connessione o per ottenere una media di richieste al secondo fatto per la mia app e cose del genere quella.

Grazie per il vostro consiglio.

risposta

54

Python utilizza un meccanismo di riferimento per gestire gli oggetti, quindi alla fine dei blocchi, l'oggetto my_server verrà automaticamente distrutto e la connessione chiusa. Non è necessario chiuderlo esplicitamente.

Ora questo non è il modo in cui si suppone di gestire le connessioni Redis. La connessione/disconnessione per ogni operazione è troppo costosa, quindi è molto meglio mantenere aperta la connessione. Con Redis-py può essere fatto dichiarando un pool di connessioni:

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) 

Si prega di notare gestione pool di connessioni è per lo più automatica e fatto entro Redis-py.

+0

grazie non lo sapevo, ma se creo il pool di connessione ho un metodo per chiuderlo in qualsiasi modo quando sono fuori da questo modulo o non è necessario? – jeruki

+2

Non necessario. Python chiuderà la connessione quando l'ultimo riferimento all'oggetto POOL sarà distrutto (qui alla fine dello script). –

+0

grazie mille questo è tutto quello che dovevo sapere – jeruki

2

@ sg1990 E se 10.000 utenti richiedessero redis allo stesso tempo? Non possono condividere una singola connessione e ti sei appena creato un collo di bottiglia.

Con un pool di connessioni è possibile creare un numero arbitrario di connessioni e utilizzare semplicemente get_connection() e release(), da redis-py docs.

Una connessione per utente è un enorme overkill, poiché ogni connessione deve mantenere un socket aperto. In questo modo diminuiresti automaticamente un numero di es. utenti di websocket concorrenti che la tua macchina può gestire della metà.

+0

Il pool di connessioni AFAIK viene creato automaticamente o lo si specifica esplicitamente o meno.Questo è vero per quello che posso vedere dalla fonte https://github.com/andymccurdy/redis-py/blob/master/redis/client.py#L493 –