Redis在python中,你如何关闭连接?

时间:2014-07-21 22:20:42

标签: python redis

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()

4 个答案:

答案 0 :(得分:21)

只需使用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%的案例。

答案 1 :(得分:12)

StrictRedis本身并不实现连接语义,而是使用连接池,该连接池可用作StrictRedis实例的属性:S.connection_pool。 connection_pool对象具有disconnect方法,可以在必要时强制立即断开池中的所有连接,但是当您的StrictRedis对象超出范围时,池中的各个连接都会自行清理而无需您的干预(请参阅redis的/ connection.py:392-396)

答案 2 :(得分:3)

使用Redis连接池。您无需显式关闭它。

import redis

pool = redis.ConnectionPool(host='localhost', port=6379, db=0)
r = redis.Redis(connection_pool=pool)

并且可以提高效率。

答案 3 :(得分:2)

在源代码中使用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)

最后,无论你做什么,每个连接都会释放到池中,并且它将分配给其他客户端。