简体   繁体   English

python中的Redis,如何关闭连接?

[英]Redis in python, how do you close the connection?

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

I know in ruby we use the quit() method.我知道在 ruby​​ 中我们使用了 quit() 方法。 I can't find anything here for python我在这里找不到任何关于 python 的东西

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

Just use redis.Redis .只需使用redis.Redis It uses a connection pool under the hood, so you don't have to worry about managing at that level.它在后台使用连接池,因此您不必担心在该级别进行管理。

If you absolutely have to use a low level connection, you need to do the response handling that is normally done for you by redis.Redis .如果您绝对必须使用低级连接,则需要执行通常由redis.Redis为您完成的响应处理。

Here's an example of executing a single command using the low level connection:以下是使用低级连接执行单个命令的示例:

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

Example usage:用法示例:

response = execute_low_level(
        'HGET', 'redis:key', 'hash:key', host='localhost', port=6379)

But as I said before, redis.Redis is the way to go in 99.9% of cases.但正如我之前所说,在 99.9% 的情况下, redis.Redisredis.Redis的方法。

StrictRedis doesn't implement connection semantics itself, instead it uses a connection pool, which is available as a property of a StrictRedis instance: S.connection_pool . StrictRedis 本身不实现连接语义,而是使用连接池,该池可用作 StrictRedis 实例的属性: S.connection_pool The connection_pool object has a disconnect method to force an immediate disconnect of all connections in the pool if necessary, however when your StrictRedis object goes out of scope, the individual connections in the pool all clean themselves up without your intervention (see redis/connection.py:392-396) connection_pool 对象有一个disconnect方法,可以在必要时强制立即断开池中的所有连接,但是当您的 StrictRedis 对象超出范围时,池中的各个连接都会在没有您干预的情况下自行清理(请参阅 redis/connection.json )。 py:392-396)

Use Redis connection pool.使用Redis连接池。 You don't need to explicitly close it.您不需要明确关闭它。

import redis

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

And can improve efficiency.并且可以提高效率。

you dont need worry about it when you use ConnectionPool.look at the source code:使用ConnectionPool时无需担心。查看源代码:

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)

finally,every connection will release to the pool no matter what you do, and it will assign to other client.最后,无论您做什么,每个连接都会释放到池中,并将分配给其他客户端。

@shangliuyan I read the pool.release() source code and I found the code as below: def release(self, connection): "Releases the connection back to the pool" self._checkpid() if connection.pid != self.pid: return self._in_use_connections.remove(connection) self._available_connections.append(connection) @shangliuyan我阅读了pool.release()源代码,发现以下代码: def release(self, connection): "Releases the connection back to the pool" self._checkpid() if connection.pid != self.pid: return self._in_use_connections.remove(connection) self._available_connections.append(connection)

and the _checkpid method as below: def _checkpid(self): if self.pid != os.getpid(): with self._check_lock: if self.pid == os.getpid(): # another thread already did the work while we waited # on the lock. return self.disconnect() self.reset() 以及_checkpid方法,如下所示: def _checkpid(self): if self.pid != os.getpid(): with self._check_lock: if self.pid == os.getpid(): # another thread already did the work while we waited # on the lock. return self.disconnect() self.reset() def _checkpid(self): if self.pid != os.getpid(): with self._check_lock: if self.pid == os.getpid(): # another thread already did the work while we waited # on the lock. return self.disconnect() self.reset() my question is, when the self.pid is equal to os.getpid or when the process was killed, how close the connection automatic? def _checkpid(self): if self.pid != os.getpid(): with self._check_lock: if self.pid == os.getpid(): # another thread already did the work while we waited # on the lock. return self.disconnect() self.reset()我的问题是,当self.pid等于os.getpid或进程被杀死时,如何自动关闭连接?

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM