web-dev-qa-db-fra.com

Gérer la connexion à redis depuis Python

J'utilise redis-py dans mon python pour stocker des variables simples ou des listes de variables dans une base de données Redis, j'ai donc pensé qu'il serait préférable de créer une connexion au serveur redis à chaque fois que je dois enregistrer ou récupérer une variable car cela n'est pas fait très souvent et ne veut pas avoir une connexion permanente qui pourrait expirer.

En lisant certains didacticiels de base, j'ai créé les connexions à l'aide de la classe Redis, mais je n'ai pas trouvé de moyen de fermer la connexion, car c'est la première fois que j'utilise Redis. Je ne sais pas si j'utilise la meilleure approche pour gérer les connexions, je voudrais donc quelques conseils à ce sujet. Voici comment je setting ou getting une variable maintenant:

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)

J'utilise essentiellement ce code pour stocker le dernier temps de connexion ou pour obtenir une moyenne de demandes par seconde effectuées sur mon application et des trucs comme ça.

Merci pour vos conseils.

44
jeruki

Python utilise un mécanisme de compteur de référence pour traiter les objets, donc à la fin des blocs, l'objet my_server sera automatiquement détruit et la connexion fermée. Vous n'avez pas besoin de le fermer explicitement.

Ce n'est pas ainsi que vous êtes censé gérer les connexions Redis. La connexion/déconnexion pour chaque opération est trop coûteuse, il est donc préférable de maintenir la connexion ouverte. Avec redis-py cela peut être fait en déclarant un pool de connexions:

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)

Veuillez noter que la gestion du pool de connexions est principalement automatique et se fait dans redis-py.

71
Didier Spezia

@ sg1990 que faire si vous avez 10 000 utilisateurs nécessitant redis en même temps? Ils ne peuvent pas partager une seule connexion et vous venez de vous créer un goulot d'étranglement.

Avec un pool de connexions, vous pouvez créer un nombre arbitraire de connexions et utiliser simplement get_connection() et release(), à partir de redis-py docs .

Une connexion par utilisateur est une énorme exagération, car chaque connexion doit maintenir une socket ouverte. De cette façon, vous diminueriez automatiquement un certain nombre de utilisateurs WebSocket simultanés que votre machine peut gérer de moitié.

2
haren