2014-07-21 2 views
14

https://github.com/andymccurdy/redis-pyRedis Python에서 어떻게 연결을 닫으시겠습니까?

루비에서는 quit() 메소드를 사용합니다. 나는 파이썬 여기 아무것도 찾을 수 없습니다

파이썬 :

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

[소스 코드] (https://github.com/andymccurdy/redis-py/blob/master/redis/client.py)에서 볼 때, 'StrictRedis'는'close' 또는'quit'을 구현하지 않습니다. 행동 양식. – jonrsharpe

+0

우리가 연결을 닫지 않아도 괜찮습니까? 나는 redis에 대한 연결을 이해하지 못한다고 생각합니다. – nevermind

+0

@nevermind'r.client_kill'을 봅니다. 그러나 어떤 클라이언트를 죽일 지 알아 내려면 그것들을'r.client_list()'로 나열하십시오. '$ netstat | grep 6379' 나는 연결이 "폐쇄"상태에 있음을 알았다. 'r.execute_command ("QUIT")'도 있습니다. 그러나 나는 아직도 당신이 요구하는 것을 확신하지 못합니다. –

답변

11

그냥 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 %에 갈 수있는 방법입니다 케이스의.

11
StrictRedis 연결의 의미 자체를 구현하지 않습니다, 대신이로 사용할 수있는 연결 풀을 사용

StrictRedis 인스턴스의 속성 : S.connection_pool. connection_pool 객체는 disconnect 메서드를 사용하여 필요에 따라 풀의 모든 연결을 즉시 연결 해제하지만 StrictRedis 객체가 범위를 벗어나면 풀의 개별 연결은 모두 사용자 개입없이 스스로 정리합니다 (redis/connection 참조). py : 392-396)

+0

Strict로 가기로 결심했다면 연결에 대해 걱정할 필요가 있습니까? – nevermind

1

당신은 당신이 소스 코드를 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) 

마지막으로, 모든 연결에 상관없이 당신이 무엇 풀에 공개하지 않습니다, 그것은 다른 클라이언트에 할당 할 .

관련 문제