Redis в python, как вы закрываете соединение?
https://github.com/andymccurdy/redis-py
Я знаю, что в ruby мы используем метод quit(). Я ничего не могу найти для python
питон:
import redis
r = redis.StrictRedis(host='localhost', port=6379, db=0)
r.set('foo', 'bar')
print r.get('foo')
#r.close() doesn't work
рубин
require "redis"
redis = Redis.new
redis.set("mykey", "hello world")
puts redis.get("mykey")
redis.quit()
Ответы
Ответ 1
Просто используйте redis.Redis
. Он использует пул соединений под капотом, поэтому вам не нужно беспокоиться об управлении на этом уровне.
Если вам абсолютно необходимо использовать соединение низкого уровня, вам нужно выполнить обработку ответа, которая обычно выполняется для вас с помощью redis.Redis
.
Здесь приведен пример выполнения одной команды с использованием соединения низкого уровня:
def execute_low_level(command, *args, **kwargs):
connection = redis.Connection(**kwargs)
try:
connection.connect()
connection.send_command(command, *args)
response = connection.read_response()
if command in redis.Redis.RESPONSE_CALLBACKS:
return redis.Redis.RESPONSE_CALLBACKS[command](response)
return response
finally:
del connection
Пример использования:
response = execute_low_level(
'HGET', 'redis:key', 'hash:key', host='localhost', port=6379)
Но, как я уже говорил, redis.Redis
- это путь в 99,9% случаев.
Ответ 2
StrictRedis сам не реализует семантику подключения, вместо этого он использует пул соединений, который доступен как свойство экземпляра StrictRedis: S.connection_pool
. Объект connection_pool имеет метод disconnect
для принудительного немедленного отключения всех подключений в пуле, если это необходимо, однако, когда объект StrictRedis выходит из области видимости, отдельные соединения в пуле очищаются без вашего вмешательства (см. Redis/connection.py:392-396)
Ответ 3
вам не нужно беспокоиться об этом, когда вы используете ConnectionPool.look в исходном коде:
def execute_command(self, *args, **options):
"Execute a command and return a parsed response"
pool = self.connection_pool
command_name = args[0]
connection = pool.get_connection(command_name, **options)
try:
connection.send_command(*args)
return self.parse_response(connection, command_name, **options)
except (ConnectionError, TimeoutError) as e:
connection.disconnect()
if not connection.retry_on_timeout and isinstance(e, TimeoutError):
raise
connection.send_command(*args)
return self.parse_response(connection, command_name, **options)
finally:
pool.release(connection)
наконец, каждое соединение будет выпущено в пул независимо от того, что вы делаете, и оно будет назначено другому клиенту.