web-dev-qa-db-ja.com

PythonのRedis、接続をどのように閉じますか?

https://github.com/andymccurdy/redis-py

Rubyでquit()メソッドを使用していることを知っています。Pythonについては何も見つかりません。

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

Ruby

require "redis"
redis = Redis.new
redis.set("mykey", "hello world")
puts redis.get("mykey")
redis.quit()
24
user1781626

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%のケースで対処する方法です。

23
manadart

StrictRedisは接続セマンティクス自体を実装せず、代わりにStrictRedisインスタンスのプロパティとして使用可能な接続プールを使用します:S.connection_pool。 connection_poolオブジェクトにはdisconnectメソッドがあり、必要に応じてプール内のすべての接続を即座に切断しますが、StrictRedisオブジェクトが範囲外になると、プール内の個々の接続はすべてユーザーの介入なしにクリーンアップされます( redis/connection.py:392-396を参照)

12
sirlark

Redis接続プールを使用します。明示的に閉じる必要はありません。

import redis

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

そして効率を改善できます。

3
Lynn Han

ソースコードで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)

最後に、あなたが何をしても、すべての接続がプールに解放され、他のクライアントに割り当てられます。

2
shangliuyan