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)

наконец, каждое соединение будет выпущено в пул независимо от того, что вы делаете, и оно будет назначено другому клиенту.